From 6a3034135e6eb525e59ab41c24c0561a49bc954b Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Wed, 14 Oct 2026 13:06:03 +0530 Subject: [PATCH 01/13] SK-3175 try internal release --- flowvault/src/main/java/com/skyflow/VaultClient.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/flowvault/src/main/java/com/skyflow/VaultClient.java b/flowvault/src/main/java/com/skyflow/VaultClient.java index 93a677e0..8a7264c9 100644 --- a/flowvault/src/main/java/com/skyflow/VaultClient.java +++ b/flowvault/src/main/java/com/skyflow/VaultClient.java @@ -1,5 +1,7 @@ package com.skyflow; +import java.util.concurrent.TimeUnit; + import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; import com.skyflow.errors.SkyflowException; @@ -9,8 +11,6 @@ import com.skyflow.utils.SkyflowRetryInterceptor; import com.skyflow.utils.Utils; -import java.util.concurrent.TimeUnit; - import okhttp3.ConnectionPool; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -63,6 +63,7 @@ private static int resolveInt(Integer vaultLevel, Integer clientLevel, int defau if (vaultLevel != null) { return vaultLevel; } + return clientLevel != null ? clientLevel : defaultValue; } From 16de996bb54a84f0994ac07b99d7e66cca0f059f Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Wed, 14 Oct 2026 07:36:42 +0000 Subject: [PATCH 02/13] [AUTOMATED] Private Release 1.2.0-dev-6a303413 --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index ea28c99b..bbed6589 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.5aa7241b + 1.2.0-dev.6a303413 jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 95175076b45831b1507b64c6bee8003ba1094767 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 18:27:00 +0530 Subject: [PATCH 03/13] SK-3175 try internal release --- flowvault/src/main/java/com/skyflow/config/VaultConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/flowvault/src/main/java/com/skyflow/config/VaultConfig.java b/flowvault/src/main/java/com/skyflow/config/VaultConfig.java index 3369abc7..0de26f42 100644 --- a/flowvault/src/main/java/com/skyflow/config/VaultConfig.java +++ b/flowvault/src/main/java/com/skyflow/config/VaultConfig.java @@ -37,6 +37,7 @@ public VaultConfig() { } public String getVaultUrl() { + return vaultUrl; } From 6f25cc16c188cf391da5077045dbf4ee1044817d Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 12:57:33 +0000 Subject: [PATCH 04/13] [AUTOMATED] Private Release 1.2.0-dev-95175076 --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index bbed6589..db41b827 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.6a303413 + 1.2.0-dev.95175076 jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From b71f6e0b7a32b967eafb43f45903d5efcf30072f Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 19:08:12 +0530 Subject: [PATCH 05/13] SK-3175 try internal release --- .github/workflows/internal-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/internal-release.yml b/.github/workflows/internal-release.yml index 808cc7e4..5b13107b 100644 --- a/.github/workflows/internal-release.yml +++ b/.github/workflows/internal-release.yml @@ -46,7 +46,7 @@ jobs: uses: ./.github/workflows/shared-build-and-deploy.yml with: ref: ${{ github.ref_name }} - server-id: central + server-id: skyflow-jfrog profile: jfrog tag: 'internal' module: ${{ needs.resolve-module.outputs.module }} From 47375d96c0d9b658a6d521cbc25ba28e8879cacf Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 13:38:42 +0000 Subject: [PATCH 06/13] [AUTOMATED] Private Release 1.2.0-dev-b71f6e0b --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index db41b827..b0d4eec4 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.95175076 + 1.2.0-dev.b71f6e0b jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From ee51b1dcc33bab232bd77946bc31ff94cbf006a8 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 19:11:54 +0530 Subject: [PATCH 07/13] SK-3175 try internal release --- flowvault/pom.xml | 2 +- skyvault/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index b0d4eec4..f0272438 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -179,7 +179,7 @@ jfrog - central + skyflow-jfrog prekarilabs.jfrog.io-releases https://prekarilabs.jfrog.io/artifactory/skyflow-java diff --git a/skyvault/pom.xml b/skyvault/pom.xml index 23cb42d5..47c04de5 100644 --- a/skyvault/pom.xml +++ b/skyvault/pom.xml @@ -163,7 +163,7 @@ jfrog - central + skyflow-jfrog prekarilabs.jfrog.io-releases https://prekarilabs.jfrog.io/artifactory/skyflow-java From af38a326ef44b2060967c420284634b202937493 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 13:42:22 +0000 Subject: [PATCH 08/13] [AUTOMATED] Private Release 1.2.0-dev-ee51b1dc --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index f0272438..e71d8077 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.b71f6e0b + 1.2.0-dev.ee51b1dc jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 04fe9777f38285b69c04270641aa9dfd96e94ded Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 12:12:22 +0530 Subject: [PATCH 09/13] SK-3175 add v2 detect for skyvault also --- .../skyflow/detect/ReidentifyFileRequest.java | 0 .../detect/ReidentifyFileResponse.java | 0 .../detect/internal/ReidentifyFileMapper.java | 0 .../internal/ReidentifyFileValidations.java | 10 +- .../com/skyflow/errors/BaseErrorMessage.java | 3 + .../controller/BaseDetectController.java | 73 + .../internal/ReidentifyFileMapperTests.java | 0 .../ReidentifyFileValidationsTests.java | 16 +- docs/api_reference.md | 379 ++--- flowvault/README.md | 65 +- .../skyflow-flowvault-java.baseline.jar | Bin 938467 -> 937609 bytes flowvault/pom.xml | 2 +- .../java/com/skyflow/errors/ErrorMessage.java | 3 - .../vault/controller/DetectController.java | 118 +- .../controller/DetectControllerTests.java | 9 +- skyvault/README.md | 893 +++------- skyvault/api-report/skyflow-java.baseline.jar | Bin 986461 -> 1373082 bytes skyvault/pom.xml | 8 +- skyvault/samples/pom.xml | 2 +- .../example/detect/CheckGuardrailsSample.java | 51 + .../example/detect/DeidentifyFileExample.java | 114 -- .../detect/DeidentifyFileExampleAsync.java | 121 -- .../example/detect/DeidentifyFileSample.java | 74 + .../detect/DeidentifyStringSample.java | 93 ++ .../example/detect/DeidentifyTextExample.java | 142 -- .../example/detect/GetDetectRunExample.java | 55 - .../java/com/example/detect/GetRunSample.java | 55 + .../example/detect/ReidentifyFileSample.java | 71 + .../detect/ReidentifyStringSample.java | 58 + .../example/detect/ReidentifyTextExample.java | 95 -- .../src/main/java/com/skyflow/Skyflow.java | 7 + .../main/java/com/skyflow/VaultClient.java | 607 ------- .../skyflow/enums/DeidentifyFileStatus.java | 18 - .../com/skyflow/enums/DetectEntities.java | 90 - .../enums/DetectOutputTranscriptions.java | 23 - .../java/com/skyflow/enums/MaskingMethod.java | 21 - .../java/com/skyflow/enums/TokenType.java | 27 - .../java/com/skyflow/errors/ErrorMessage.java | 26 - .../java/com/skyflow/utils/Constants.java | 2 - .../utils/validations/Validations.java | 158 -- .../vault/controller/DetectController.java | 460 +----- .../com/skyflow/vault/detect/AudioBleep.java | 64 - .../vault/detect/DateTransformation.java | 30 - .../vault/detect/DeidentifyFileRequest.java | 192 --- .../vault/detect/DeidentifyFileResponse.java | 105 -- .../vault/detect/DeidentifyTextRequest.java | 88 - .../vault/detect/DeidentifyTextResponse.java | 44 - .../com/skyflow/vault/detect/EntityInfo.java | 46 - .../skyflow/vault/detect/FileEntityInfo.java | 20 - .../com/skyflow/vault/detect/FileInfo.java | 33 - .../com/skyflow/vault/detect/FileInput.java | 46 - .../vault/detect/GetDetectRunRequest.java | 33 - .../vault/detect/ReidentifyTextRequest.java | 68 - .../vault/detect/ReidentifyTextResponse.java | 23 - .../com/skyflow/vault/detect/TextIndex.java | 29 - .../com/skyflow/vault/detect/TokenFormat.java | 71 - .../skyflow/vault/detect/Transformations.java | 14 - .../java/com/skyflow/VaultClientTests.java | 747 --------- .../enums/DeidentifyFileStatusTest.java | 27 - .../com/skyflow/enums/DetectEntitiesTest.java | 24 - .../enums/DetectOutputTranscriptionsTest.java | 31 - .../com/skyflow/enums/MaskingMethodTest.java | 19 - .../java/com/skyflow/enums/TokenTypeTest.java | 30 - .../controller/DetectControllerFileTests.java | 466 ------ .../controller/DetectControllerTests.java | 1472 ++++++----------- .../detect/DeidentifyFileRequestTest.java | 150 -- .../detect/DeidentifyFileResponseTest.java | 69 - .../vault/detect/DeidentifyTextTests.java | 299 ---- .../vault/detect/FileEntityInfoTest.java | 22 - .../skyflow/vault/detect/FileInfoTest.java | 41 - .../vault/detect/ReidentifyTextTests.java | 169 -- 71 files changed, 1488 insertions(+), 6933 deletions(-) rename {flowvault => common}/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java (100%) rename {flowvault => common}/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java (100%) rename {flowvault => common}/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java (100%) rename {flowvault => common}/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java (82%) rename {flowvault => common}/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java (100%) rename {flowvault => common}/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java (86%) create mode 100644 skyvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExampleAsync.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyTextExample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/GetDetectRunExample.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/GetRunSample.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/ReidentifyTextExample.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/DetectEntities.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/MaskingMethod.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/TokenType.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/AudioBleep.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DateTransformation.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/EntityInfo.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/FileInfo.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/FileInput.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/TextIndex.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/TokenFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/Transformations.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/DetectEntitiesTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/MaskingMethodTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/TokenTypeTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/FileInfoTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java diff --git a/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java similarity index 100% rename from flowvault/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java rename to common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java diff --git a/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java similarity index 100% rename from flowvault/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java rename to common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java diff --git a/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java similarity index 100% rename from flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java rename to common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java diff --git a/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java similarity index 82% rename from flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java rename to common/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java index 0eafdcc8..46106c96 100644 --- a/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java +++ b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java @@ -1,7 +1,7 @@ package com.skyflow.detect.internal; import com.skyflow.detect.ReidentifyFileRequest; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; @@ -20,13 +20,13 @@ private ReidentifyFileValidations() { public static void validateReidentifyFileRequest(ReidentifyFileRequest request) throws SkyflowException { if (request == null) { - throw invalid(ErrorLogs.REIDENTIFY_FILE_REQUEST_NULL, ErrorMessage.ReidentifyFileRequestNull); + throw invalid(ErrorLogs.REIDENTIFY_FILE_REQUEST_NULL, BaseErrorMessage.ReidentifyFileRequestNull); } if (request.getDataSource() == null) { - throw invalid(ErrorLogs.INVALID_DATA_SOURCE_IN_REIDENTIFY_FILE, ErrorMessage.InvalidDataSourceInReidentifyFile); + throw invalid(ErrorLogs.INVALID_DATA_SOURCE_IN_REIDENTIFY_FILE, BaseErrorMessage.InvalidDataSourceInReidentifyFile); } if (isBlank(request.getValue())) { - throw invalid(ErrorLogs.INVALID_VALUE_IN_REIDENTIFY_FILE, ErrorMessage.InvalidValueInReidentifyFile); + throw invalid(ErrorLogs.INVALID_VALUE_IN_REIDENTIFY_FILE, BaseErrorMessage.InvalidValueInReidentifyFile); } // redactionLevel entries are optional on the API and are passed through as given. } @@ -36,7 +36,7 @@ private static boolean isBlank(String value) { return value == null || value.trim().isEmpty(); } - private static SkyflowException invalid(ErrorLogs log, ErrorMessage message) { + private static SkyflowException invalid(ErrorLogs log, BaseErrorMessage message) { LogUtil.printErrorLog(BaseUtils.parameterizedString(log.getLog(), INTERFACE_NAME)); return new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), message.getMessage()); } diff --git a/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java b/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java index d3c9c388..ff51fb89 100644 --- a/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java +++ b/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java @@ -192,6 +192,9 @@ public enum BaseErrorMessage { OutputDirectoryWithoutPollOptions("%s0 Validation error. outputDirectory in deidentify file request requires pollOptions."), FailedToWriteOutputFile("%s0 Failed to write the processed output to %s1."), GetRunRequestNull("%s0 Validation error. GetRun request cannot be null."), + ReidentifyFileRequestNull("%s0 Validation error. ReidentifyFile request cannot be null."), + InvalidDataSourceInReidentifyFile("%s0 Validation error. Invalid dataSource in reidentify file request. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL."), + InvalidValueInReidentifyFile("%s0 Validation error. Invalid value in reidentify file request. Specify the non-empty base64 content, skyflow id or presigned URL of the file."), InvalidRunIdInGetRun("%s0 Validation error. Invalid runId in get run request. Specify a non-empty run id."), CheckGuardrailsRequestNull("%s0 Validation error. CheckGuardrails request cannot be null."), InvalidTextInCheckGuardrails("%s0 Validation error. Invalid text in check guardrails request. Specify a non-empty text."), diff --git a/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java index 71f6217d..865bd1ff 100644 --- a/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java +++ b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java @@ -5,15 +5,22 @@ import com.skyflow.config.BaseVaultConfig; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.DeidentifyStringRequest; import com.skyflow.detect.DeidentifyStringResponse; import com.skyflow.detect.GetRunRequest; import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; import com.skyflow.detect.ReidentifyStringRequest; import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.detect.internal.DeidentifyFileFlow; import com.skyflow.detect.internal.DetectRequestMapper; import com.skyflow.detect.internal.DetectResponseMapper; import com.skyflow.detect.internal.DetectValidations; +import com.skyflow.detect.internal.ReidentifyFileMapper; +import com.skyflow.detect.internal.ReidentifyFileValidations; import com.skyflow.errors.SkyflowException; import com.skyflow.generated.detect.rest.core.ApiClientApiException; import com.skyflow.generated.detect.rest.core.ApiClientException; @@ -22,15 +29,19 @@ import com.skyflow.generated.detect.rest.core.ObjectMappers; import com.skyflow.generated.detect.rest.core.RequestOptions; import com.skyflow.generated.detect.rest.resources.filesv2.FilesV2Client; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; import com.skyflow.generated.detect.rest.resources.guardrailsv2.GuardrailsV2Client; import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; import com.skyflow.generated.detect.rest.resources.stringsv2.StringsV2Client; import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; @@ -222,6 +233,68 @@ public ReidentifyStringResponse reidentifyString(ReidentifyStringRequest request } } + /** + * Detects and de-identifies sensitive data in a file. The API is asynchronous: by default this + * submits the run and returns its id for use with {@link #getRun}. With + * {@link DeidentifyFileRequest#getPollOptions() pollOptions} the SDK polls the run with exponential + * backoff and returns the completed run, or the run id with a non-terminal status if the budget + * runs out. On success, a request built from a local file has its outputs written to disk. + * + * @param request the file (base64, skyflow id, presigned URL, or a local file) plus a stored or inline configuration + * @return run id, and the run's status, outputs and metrics when polled + * @throws SkyflowException on validation failure, credential failure, an API error or an output write failure + */ + public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_FILE_REQUEST.getLog()); + DetectValidations.validateDeidentifyFileRequest(request); + String token = resolveToken(); + DeidentifyFileRequestV2 apiRequest = DetectRequestMapper.toDeidentifyFileRequest(request, this.vaultConfig.getVaultId()); + String runId; + try { + DeidentifyFileResponseV2 apiResponse = filesClient().deidentifyFileV2(apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); + runId = apiResponse.getRunId().orElse(null); + } catch (ApiClientApiException e) { + throw toSkyflowException(e, ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + DeidentifyFileResponse response = DeidentifyFileFlow.complete(request, runId, + id -> getRun(GetRunRequest.builder().runId(id).build())); + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_SUCCESS.getLog()); + return response; + } + + /** + * Replaces tokens in a file with their original values or a redacted rendering. Synchronous: + * the re-identified file is returned in the response rather than through a run id. + * + * @param request the file (base64, skyflow id or presigned URL) plus optional per-group redaction rules + * @return status, output files and metrics + * @throws SkyflowException on validation failure, credential failure or an API error + */ + public ReidentifyFileResponse reidentifyFile(ReidentifyFileRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_REIDENTIFY_FILE_REQUEST.getLog()); + ReidentifyFileValidations.validateReidentifyFileRequest(request); + String token = resolveToken(); + ReidentifyFileRequestV2 apiRequest = ReidentifyFileMapper.toApiRequest(request, this.vaultConfig.getVaultId()); + try { + ReidentifyFileResponseV2 apiResponse = filesClient().reidentifyFileV2(apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); + ReidentifyFileResponse response = ReidentifyFileMapper.toResponse(apiResponse); + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_SUCCESS.getLog()); + return response; + } catch (ApiClientApiException e) { + throw toSkyflowException(e, ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + } + /** * Retrieves the status and, once complete, the outputs of a Detect file run. * diff --git a/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java similarity index 100% rename from flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java rename to common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java diff --git a/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java similarity index 86% rename from flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java rename to common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java index 5d1cc3fb..d910fa77 100644 --- a/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java @@ -6,7 +6,7 @@ import com.skyflow.detect.RedactionType; import com.skyflow.detect.ReidentifyFileRequest; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import org.junit.Assert; import org.junit.Test; @@ -20,7 +20,7 @@ private static ReidentifyFileRequest.ReidentifyFileRequestBuilder valid() { return ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("Zm9v"); } - private static void assertRejected(ReidentifyFileRequest request, ErrorMessage expected) { + private static void assertRejected(ReidentifyFileRequest request, BaseErrorMessage expected) { try { ReidentifyFileValidations.validateReidentifyFileRequest(request); Assert.fail("expected SkyflowException: " + expected); @@ -32,25 +32,25 @@ private static void assertRejected(ReidentifyFileRequest request, ErrorMessage e @Test public void rejectsNullRequest() { - assertRejected(null, ErrorMessage.ReidentifyFileRequestNull); + assertRejected(null, BaseErrorMessage.ReidentifyFileRequestNull); } @Test public void rejectsMissingDataSource() { - assertRejected(ReidentifyFileRequest.builder().value("Zm9v").build(), ErrorMessage.InvalidDataSourceInReidentifyFile); + assertRejected(ReidentifyFileRequest.builder().value("Zm9v").build(), BaseErrorMessage.InvalidDataSourceInReidentifyFile); } @Test public void rejectsNullOrBlankValue() { - assertRejected(ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).build(), ErrorMessage.InvalidValueInReidentifyFile); - assertRejected(valid().value("").build(), ErrorMessage.InvalidValueInReidentifyFile); - assertRejected(valid().value(" \t").build(), ErrorMessage.InvalidValueInReidentifyFile); + assertRejected(ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).build(), BaseErrorMessage.InvalidValueInReidentifyFile); + assertRejected(valid().value("").build(), BaseErrorMessage.InvalidValueInReidentifyFile); + assertRejected(valid().value(" \t").build(), BaseErrorMessage.InvalidValueInReidentifyFile); } @Test public void checksFieldsInOrderDataSourceBeforeValue() { // Both missing: dataSource is reported first. - assertRejected(ReidentifyFileRequest.builder().build(), ErrorMessage.InvalidDataSourceInReidentifyFile); + assertRejected(ReidentifyFileRequest.builder().build(), BaseErrorMessage.InvalidDataSourceInReidentifyFile); } @Test diff --git a/docs/api_reference.md b/docs/api_reference.md index 8f5716a5..5908751c 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -204,60 +204,69 @@ Parameters listed with their defaults as defined in the builders. |----------------|---------|-------------| | `values(List)` | _(required)_ | List of [`ColumnValue`](#columnvalue) objects to tokenize. | -### `DeidentifyTextRequest` +### `DeidentifyStringRequest` -`com.skyflow.vault.detect` — passed to `detect().deidentifyText()`. +`com.skyflow.detect` — passed to `detect().deidentifyString()`. | Builder method | Default | Description | |----------------|---------|-------------| | `text(String)` | _(required)_ | Text to de-identify. | -| `entities(List)` | `null` | Entity types to detect. See [`DetectEntities`](#detectentities). | -| `allowRegexList(List)` | `null` | Regex patterns to always treat as detectable. | -| `restrictRegexList(List)` | `null` | Regex patterns to exclude from detection. | -| `tokenFormat(TokenFormat)` | `null` | Token format controlling token types per entity. See [`TokenFormat`](#tokenformat). | -| `transformations(Transformations)` | `null` | Data transformations (e.g. date shifting). See [`Transformations`](#transformations). | +| `configurationId(String)` | `null` | Id of a Detect configuration created in Studio or through the management API. | +| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration). Supply this or `configurationId`. | -### `ReidentifyTextRequest` +### `DeidentifyFileRequest` -`com.skyflow.vault.detect` — passed to `detect().reidentifyText()`. +`com.skyflow.detect` — passed to `detect().deidentifyFile()`. Supply the file through exactly one of `value` (with a `dataSource`), `file` or `filePath`. | Builder method | Default | Description | |----------------|---------|-------------| -| `text(String)` | _(required)_ | The redacted/de-identified text to re-identify. | -| `redactedEntities(List)` | `null` | Entity types to keep redacted. | -| `maskedEntities(List)` | `null` | Entity types to mask. | -| `plainTextEntities(List)` | `null` | Entity types to reveal as plain text. | +| `dataSource(DataSourceType)` | `null` | How `value` supplies the file. See [`DataSourceType`](#datasourcetype). | +| `value(String)` | `null` | Base64 content, a skyflow id, or a presigned URL, per `dataSource`. | +| `file(File)` | `null` | Local file; read and base64-encoded when sent, `dataSource` set to `BASE64`. | +| `filePath(String)` | `null` | Same as `file(File)`, from a path. | +| `dataFormat(FileDataFormat)` | inferred from the extension | File format. See [`FileDataFormat`](#filedataformat). | +| `configurationId(String)` | `null` | Id of a stored Detect configuration. | +| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration). | +| `pollOptions(PollOptions)` | `null` | Poll the run after submitting. `null` submits only and returns the run id. See [`PollOptions`](#polloptions). | +| `outputDirectory(String)` | working directory | Where outputs are written on success. Requires `pollOptions` and a local file. | -### `DeidentifyFileRequest` +### `ReidentifyStringRequest` + +`com.skyflow.detect` — passed to `detect().reidentifyString()`. + +| Builder method | Default | Description | +|----------------|---------|-------------| +| `text(String)` | _(required)_ | The de-identified text to re-identify. | +| `redactionLevel(List)` | `null` | Per-entity redaction rules. See [`RedactionLevel`](#redactionlevel). Without rules every token is replaced by its original value. | + +### `ReidentifyFileRequest` -`com.skyflow.vault.detect` — passed to `detect().deidentifyFile()`. +`com.skyflow.detect` — passed to `detect().reidentifyFile()`. Synchronous: the re-identified file comes back in the response. | Builder method | Default | Description | |----------------|---------|-------------| -| `file(FileInput)` | _(required)_ | File source. See [`FileInput`](#fileinput). | -| `entities(List)` | `null` | Entity types to detect. | -| `allowRegexList(List)` | `null` | Regex patterns to always treat as detectable. | -| `restrictRegexList(List)` | `null` | Regex patterns to exclude. | -| `tokenFormat(TokenFormat)` | `null` | Token format per entity. | -| `transformations(Transformations)` | `null` | Transformations (not supported for Documents/Images/PDFs). | -| `outputProcessedImage(Boolean)` | `false` | Include the processed image in the response. | -| `outputOcrText(Boolean)` | `false` | Include OCR text in the response. | -| `maskingMethod(MaskingMethod)` | `null` | See [`MaskingMethod`](#maskingmethod). | -| `pixelDensity(Number)` | `null` | Pixel density for PDF processing. | -| `maxResolution(Number)` | `null` | Max resolution for PDF processing. | -| `outputProcessedAudio(Boolean)` | `false` | Include processed audio in the response. | -| `outputTranscription(DetectOutputTranscriptions)` | `null` | See [`DetectOutputTranscriptions`](#detectoutputtranscriptions). | -| `bleep(AudioBleep)` | `null` | Audio bleep configuration. See [`AudioBleep`](#audiobleep). | -| `outputDirectory(String)` | `null` | Directory to write the processed file. | -| `waitTime(Integer)` | `null` | Max seconds to wait for async file processing (≤ 64). | - -### `GetDetectRunRequest` - -`com.skyflow.vault.detect` — passed to `detect().getDetectRun()`. +| `dataSource(DataSourceType)` | _(required)_ | `BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`. | +| `value(String)` | _(required)_ | Base64 content, a skyflow id, or a presigned URL, per `dataSource`. | +| `dataFormat(FileDataFormat)` | `null` | File format. | +| `redactionLevel(List)` | `null` | Per-entity redaction rules. See [`RedactionLevel`](#redactionlevel). | + +### `GetRunRequest` + +`com.skyflow.detect` — passed to `detect().getRun()`. | Builder method | Default | Description | |----------------|---------|-------------| -| `runId(String)` | _(required)_ | The `run_id` returned by a prior `deidentifyFile` call. | +| `runId(String)` | _(required)_ | The run id returned by a prior `deidentifyFile` call. | + +### `CheckGuardrailsRequest` + +`com.skyflow.detect` — passed to `detect().checkGuardrails()`. + +| Builder method | Default | Description | +|----------------|---------|-------------| +| `text(String)` | _(required)_ | Text to screen. | +| `checkToxicity(Boolean)` | `true` on the server | Whether to check for toxicity. | +| `denyTopics(List)` | `null` | Topics to deny. | ### `InvokeConnectionRequest` @@ -363,44 +372,63 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. |--------|-------------|-------------| | `getTokens()` | `List` | One token per input `ColumnValue`, in order. | -### `DeidentifyTextResponse` +### `DeidentifyStringResponse` -`com.skyflow.vault.detect` — returned by `detect().deidentifyText()`. +`com.skyflow.detect` — returned by `detect().deidentifyString()`. | Getter | Return type | Description | |--------|-------------|-------------| | `getProcessedText()` | `String` | The de-identified text with entity values replaced by tokens. | -| `getEntities()` | `List` | Detected entities. See [`EntityInfo`](#entityinfo). | -| `getWordCount()` | `int` | Word count of the input text. | -| `getCharCount()` | `int` | Character count of the input text. | +| `getEntities()` | `List` | Detected entities, never `null`. See [`DetectedEntity`](#detectedentity). | +| `getMetrics()` | `Metrics` | Word and character counts. See [`Metrics`](#metrics). | -### `ReidentifyTextResponse` +### `ReidentifyStringResponse` -`com.skyflow.vault.detect` — returned by `detect().reidentifyText()`. +`com.skyflow.detect` — returned by `detect().reidentifyString()`. | Getter | Return type | Description | |--------|-------------|-------------| -| `getProcessedText()` | `String` | The re-identified text with tokens replaced by their original values. | +| `getProcessedText()` | `String` | The re-identified text. | +| `getMetrics()` | `Metrics` | Word and character counts. | ### `DeidentifyFileResponse` -`com.skyflow.vault.detect` — returned by `detect().deidentifyFile()`. +`com.skyflow.detect` — returned by `detect().deidentifyFile()`. Without `pollOptions` only `getRunId()` is set. + +| Getter | Return type | Description | +|--------|-------------|-------------| +| `getRunId()` | `String` | Run id, always present. | +| `getStatus()` | `DetectRunStatus` | Run status when polled, `null` when submit only. See [`DetectRunStatus`](#detectrunstatus). | +| `getOutputType()` | `DataSourceType` | `BASE64` or `PRESIGNED_URL`, `null` until the run completes. | +| `getOutput()` | `List` | Every output of the run, empty until complete, never `null`. See [`FileOutput`](#fileoutput). | +| `getMetrics()` | `Metrics` | Size, counts, pages, slides, duration. `null` until complete. | +| `getMessage()` | `String` | Failure detail when the status is `FAILED`. | + +### `ReidentifyFileResponse` + +`com.skyflow.detect` — returned by `detect().reidentifyFile()`. | Getter | Return type | Description | |--------|-------------|-------------| -| `getFile()` | `FileInfo` | Metadata about the processed file. See [`FileInfo`](#fileinfo). | -| `getFileBase64()` | `String` | Base64-encoded processed file content (when `outputProcessedImage=true`). | -| `getType()` | `String` | MIME type of the output file. | -| `getExtension()` | `String` | File extension of the output file. | -| `getWordCount()` | `Integer` | Word count (text/document files). | -| `getCharCount()` | `Integer` | Character count (text/document files). | -| `getSizeInKb()` | `Float` | Output file size in kilobytes. | -| `getDurationInSeconds()` | `Float` | Duration in seconds (audio/video files). | -| `getPageCount()` | `Integer` | Page count (PDF files). | -| `getSlideCount()` | `Integer` | Slide count (presentation files). | -| `getEntities()` | `List` | Detected entities. See [`FileEntityInfo`](#fileentityinfo). | -| `getRunId()` | `String` | Run ID for async polling with `getDetectRun()`. | -| `getStatus()` | `String` | Processing status. See [`DeidentifyFileStatus`](#deidentifyfilestatus). | +| `getStatus()` | `DetectRunStatus` | Status of the re-identification. | +| `getOutputType()` | `DataSourceType` | `BASE64` or `PRESIGNED_URL`. | +| `getOutput()` | `List` | Re-identified file outputs, never `null`. | +| `getMetrics()` | `Metrics` | Size and counts. | + +### `GetRunResponse` + +`com.skyflow.detect` — returned by `detect().getRun()`. Same getters as [`DeidentifyFileResponse`](#deidentifyfileresponse). + +### `CheckGuardrailsResponse` + +`com.skyflow.detect` — returned by `detect().checkGuardrails()`. + +| Getter | Return type | Description | +|--------|-------------|-------------| +| `getText()` | `String` | The screened text. | +| `getValidation()` | `GuardrailsValidation` | `PASSED` or `FAILED`. See [`GuardrailsValidation`](#guardrailsvalidation). | +| `getToxic()` | `Boolean` | Whether the text was judged toxic, `null` when the check did not run. | +| `getDeniedTopic()` | `Boolean` | Whether a denied topic was found, `null` when no topics were supplied. | ### `InvokeConnectionResponse` @@ -444,117 +472,137 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. | `getValue()` | `String` | The value to tokenize. | | `getColumnGroup()` | `String` | The column group name. | -### `FileInput` +### `DetectConfiguration` -`com.skyflow.vault.detect` — used inside [`DeidentifyFileRequest`](#deidentifyfilerequest). Provide exactly one source. +`com.skyflow.detect` — inline Detect policy for `deidentifyString` and `deidentifyFile`. | Builder method | Default | Description | |----------------|---------|-------------| -| `file(File)` | `null` | A `java.io.File` object. | -| `filePath(String)` | `null` | Path to a file. | +| `name(String)` | `null` | Configuration name. | +| `description(String)` | `null` | Configuration description. | +| `detect(Detect)` | `null` | What to detect and how to de-identify it. See [`Detect`](#detect). | +| `fileMapping(List)` | `null` | Per-column handling for structured files. See [`FileMapping`](#filemapping). | +| `media(Media)` | `null` | Audio, document and image options for file calls. See [`Media`](#media). | -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getFile()` | `File` | The file object. | -| `getFilePath()` | `String` | The file path. | +### `Detect` -### `AudioBleep` +| Builder method | Default | Description | +|----------------|---------|-------------| +| `entities(List)` | `null` | Entities to detect, each with its own de-identification type. See [`Entity`](#entity). | +| `objectEntities(List)` | `null` | Visual objects to detect in images. See [`ObjectEntity`](#objectentity). | +| `restrict(List)` | `null` | Regexes to always treat as restricted. | +| `skip(List)` | `null` | Regexes to never treat as sensitive. | +| `customTypes(List)` | `null` | Regex-defined entity types. See [`CustomType`](#customtype). | +| `returnEntities(ReturnEntitiesType)` | `EXCLUDE_SENSITIVE_DATA` | Whether raw values come back in the response. See [`ReturnEntitiesType`](#returnentitiestype). | -`com.skyflow.vault.detect` — used inside [`DeidentifyFileRequest`](#deidentifyfilerequest) for audio bleeping. +### `Entity` | Builder method | Default | Description | |----------------|---------|-------------| -| `gain(Double)` | `null` | Gain level of the bleep tone. | -| `frequency(Double)` | `null` | Frequency (Hz) of the bleep tone. | -| `startPadding(Double)` | `null` | Seconds of silence before the bleep. | -| `stopPadding(Double)` | `null` | Seconds of silence after the bleep. | +| `entityType(EntityType)` | `ALL` | Entity type. See [`EntityType`](#entitytype). | +| `deidentificationType(DeidentificationType)` | `ENTITY_UNIQUE_COUNTER` | How the value is replaced. See [`DeidentificationType`](#deidentificationtype). | +| `destination(String)` | `null` | For `VAULT_TOKEN`: the `table.column` that stores the value. | +| `transformation(Transformation)` | `null` | Date shifting. See [`Transformation`](#transformation). | -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getGain()` | `Double` | Gain level. | -| `getFrequency()` | `Double` | Frequency. | -| `getStartPadding()` | `Double` | Start padding in seconds. | -| `getStopPadding()` | `Double` | Stop padding in seconds. | +### `Transformation` and `ShiftDates` -### `TokenFormat` +`Transformation.builder().shiftDates(ShiftDates)`; `ShiftDates.builder().minDays(Integer).maxDays(Integer)`. Dates are shifted by a random amount within the range. -`com.skyflow.vault.detect` — used inside [`DeidentifyTextRequest`](#deidentifytextrequest) and [`DeidentifyFileRequest`](#deidentifyfilerequest) to control token types per entity. +### `CustomType` | Builder method | Default | Description | |----------------|---------|-------------| -| `defaultType(TokenType)` | `TokenType.ENTITY_UNIQUE_COUNTER` | Default token type for entities not explicitly listed. See [`TokenType`](#tokentype). | -| `vaultToken(List)` | `null` | Entities to tokenize as vault tokens. | -| `entityUniqueCounter(List)` | `null` | Entities to tokenize as entity-unique-counter tokens. | -| `entityOnly(List)` | `null` | Entities to tokenize as entity-only tokens. | +| `label(String)` | `null` | Becomes the entity type on the response. | +| `match(List)` | `null` | Regexes that define the type. | -### `Transformations` +### `ObjectEntity` -`com.skyflow.vault.detect` — used inside [`DeidentifyTextRequest`](#deidentifytextrequest) and [`DeidentifyFileRequest`](#deidentifyfilerequest). +| Builder method | Default | Description | +|----------------|---------|-------------| +| `entityType(ObjectEntityType)` | `null` | `FACE`, `LICENSE_PLATE`, `LOGO`, `SIGNATURE` or `ALL`. | +| `deidentificationType(ObjectDeidentificationType)` | `null` | `REDACT` or `UNREDACT`. | -| Constructor | Description | -|-------------|-------------| -| `new Transformations(DateTransformation shiftDates)` | Apply date shifting. | +### `FileMapping` -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getShiftDates()` | `DateTransformation` | The date transformation to apply. | +| Builder method | Description | +|----------------|-------------| +| `source(String)` | Source column. | +| `destination(String)` | Destination column. | +| `outputFileNameSuffix(String)` | Suffix added to the output file name. | +| `entitiesDestination(String)` | Column that receives the detected entities. | +| `objectEntitiesDestination(String)` | Column that receives the detected object entities. | -### `DateTransformation` +### `Media` -`com.skyflow.vault.detect` — used inside [`Transformations`](#transformations). +`Media.builder().audio(Audio).document(Document).image(Image)`. -| Constructor | Description | -|-------------|-------------| -| `new DateTransformation(int max, int min, List entities)` | Shift dates by a random amount within `[min, max]` days. | +| Class | Builder methods | +|-------|-----------------| +| `Audio` | `outputProcessedAudio(Boolean)`, `outputTranscription(OutputTranscriptionType)`, `bleep(Bleep)` | +| `Bleep` | `startPadding(Float)`, `stopPadding(Float)`, `frequency(Integer)`, `gain(Integer)` | +| `Document` | `pdf(Pdf)` | +| `Pdf` | `processingMode(PdfProcessingMode)`, `density(Integer)`, `maxResolution(Integer)` | +| `Image` | `outputProcessedImage(Boolean)`, `outputOcrText(Boolean)`, `maskingMethod(MaskingMethod)` | -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getMax()` | `int` | Maximum day-shift value. | -| `getMin()` | `int` | Minimum day-shift value. | -| `getEntities()` | `List` | Entity types to date-shift. | +### `PollOptions` -### `EntityInfo` +`com.skyflow.detect` — opts `deidentifyFile` into submit-and-poll mode. The SDK polls with exponential backoff (1, 2, 4, 8, 16, then 32 seconds) on the calling thread. -`com.skyflow.vault.detect` — element of `DeidentifyTextResponse.getEntities()`. +| Builder method | Default | Description | +|----------------|---------|-------------| +| `waitTime(Integer)` | `60` | Maximum total seconds to keep polling, 1 to 300. | +| `maxAttempts(Integer)` | `23` | Maximum number of run lookups, 1 to 23. | -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getToken()` | `String` | The token that replaced the original entity value. | -| `getValue()` | `String` | The original entity value. | -| `getTextIndex()` | `TextIndex` | Character offsets of the entity in the original text. | -| `getProcessedIndex()` | `TextIndex` | Character offsets of the token in the processed text. | -| `getEntity()` | `String` | Entity type label (e.g. `"EMAIL_ADDRESS"`). | -| `getScores()` | `Map` | Confidence scores per entity type. | +### `RedactionLevel` + +`com.skyflow.detect` — element of `ReidentifyStringRequest.redactionLevel()`. For skyvault vaults name an entity and a redaction type. + +| Builder method | Description | +|----------------|-------------| +| `entityName(EntityType)` | Entity the rule applies to. | +| `redactionType(RedactionType)` | `PLAIN_TEXT`, `MASKED`, `REDACTED` or `DEFAULT`. See [`RedactionType`](#redactiontype). | +| `tokenGroupName(String)` | Flowvault vaults only. | +| `redactionPattern(String)` | Flowvault vaults only. | -### `TextIndex` +### `DetectedEntity` -`com.skyflow.vault.detect` — used in [`EntityInfo`](#entityinfo). +`com.skyflow.detect` — element of `DeidentifyStringResponse.getEntities()`. | Getter | Return type | Description | |--------|-------------|-------------| -| `getStart()` | `int` | Start character offset (inclusive). | -| `getEnd()` | `int` | End character offset (exclusive). | +| `getToken()` | `String` | The token that replaced the value, e.g. `NAME_1`. | +| `getValue()` | `String` | The original value; empty unless `returnEntities` is `ALL`. | +| `getLocation()` | `EntityLocation` | Offsets in the original and processed text. | +| `getEntityType()` | `String` | Entity type label, including custom type labels. | +| `getEntityScores()` | `Map` | Confidence scores per entity type. | -### `FileEntityInfo` +### `EntityLocation` -`com.skyflow.vault.detect` — element of `DeidentifyFileResponse.getEntities()`. +| Getter | Return type | Description | +|--------|-------------|-------------| +| `getStartIndex()` / `getEndIndex()` | `Integer` | Offsets into the original text. | +| `getStartIndexProcessed()` / `getEndIndexProcessed()` | `Integer` | Offsets into the processed text. | + +### `Metrics` | Getter | Return type | Description | |--------|-------------|-------------| -| `getFile()` | `String` | File name or identifier. | -| `getType()` | `String` | Output file type. | -| `getExtension()` | `String` | Output file extension. | +| `getSize()` | `Double` | Size in kilobytes. | +| `getWordCount()` | `Integer` | Word count. | +| `getCharacterCount()` | `Integer` | Character count. | +| `getPages()` | `Integer` | Page count, documents only. | +| `getSlides()` | `Integer` | Slide count, presentations only. | +| `getDuration()` | `Double` | Duration in seconds, audio only. | -### `FileInfo` +### `FileOutput` -`com.skyflow.vault.detect` — returned by `DeidentifyFileResponse.getFile()`. +`com.skyflow.detect` — element of `getOutput()` on the file responses. | Getter | Return type | Description | |--------|-------------|-------------| -| `getName()` | `String` | Original file name. | -| `getSize()` | `long` | File size in bytes. | -| `getType()` | `String` | MIME type. | -| `getLastModified()` | `long` | Last-modified timestamp (milliseconds since epoch). | +| `getProcessedFile()` | `String` | Base64 content or a presigned URL, per the response's `getOutputType()`. | +| `getProcessedFileType()` | `String` | `REDACTED_FILE`, `ENTITIES`, `OBJECT_ENTITIES`, `REDACTED_TEXT`, and so on. | +| `getProcessedFileExtension()` | `FileDataFormat` | Extension of the output. | --- @@ -604,16 +652,6 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. | `ENABLE` | Use provided tokens where supplied; generate tokens for missing fields. | | `ENABLE_STRICT` | All fields must supply a BYOT token; missing tokens cause an error. | -### `TokenType` - -`com.skyflow.enums` — used in [`TokenFormat`](#tokenformat) for Detect operations. - -| Value | Description | -|-------|-------------| -| `VAULT_TOKEN` | Token stored in the vault and associated with a skyflow_id. | -| `ENTITY_UNIQUE_COUNTER` | Deterministic token unique to the entity value (consistent across occurrences). | -| `ENTITY_ONLY` | Token represents the entity type only, with no value stored in the vault. | - ### `RequestMethod` `com.skyflow.enums` — used in [`InvokeConnectionRequest`](#invokeconnectionrequest). @@ -626,54 +664,25 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. | `PATCH` | HTTP PATCH. | | `DELETE` | HTTP DELETE. | -### `MaskingMethod` - -`com.skyflow.enums` — used in [`DeidentifyFileRequest`](#deidentifyfilerequest). - -| Value | Description | -|-------|-------------| -| `BLACKBOX` | Cover detected entities with a solid black rectangle. | -| `BLUR` | Blur detected entities. | - -### `DetectOutputTranscriptions` - -`com.skyflow.enums` — used in [`DeidentifyFileRequest`](#deidentifyfilerequest). - -| Value | Description | -|-------|-------------| -| `TRANSCRIPTION` | Standard transcription. | -| `DIARIZED_TRANSCRIPTION` | Transcription with speaker diarization. | -| `MEDICAL_TRANSCRIPTION` | Medical-domain transcription. | -| `MEDICAL_DIARIZED_TRANSCRIPTION` | Medical transcription with speaker diarization. | - -### `DeidentifyFileStatus` - -`com.skyflow.enums` — returned in `DeidentifyFileResponse.getStatus()`. - -| Value | Description | -|-------|-------------| -| `IN_PROGRESS` | File processing is ongoing. Poll with `getDetectRun()`. | -| `SUCCESS` | Processing completed successfully. | -| `FAILED` | Processing failed. | -| `UNKNOWN` | Status could not be determined. | - -### `DetectEntities` - -`com.skyflow.enums` — entity type values for Detect operations. - -| Category | Values | -|----------|--------| -| Personal identity | `NAME`, `NAME_GIVEN`, `NAME_FAMILY`, `NAME_MEDICAL_PROFESSIONAL`, `DOB`, `AGE`, `GENDER`, `MARITAL_STATUS`, `SEXUALITY`, `RELIGION`, `POLITICAL_AFFILIATION`, `PHYSICAL_ATTRIBUTE`, `ORIGIN`, `NATIONALITY` | -| Contact | `EMAIL_ADDRESS`, `PHONE_NUMBER`, `LOCATION`, `LOCATION_ADDRESS`, `LOCATION_ADDRESS_STREET`, `LOCATION_CITY`, `LOCATION_STATE`, `LOCATION_COUNTRY`, `LOCATION_ZIP`, `LOCATION_COORDINATE` | -| Financial | `CREDIT_CARD`, `CREDIT_CARD_EXPIRATION`, `CVV`, `BANK_ACCOUNT`, `ACCOUNT_NUMBER`, `ROUTING_NUMBER`, `MONEY`, `FINANCIAL_METRIC`, `CORPORATE_ACTION` | -| Government ID | `SSN`, `DRIVER_LICENSE`, `PASSPORT_NUMBER`, `HEALTHCARE_NUMBER`, `ORGANIZATION_ID`, `NUMERICAL_PII` | -| Medical | `BLOOD_TYPE`, `CONDITION`, `DRUG`, `DOSE`, `EFFECT`, `INJURY`, `MEDICAL_CODE`, `MEDICAL_PROCESS`, `ORGANIZATION_MEDICAL_FACILITY` | -| Date & time | `DATE`, `DAY`, `MONTH`, `YEAR`, `TIME`, `DURATION`, `DATE_INTERVAL`, `EVENT` | -| Technology | `IP_ADDRESS`, `URL`, `USERNAME`, `PASSWORD`, `FILENAME`, `VEHICLE_ID` | -| Organization | `ORGANIZATION`, `OCCUPATION`, `PROJECT`, `PRODUCT` | -| Other | `LANGUAGE`, `STATISTICS`, `TREND`, `ZODIAC_SIGN`, `ALL` | - -Use `DetectEntities.ALL` to detect all supported entity types. +### Detect enums + +All in `com.skyflow.detect`. + +| Enum | Values | +|------|--------| +| `EntityType` | the 70 entity types (`NAME`, `EMAIL_ADDRESS`, `SSN`, `CREDIT_CARD`, `DOB`, ...), plus `ALL` and `NONE` | +| `DeidentificationType` | `ENTITY_UNIQUE_COUNTER` _(default)_, `ENTITY_ONLY`, `VAULT_TOKEN`, `MASK`, `UNKNOWN` | +| `DataSourceType` | `BASE64`, `SKYFLOW_ID`, `PRESIGNED_URL` | +| `FileDataFormat` | `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML`, `ZIP` | +| `DetectRunStatus` | `QUEUED`, `IN_PROGRESS`, `SUCCESS`, `FAILED`, `UNKNOWN`. `SUCCESS`, `FAILED` and `UNKNOWN` end polling. | +| `ReturnEntitiesType` | `EXCLUDE_SENSITIVE_DATA` _(default)_, `ALL`, `NONE` | +| `RedactionType` | `PLAIN_TEXT`, `MASKED`, `REDACTED`, `DEFAULT` | +| `MaskingMethod` | `NONE`, `BLUR`, `BLACKBOX` | +| `OutputTranscriptionType` | `NONE`, `TRANSCRIPTION`, `MEDICAL_TRANSCRIPTION`, `DIARIZED_TRANSCRIPTION`, `MEDICAL_DIARIZED_TRANSCRIPTION` | +| `PdfProcessingMode` | `NONE`, `OCR`, `TEXT_LAYER` | +| `ObjectEntityType` | `NONE`, `FACE`, `LICENSE_PLATE`, `LOGO`, `SIGNATURE`, `ALL` | +| `ObjectDeidentificationType` | `UNKNOWN`, `REDACT`, `UNREDACT` | +| `GuardrailsValidation` | `PASSED`, `FAILED`, `UNKNOWN` | --- diff --git a/flowvault/README.md b/flowvault/README.md index f51dd137..589e7107 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1740,6 +1740,69 @@ switch (response.getStatus()) { Outputs are written only when polling reached `SUCCESS`, the request was built from a local file, and the run delivered them as base64. A request built from a `SKYFLOW_ID` or `PRESIGNED_URL` has no local name to derive from, and presigned-URL outputs are not fetched, so in those cases read `getOutput()` and write the files yourself. Files are named `processed-.`, with the entities output as `processed-entities-.json` (and `processed-object-entities-.json` for object entities); `outputDirectory` is created if missing and defaults to the working directory. Polling blocks the calling thread. +### Polling from a worker thread + +With `pollOptions` set, `deidentifyFile` polls on the thread that called it: each lookup is a synchronous `getRun` followed by a sleep, until the run is terminal or the budget runs out. No other thread, lock or connection is held while it waits, so other SDK calls are unaffected, but the calling thread is. If that thread is your main thread, a request thread or an event loop, run the call elsewhere. + +**Run the blocking call on a thread you own.** Simplest when you process a few files at a time. The SDK still enforces the budget and writes outputs to disk; your thread is parked for the whole poll. + +```java +ExecutorService pool = Executors.newFixedThreadPool(4); // or Executors.newVirtualThreadPerTaskExecutor() on JDK 21+ + +pool.execute(() -> { + try { + DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(120).build()) + .outputDirectory("/data/processed") + .build()); + handle(response); // SUCCESS, FAILED, UNKNOWN, or IN_PROGRESS/QUEUED if the budget ran out + } catch (SkyflowException e) { + handleError(e); // catch inside the task; an uncaught exception only ends this thread + } +}); +``` + +Use `pool.submit(...)` instead of `execute` if you want a `Future` to cancel with: interrupting the thread wakes the sleep and the SDK returns the last run it saw. Bound the pool, since every in-flight run parks one thread. + +**Submit only, then poll `getRun` on a scheduler.** Best for services and anything concurrent. No thread is held between lookups, so one scheduler thread serves any number of runs. You control the backoff and budget, and you write the outputs yourself since the SDK only writes them when it polls. + +```java +ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + +String runId = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .build()) // no pollOptions: returns the run id immediately + .getRunId(); + +scheduler.schedule(new Runnable() { + long delaySeconds = 1; + + @Override + public void run() { + try { + GetRunResponse run = skyflowClient.detect().getRun(GetRunRequest.builder().runId(runId).build()); + switch (run.getStatus()) { + case SUCCESS: case FAILED: case UNKNOWN: + handle(run); + return; + default: // QUEUED, IN_PROGRESS + scheduler.schedule(this, delaySeconds, TimeUnit.SECONDS); + delaySeconds = Math.min(delaySeconds * 2, 32); + } + } catch (SkyflowException e) { + handleError(e); + } + } +}, 0, TimeUnit.SECONDS); +``` + +Either way the main thread only pays for the submit round trip. Avoid `new Thread(...)` per file or `CompletableFuture.runAsync` on the common pool for anything that runs at scale: the first has no bound on threads, and the second blocks a shared pool sized for CPU work. + ## Reidentify string `ReidentifyStringRequest` takes the tokenized text and an optional list of `RedactionLevel` rules. For flowvault vaults each rule targets a `tokenGroupName` and applies a named `redactionPattern`. Without rules every token is replaced by its original value. @@ -1788,7 +1851,7 @@ if (response.getStatus() == DetectRunStatus.SUCCESS) { } ``` -`ReidentifyFileResponse` carries `getStatus()`, `getOutputType()`, `getOutput()` (never `null`) and `getMetrics()`. This method is specific to the flowvault SDK. +`ReidentifyFileResponse` carries `getStatus()`, `getOutputType()`, `getOutput()` (never `null`) and `getMetrics()`. ## Get run diff --git a/flowvault/api-report/skyflow-flowvault-java.baseline.jar b/flowvault/api-report/skyflow-flowvault-java.baseline.jar index 733abb00cced1a4d560ad72fbc1204990731cb76..813b5c66bd070f9b4d27256f46e4a1eb8b7eab5f 100644 GIT binary patch delta 179092 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�~=Q+ai}Cz|(+4NHOsT$Vp>aj}KM))u2%#SOpTP{o&ECv3eVlhZFUKWeOVOQk=x^voudbMgjF z1l2jpg7R{0@64MM6b8QS+D{YQ=orgm+UPFHkYZ zK{M7Bn7G7!4Ia9H4;aJeU(-)?BDpiC)?(}U4)Agx#lap|JTUq=+lk_bY*h3E;Yy3| zeTVkO0NRs?_7snM6DKOTfc$I_3E)gDYfs+cbe>Mqg_1I7E{V&XC=>WZ{1! z?CDWsnHR=Jg@lNdkRdXOI_`e6GY`@)&zBkWk5`X_g%RzLF&pC$ojbI~+OKTeLb?9eLRY*;NDRj z(sbq4d$F%PC1jr3L4HwcM)Ww_t|V3Xu0||)+vtI0p3@5&9HNa!O}Z&&t?F^&8C7Z& zgXkmx@(uJ7GT3CYF#apWR5AmBmXFJ&>T!TTvbCZbkO7CNkNfeu%WcoO(XuDmf$5^}ji6}n}#vxi1gGBH38L5^T z@wUUM2e0|AL{iC|rfZA_+l?3ou>#4in={v_>$0X%##$K%YVXV^c@`TX!VVsGV zh9xqCA{;iaQO>Uy`>&DD-TPSjJN1OLr_V7K`k|xm9JYeRgjTY`&rk6{w=?G$-}_H7 zH%V(_)>wLH+EWM~0?ysDVnMw;9SY%~Z#)4}m`c1^rhgIpCidL_nl+v?i~ZedJXe5{ zu!uS*eaYH1eXjJq|2E_Xr|~>S?5`RheLo1K-WH@d@Wz4Y6mK)TCZ-Ddw~wCveruCi zMc|%)>1I*v??vPJ4CnbJ|2b;FEbBSrpWi4n@fKXaU;={IQs?B7uMkIk;6dCKojP-G zn2+AvWSdM$$dnD%%1Wo&@H5+$TQm=P&6L)cM#|F0MA|?0S8tX z4SoBzZ^)iD)tsYloSHl@=$diWXdUB>!op-om0II45#t{1Aw(l`{b1F+E{-}!vXsMZ z`pd-pm(Gi;gQ3&;fIoy?ihej@K?rzQK$UXS!PJxJ6QzkyOD7p3-6SW3AOP#(>ucC^ zXYq;c4wg2NYfI+DBjNitGju{Xe>pRqrA@`jpSV4x#?wFbUQ;f&B4uFl4{-Iy8%vMA z@)+?V2zhNKy;l^iBaQ((GN&-lE&1}@Xswz#gYLqn1?CzA3reU=UkA>~ zUaQ7WpRv6**>59}wg^UyQH}5w=@CXmf&IOO=!<~p8%C#_Y_og@djiT#skx%>$@pdP zj`dY<)();yc#%TGx(c2ix4n3pi9vfNPGZ2i&N$rfhz#mHR9CM2ycqI2vFUEVh!FOl zO>y1fSl_!v72}IKo1|e#_SI_)g3+;cZ$S$$#Fw|ETzad;88#9Rb{1!&%^iBKIU59v z-(sO+7>8l1;`cOOx;}t7M9o8TJT{Q=lx)3FlsN6%ITty4M~4YgkB*pTebkev@=YMh z@4wX>WDmTh&{XUw*<5^}VCV2rN@>H@uFN+j?eXVLtYfV|rntu5?>;2(v5~6UYc{kU zN1;&*Fow&`=2)RniXfb@Tlf@!9Za@LpD=w`-LC%{)oyU>A}AC@j6SV`lk;=o5_KC8 zC^T42ztXAdhY`w!8zOHOsOLgcjUOhlAw|$~R4@bDYY@sa!F^Xk7j;$QYPHaKjLNOu zlb9t)TbhQ2_&^<6B+vmDyMYHBIA`dw&DUlMDa8IfwAZJXA5%=ACsC*04$3JC!fo7& zjWUXfGRerLo(Kl<&!;Q8=okeArBi8GQ8a+Oyx4Zm=f%XNyLt=AW=yU1ep6{oS@h3v z-*L&=$4o_7q{yv}p>8QwebiJHqhj1?pt0f?A{~!*anc?&mfqE$seXqxfem6slj?;Z zi0dr7whX1qW#K(|i3prXA?J@!Bw^LYiB&m(MV{Ab@ofYZxHZ7d;n5eK&bse>6_ZnB zVZ~ihS_R(uir*2%1V*qVmE|`^^A#i^_q6j`N`+076=mvY(aN-AD&Lg|%LQn(x%KSm z%c%7ECYdv{VW}Eqq}URoWOk)(+>Mv-=!K{i)(p7lAIg8W(Q~cj%~d)#9_3^jn2(|U zlI0ofN5=_@ZB@)RSxopGX)?XT{9vmwFkrr`=o$^AqjR3gDE0k2Yhc5B{h;q2gxC57 zOm zQ?3KXE|$i7&q6*tCo0Jm_XnQ>cwBLG=o;|`&T1d%zQKg{>J9bUmjn7$U_t|VdA`EK zN4i_0SFMpT$FF$mK-DqF9@MccrgmTQ$jZ3Z!$H{HDcBz?%7c_Z6Y&p8*gZCpZ{&XQ zQwN^nDrl|~4%0;mrxe;#BrQSs0=;!Fi2ae;ViRkV@Jp|nKk%Lv6_e^Xsbry8AQMad zWoS|VLm_)v>~+iVYw|*XpMn7w@3d4Jg;vewSfGSXS5Ve$8mrat_k(peWj|UQE1NZc zu(TD7CZlL0 zaxV~qw8?UZ4fq@Nkg?z zxlSixHOL@^a%UZ9z;+p$adpeeWppo8%rMr zC7cs+I7Q@aI}Hgevv7q2%^B%+L>4P)%l<2R16046X|w?znEAph-S4SP+RO7{%&W{= zMW)IsUyM^DcZ#iw!IsI6pKRNEwwBL^E)0qs{`eBuCX5BM_fF-2j6X(x)|MQ}j9_15 zwV(OZtmSO~$palj@Hb&7_t5TW=CFT(3~~rJ!>e<;U|XN&uAD6&%0OyfzEWsCBUX}* zgBVOepF)lBYX-sXOr?Ba3k91Yt1A)h$2AN+$ytseo%6hzwh!5Sx^O^sT~$?CcDY50 zl>5Zq$&id3(R>UtXriW}P4PI@+G`*KD-?QnJP0<|r)yZgYh~3c~thK6jJ|f6g%^^CclOMVYzbV!Oz&l#G<|^SO z)ED|1mQJ5y<7WCZH%4AA_E*z4D|eCsRViXT)(PPSHH4z}Km5&D7u>n`!&g^54SD47>4$Dt?>I zi_&y&uH2$2QUEb+{B9xjLhc#52+=;zi@e*<#l`Gh@*b{YuxFKzTom3e^p=rCKs*RS zR`%BMfpe{T3pz2=1|RE;cHrDGxKi-j`F|;hHep4N=mK)MtGj&JyEpTe=);UvRo>lH z+l6NSb$|@j2>tq2x)R*fmA8y&Kn-_x;vPGO*sb@W0>ar7@E>754sHEz%?C0NWQjvF z|6d>!LFSED9l=J8WqnBEYRR`Vv4ZjI936kDc?e zYi|@7^5s6!GL%}UExals8ez-yOL5o?NEhX_5aVN>vGeY)_vT3<-aYxC-HkcH7wQN+ ztfars!V8tuGaD57=9o$$i|z`7x}k$g5t#$3LpLs~*zZ0i=)J_g9b5L&mJG<{X$9LI zdMZ(Fpt_HI9c;?qJ})no{wh86j}DArNGeHipm&iO!U?s2_)38%m|IDV_Gt@!#=qRC zc_;s6@Y-uk)^}Cu_T4t8h6b5cXplL?uwTpA7XFoVkQ$;^R5Q~^QYv3)LBtU&SQ_I7 zT9{Q>nz{5YOn(2@o=iAazyso_oA4{flf&Q#=q%`1TT!ZQ375b2zA|@}>6m`L#a^ZK zz`C%Q@g`%Vt7n7`&uEjev^~&118wc@(+Ick7~^dfZo$jo1Pu!h6DN8BH_7`|aJ=cV z8BT_M+p>7jst*G}KUQfKzLLm?j!VtLJv-nXOPJ)EOj==|oTjv{Zq|f-tehn(<2gVsMwwWldSjO@T1oT+1&kJ0H>HXje{TE1!Kerm$GH%8* z0m~-x8+P8&%~yNuBMQwK_J(@7VO4bIHUD5}#I3n=zI9TTUUf;OVXs-Ipg3P4*+^Ji z&9&PnZi#gN`;npr`TQ-`B8A~gP8fT%0gy%zWqBY4`h?m05S#C0MfkZM60dq<;wcOr z&>j+)yI+aBtOnraf8FP3CKhEJR}Ef_wfTMbB72?KKhS{>BXiqo`%+`sCJMc0xp7apFg8TN- z`VYCnZvUqC8FH}N5&ZiVX!-UymdLcOQZa2VHFN~(#l-FCIs(GhdsaPvg~G{|XOX>m?*r0fzTK7=zNdc?5$HssHnhKR8hTKeT`X$<~2cdC~#| z%F_Nb>Z76|IaV+T|G_I%Ge9t=0+d%Q8yKJeg?rwRr`df+nCJF`|IsG|Dj~x2r$c^h z(8A7>@}YeGePaFTo-yJHgACGvb{gQ`qgdJ#5K#vcxeQTZlkfZ`3!;izI3ZRtJrW?jyUjW%|#*DXP4hx`p?XAh2B8A7P2)Hh=Ouu8d= z7NeCvCt9eWhufvo7ar>avPrr6qHiTJm zz+>T^ZVHF)f&;hlz0@bnn~vC-gcAxooleC{?7{fWcxCh^7GNnRATCrdKn7cD1M^lF6|LRiyj zwDXeCh}9RQT;ws7#^TAh9Cm&&mxK%km0x_{Gs?j)lNhAvsVFT^3$towfL=%PX-7GT zNi7lbyu<&44;mz=*{;WF#XZ(MC;!D}@54RCp-%8yghMMirS!glPFlXtF!vzmvD@H< zOw;i)JUnT8Y}cT5I-6HNFNt2aXz1)jq8po?uFXm4WMnBy{Zu#)wA)~?=>S7g$mqJx zu-AE7h(gM*e3MN;8YRd}P(c9NZ6M|{I!ewvLCb&*;*%v(_%N(6Lmnpx?~32kVm)Ab zUa_wkk4;f=mf6M`0?S8(GCwk@N|70>RkeeR=g%i2nOdO~D7aF)U7{Q^%egJEl~>AM z^W%+KG5rSW25yJ4%PS)e^@9U944fKHkyu~?2qXq!Y;8xSeOe0^FdSl%R3hhU0Ov zZB6ld8?+r3Dl5q%^%k}z)5@pQ*5%(V|G=Uo_=-F*Sz)-s-M7Y>32eTq^R$GV!W^9H&w<()i zh8llF%#1g2Ws{Wk{)V zie@BfHQ;5Ixh>jDWohsd^`N6>Ty;c=vG+15frNWa>!vfu+Un|d9HMlX@%`MzE!<@3 z_);+aaU{{?56HecwZia_B{_D%H120eD&azE)wkooho3PrS0~lTiiTg8#Y0v>3!aK77_qYN4m=MXdPf`#k3)rI+84ePHo`Td&U{4AFk^d0$J z8hwaZ1n(ta4&f_9Hraqx z50kW{l+r~t=AHfeg_Vn9vTKWSwoS$Wyvm!}jy$0eI=OW|hHTSTG1gq=vLHF7nok`Q zgILPSMeC74)y^F7U$WvOgZkRP(URaz{CvP0^ODGpwSx&Rnu(ywDUBXIGBF2*-3gMf$@9G5%$k}0)vNF6+n2RiRi|p#-bW7B|9t{!dsfDh+yfdiLM2nmhO?0Ez{e_E{z5My_f0Qf-+jRBU1%(P2zl z378-X<9x2$pX(BDtAry!X9btjNJfxy)aY^s<9^t53A6J1NW9P-AmsL*%T`q1R7XS5g45EUAZBU8}qPa2|JY}6fv zya-5*XU`b_QslN4T$SZ-k<1B(RUj^wOC#{yLyc?Po(HUIqA{j z=Gl53-z+zqcXGd)P0-kc`UB^hKv#Bu0LZZ}#nPTFu{kRVBBb*m8>{PCoQ#y7@|5?D zxcWE=H6u+MOIv2T*eo~wtd@aL=ye4o`ZBAib696`crCxs0cx1MVv;L`sSYiK4uYcC znr5Q@(m}}nJ4px~utVrTMSx6$K;0RMFd2Y^&k8o^`fk2OrCpLLetk=~u~#%pDZDMc z|9(Utsy)-#w#k(D0l>N{lZqN+xXjLC3+d+}MOzr2)}zP*rR-iLM+Ib+6n)*Lp2~L6 zZotGax<=`o3>mSJ%es!ksfgMW~tH_p?Dl%H>!)!=(Iv<(h7N+!_L>tCPTL}4PWx0&u~ks4XREcI9GI#p6!3znCrEXtt^?yunf16=3eQEMqOoX0Pq8>Q zw)C)3nB_6_0qK*1)b9E_%AqeGv7@ldThe%nFyQ-Tqsa^VcX#?xm}8S<1ou^+UyM#n zJzY2AT~Rfs;2?%KRH7G?k>wdVF~^yvUHwGdf=Nyn94(72V%fBGiym0t}}1Cp?)s7;7>yUmic*563sG7^7!(xwMDF37)I5 z#E>Xy(;E1^^52hy7$j)F_1{MKm~z-+zSANtuLR&U7S7(w{9u?DB2j+D6>AH}0h{(o zY*Qi;ev@PJwTlKFM1zh?yBDkchG?Y9BDiz|z4` z_`ql;@iYYm)~clSoslbxrAONzRGr_JGk5_XqCG?fa>U7^-wnpRsth(xS%a(Oj!r_< znh?p*h}`!tn<$>^J^02TRD<%IFw%?nWc-sSn$-B}lPHt8V9oSg1DNOiFXl5$hgoc^ zKK(t4&kUb6tuTI}jp{(DbL3DTA|^*fFUA0}S7V)0TC--J=~Xpo*9%Sv3#^~;lR;CF zEw)>x8BN^q#{&8Cn?yYWQ*D$>A3n}BZIBFEtH;L!0~94AzXUrDrjm#ghSL2UEJju+ z(>rnfB+_2@y-_H5WX-_vxeU?4(DRQ8<`5zkR}vBKb%!y|H$#{d$p0dXSWJ-=)j$oj z13o((q9v+#AtEPkWN>A0(^pjTJHyt?lEPT4@KJgnb()1e#d1#W3lK*|A5y=Zj#Nv! zP~A_cZ*yx>wi40oG>5QJzH(f*#a*?BdNc@PhgbaY=Wm`n!dl*y9s>8H{}b-@A*0g% z^8#l_Ln#5=|ABsp)X;qY%=C4Ug-ZsOdm~Yrg3r!lRkW||4fTI%jdo$NSwWB6I;$89 z!-?kt;7j=bg`(+G~8qxU>rGfpTG+x9AX45Jz;my-mjq32fN@MrSr=%Pc zEzD}gRhw0@REW|jF2K6|M`^g}IkMP}BBRi2_1F35yl@KcXxcr}Q8BW`8ht&=JDP|x zulMg*Iex)Y0AHSbsQUHejL&=2G%xm^TTV`H0HTXjbG+|@xt&R-says4g*m3S*4Yh~ z%lnyK`%3O!TD`EC_^9Su8V6g+|B%X2a@NvIu(>2JFyA~U@2MOKwa~FKPo$Q8%>I%m zcZno~ii3W!NEAAu>YOOZvdpbL=VZ2;A*Gg*kGp|P{;$v=@F$95tHaZM6A84i*~LsY zPmzkr#ar_esZSSdunJ7pt)I}0D;aOOQ!p{tt3MelgVLf1gJwit+|AcyPD_zV2sv%o zJ_*x8)@Lz}d@VtONc4{KlQ~t^#qIc__!V^13iQkR3(n-|B_9aR{eDdOp!Q2&MrfTU zM|JN}kVOovSes}^+D#P?0arv92Ljb(flqD|Z_2vZvZ2~#Nj%xBB0VN|e}xfY(u&L= z{2IjR4tJ_yest%C52@nEEU--94WmnK90M84ZseBb(oS!9xp zbmjC^qC$*EClY41T@j7LcZa0a6z|mln<=)>2nOxeEW2WAXLvB$NOJJBb_(eghoj3q zyhHrQ&M&#<_#v(pk23acaJ3@ONjz8I)9b&vW=kOUCD^Qu>s)N=xmQ9t+p|6|2j=UN z`YSYy5kOU)_T}90z=lpIqYft_qoF&@Df^Kwk3{+1d*aa{FmX0g?o-?$r~l0Eq;WZD z;w??*_*GwxUy4P>Q#Lc@T*oXG5AP=kv-sba8{vp(yEosxdb1~QSaZdytMFOYcn0u| zDQdf`!ORF7k~Kn>2j_9<4Q)gh(FMy-iNAqP4HmmV_y)g=1bVH4Ak!)9LYc0hIqom8 zuO|;ny!0q^M65RQgPCL7$uNm+ZYfbI2A()0FH2jJ)0WOZbj!eRW^$qcwr~{DRj?RaxMj%4PtAdKGEO0Lnf<-m zRr9YRIYkBDHFIj=mm%+*>DjO8u)VXr3irM=M}jYn#&CHb%Of9bflsydfZP?#eg)gI z!Ql2SH}Q1#3ggrzy_txiPz(qq>4ZwrAEdiMo^PnFPuP;U!S{cw-_La;xN!u$B{2E$ zP3|{5)&nlllc30r>XBv^)t^R+T+`2+t~aGsUznn3K-oB@R!|r#rD+2g$KIf@Kh9b4 z#a&8eQ!rf-Nd*BE-5;G(m6N}Ss2L1vg!Tl9+9MeBfU>W;M8ZA=vBA{R!6A~XI&Hz$ z(`Z#uW^<^mj{Nz+VUNm3Sc`~cyR1-3@mk%SqDQ*#>m_5Cyh4!MTN)Qs>j}HDOa$6o zQUj^@*r!mI2VEk;L{D0Rni8irJnyRpmCjVv<~M7dUW%}uu*7So@RJnae|^r7)gwfH z2>ERNPx1jnw1yqvLFhr4!tgT!Y)3Y;z4NiRtcqJpgmqk03u0zjq}dx8rDay^kF&D9UBvyhdk0(Az1 zuy#e;lix#5EmxXEPRt2c$fp98soBTtc<0mnw3fs(+JqOY3W%m&2xbzuN#BvdQu^&K zhMoCht0=_EDvmLmFo9J_42HRT-?9kN9hiFW(w>7m zUrnIy1lV~ynX|*o-gbH2!$v73hcGVEdwn0Oqi@ms9P`e(x76QD9e}8pw@&fKyGiw_ z`9n0532pg7l|!xtWX_o3Z_0ziw!OMw2i7abH8BW$@xl_O{YTfdf4SMg=p$tkDJW=8 zHnFWD7oywROv}@EKp3Xbdp0-1r{`q1t8CrOORb70e}lp&5|QlOBP>FLbY*;r^;9e; zXF-i(Mv@xhWU0;q^zjcc7q9x~wN7PjvT@WBuo$Y(vkTZ_3V9e2xaHndy;nF*TDYi+ zLd_~HVEA5|{97DW zbwM*Q5G%{)VVq9N!Z)|=j4eSK@O-3)? zXi(6G0;j3^WBd2`ybWDS-*Z+e7jB2fkRc%rT^j8`duL}UTC}ic*%$4S+6Q8YODfB` zDSvho9Dk&{Gm>^>3M*S9M`$2OLsM~4NVmcHy41rv;d_kx!Z6803M(Fa7IaK232v*- z_K6RLH4e);CCqfq$(yAvY#Z^Ww=V<(^jxmXX)Z$;hKG^`KR3HB7tTHDow-{!UUqrCj@XqN6`02dSJU5|GX5RbOpNZ|bPrjbJ|20ZQcEziepN z+A;jO^d((qYn4un$48hK=XJh-q)cB=00s5iOg9+Q0VUVWG#tO2GehdMoX~qm)O4;5*?cDswnQuK7D)!HBl;B{Uyz3f68wB*V^uVtDijt!O5F2g67WoS*h{cvNPQ2> zADO#Is~t#=p$rwyDmL?mriIuUzH#dkR`B)DUUTg+-QwS?eVuJ&2a?}>F)T5~;j={c zgqAUU5JUMfy8zon_4~Q+AnIn+{P+F4mqHqM4Xn-!!5sfz1fvHoPlPgpy7B}gCPB#p zi)(S|22ar;ouDtQ>#iwLHX%5osvYVd5-(kuEF-9fAyJ6&`@fBlTYBJmTW3qQmqy4I zFR&giqR1c>Os2Y>2(nl#N28ms+94s)ZkS>YF}wZjhe;(=dmJRv7#$d0b-R8KofEm3 z`v8cjnCh-F^=)!>S{(h#b`-+}P!Mb6kjcxD9H}XXm*T3;%I+fZ)o>>^Zoy(>9$D}- zAc%);qLFJiei7!juY)s;74*^&`8eq6m6N~iOcDxxv$w?HDHs-O`K`NrT#(S;Kl{my zv7e*BSIEM4TFj?vS_AI-qnE&KP>nNTNq$BMR?RvfPVf1o_=FO=s6t&2mT9IcxYm7+1&7A0V& z27w&un)XDI|KwxH_}vArgHpwEVZsR{2oW(}yY=EinZCGC&exf0AHhV5$!aq^-1VGt z5Us%1kz;RCJ&_m4Mv4R8Z>F?f7D&nbHwmG@_iqxy;5{rP2_aQ&+ZuxkhEIhehIx}J zui^q`guDeVLX0n6ruHt{#asL7pNiBJA20yAmjVMZgY75`Hm2W4g;XeX(!q(y^54%{ z$C*h2#)>Zm25~%oyOsPgHLVuz{kFnop4)K!A5DVthAK9+!;0HQ!*ie?#hIx^{=fR= z!2De#{K=`Pr)=V&BX6^^cW}OA%?i57Hhemy;PF%_UdrmyAY+0+NK@h#^q#Dvx=)YB z^eL9sRd$iKUYA*DQT;xXmgyy!77X!r=!$<9dvli8ER6UISnG))5V!Ze?AAwr>}Fhg z(TVqiGOcVLF~%uf|Kx=2}_hNZJyGPqjY6gl^e;TA`sKIux?4{={NP z%f{&l2jzPY^p{@lkqxkW7hUksTfEW2Myh-xsRiwwW!Ptf_^nAp&QZ+1vI-HHSKm38 z&_9b)dp(bXaGB~IgHXu7A_5F#;~!D zNw{W3_{i_E!6SIP3{NlOK|Okap-emslQqP`M@yjpQ8(*G>b(JX{vaGl7f)4q7C{Te0>H4w^2 zfjRvp$shYp3RUgB(pi2`oe~=im?(ZTrC23VT6`|J5BPwHNBRPwdB+fMXb~fCzm!9p z00N+96lf;|-b@13`URcsQnx1GLd^=UQSY?9ucUg5yxNvG)@`JCGT4_m*+5w_^5Ia# z?xKzg^^F{V`!p;k@C z>0ViZpT6GB3oerk4zj1?Q1Y1*{Ir5(&a{x!-H}rAQuw3#5o)`h3B<{l z1w_hq-42?9u!$(@t-kRYpC!K-F3?Dar&PPb%T0-^$OX9D#a6|b)isB0>&~;p2);ch zrQLPw6y91@UebdiO{y;#O0li^x&@nh@aP3YtH{Do{=ra>z*XA#P8=@rWpIO|L~B%t z)TGLk>7_pi-_@&BL!A`qMkj83;dSxTsvF_=?zEhw?djKOlJsLOk26<~VjQC~kSnn2 zEZL_w1XgqkR+%G0B0k#RN9cSs%XlBe!a^~^folWqk>+*VKbJDV#Ih%C`Mp2H79&Yy zk*VdtUY0Kh*EDhkj?aR^0}85H2Z(K2W6&rGSBYH`^*bu#RQMu)>!q^1wHMTV8w3*k z<;*2%a{mTPPQ~TdMCD-Qk|===0nLHTNl-<1jT5n{Q31jrf|;(Go(cqF=R{v1mbX_DTFwnHHH;H2p|v#{$2K*SEQ?OiyyR$9bTXglp(zy9|k zZteFC5V4|c+&Dp}{7VftwKJW`4N}8pAtnE55k=trn3MmL3X&Ytv42U9EkTlFiR;sU zlVh9s72PF}IWe9823ovn-es`XeQG)3K}duVQDKzRTA5l&yKJY{^CYt>-_Vl9nhd)_;y4dtpQhS8SCq=05`7eCKB+eOAs|J;&Hv#j89?`(GUf4&`sczi94rvd~(E~hXfKc)r z|Mxk6=;phEW4>eOq%(*2%jTk;k(YPqA2w3W0Alaipl+N(_1B`$MCfTnPm`+s0D7qz zPN_?MdY>*2qbYZ2D|}-FOCUK-XRHJSuX`k<>g8BJ|KvSj$#me2E;(% zEm>(Q%wo@mKTlt6Lga?Sp@LgxBT4eQB1(v7%^V)zO4~zjlL6 z!-Rx~{?2oed1QAj(?W^XP6P>V-#?u0|Ig@c_-A#->e{Kmm zErt*r=@0$o??uR8D*X4&-$$zofW`;l{RkGc|9nm{kKL;0%(X`o!H-yCS! zSe!?7WL#-*=TXSu*!+>eabu;qlv5}Z4x-W0tE}hSj!~x$8w@vegM(M-_ zlSY$QH%~aQ@3zO=*V>b^S?a?n@cGn#;o;|P_pQa2=I8TsMQ9$16MIoPBS|`de`VJ& zGxwq)?uxfvk8Af9S(@kYu1D~gL(C`?BvFN-CCI^#{Z(<lU78|s)`mWDWKIRj)- z-Yt~g?%?atk@q2MVq!TkS*utKjCL&Mz_Pi80JZB1ZSeD5mL8k`j5p8ePF7R0L1Ce~ z%qebbt=HsYR+0;3h+y_tDbiu!oq~mwK*~h%lwtcp(PFO-VTszlNs8-|k+#mETNPM` zpK8aC8oSOxgfAjQGV2gTZO(nLNMT;R-0)aTvsz*rjWN%gn?PxZVmDi_k5aWA$UfPH zRLf(tZv`%NZbmZrS&s9oxKIq#N=LMRX);nT$cN@)SEv(0^EI-)iI4}_ymamQ3TgI} z{Yegg(>H&+zqf84Qx(_Fot=+QJ1mXuf3?3jWnSR-G00_$i}3BX)NZ*Q3;T{miC{Q8 z#}S{wGIPmKW~OMh4*g-{@}>$7eUvQ)LP?5W42ojbcWI#KiuLm&PU`;tVfWRE*$6Gp z5@(fRT7|j1P2Oa}R8?8Pi|O$3E?Do$-*3dM~-;h;7QL))Z{fEoV%QQJT!b{_|B1_K*Tb_tizftAucvXazCK3wz4 zH?GhFN}WW7q>!8*CZ?>r;9PWDpo)BWu6UVdSs-cu!VQ-1Ld61_I-f?x%7gYI0)$`8 zaFL-rieYn50+IyUAgmJQ?Efp4YQ8M+83+Evi zhcx1%IR(pw5%q_TAG=HG`#pOjq)WH!Px5y{gv4KNXL&WzaK^SQN6+2U|6HmzaeAa$ zzw>H2C8jrxf#J>gUGMVl+pCp7@gU+a?+~hvJlP$bvTUjvb=a3U%h$tU@H`$KGS3U| z>Zu;vK$ho#vCgLp_+99Q%Lmx9A5i@0cTkL`!IlQxKF(G=-prVW&Fff?6hhxZa=)D` z3rHe2D1F*VbKMc(7pKLmO52Rd#!n(lmF68jIPa_=9CP-5FA zSyWB>Tu!WTw$-Y2RVeCI%pnH-5C$1nraGd0*~FAI_#oatR)&TJn!z>em@m7 ze!UH7<$Z&6#^#Y*+)({OAiqvxqKZP zCP$ZzMyGnI?2>-*S&r+pxYC5thh{6(Ydhbyi%n$voEbBqT|dgNJIoMkgbCN1cA!0L zlRsS;&*kX5T&U||0xq@b_Pq@iwJwz|YGD{4j~CEf^J~xHRvt3`FH!H;DHihQny8Lt zM>4b<^adX^JpsfFS@`(;V>}_n*23km@4e>wt~=)4(|L^bdHQpe6p~acoR6R{XB$-B zN&4S$WaHaWkUuMW<`$QXv0@#5%NR4aY`54s@@BRz9Y5BjNeB-K`%uKcxbeEuW(4~b zxR^T@V&(I4@uNAojutB;w89*kN*+dv)otN_=<*6M=zWeWYRgOoZvS!g(xqcd|oo?d{DtFp2-AHVMdUpn=+vpDw02yFBTUtKZVqCbmXDy*VKxEGBPR(sBx$_=6 zkYnMlpOR^7N_#W&=`oeLb5Mq_d2J(OZ-cN=q7^Of$2mTGrtUHO9k6*+7HF{ zj!p3Kd-h3M1#Ox8TQn@1hg!k-yKMxhaR^fQ;fc!@^4rm?+7*q@z z#uTjY@C13jgUW_3jp`TuF1Eerdgm5M9mVjTRo6tb8%d+uls-pu5-5U%syTeg$4faM zTff|Gq{n{Wx*4?zB`BY*^H2$rSqj0GcW#uOI^nzP+X@%xK`j~luh1D*m~Cp* zuTw4!ej2Ood^-A21h2aGOsVjljW9h==JVWm+ZRb0^h1~u+lL4Pnq-^mIv{x3jKMv( z<_AIfa@3Zi40`69F7YSKnxk!@s8HJ7wrRf~uh^7}J2Do@SQ^#1pa1BkdKQ&N9=o3g zAKazdstfQOIY?_9y*bkG*;iGo9|)!TW=#)B9DS2~|gS9vX<;ZRf{yKI3U>mUPuhHPiA|9x6EWs69_vZK(b5 z!!*>Udm3C#rIsO7ch71Oju6pDiZs5@VCPGQ;p6K}4Va;=Yasb-LXzq6Mn`fr#ubz_ zamtI;)xywIthe02nwEaaAJP^l#N1AMNF7+7uKfulnWBTNohXq*IB;d%ZDS5A!qI z@o?YbcJ#M@h1N(?Ttg&tE!Dx^)fv-gf$aB}Op&lT7E`9M=~k~*LZ@UA zgB=K$%=*e7VZ%i%BCLL#UX&wN-vOzdl&Kb}-si|g70&di0gFt?V~J!Q7HY$uieyJ4 zXy-jY9L+U9yhiAvd|vn-g%+U+b8p7`?l;w>DDQDdQBbRpo!N(I*v)&@4xjd*}>3HOROl7!3rf{;LE z^^R4(j(tEqNT1XKo=@~E>JiF1`VqWyHVLXpP9FQfA$*5uS709hKqlNxm{+2aVMOcu zs}L`G5yyzuSanE2erUie`6R4%x<}*#@`{kiDA$L1qaNT6%^-jXSuVgN^j?}OGwso> z@Sa_+h2_4HeqxHHJ!3T2kqrox4j!Gd*E{SRzzmvQMQX1^6<=XS8ue~w?} z;@f`xY}5gO_dj#!Onf%^{c094#o77A<{z>DnSDM3n7SgA`%`F~@n_&lx#Y9Sz(g&Z zKlbb&n=1A{vHR$9e>&@bKE5k?oA%sM-}}g15}y7{Y+CqDk?jfDH0l1cT$~giQ%F58 zlgU?JVrLB;d*_*vtZ3BI(M2?DJXb0*h3I-tCJokI;AceR@*)N|F=E}Ko#Nsg+I+(Q-(Kx#o z5v~6-s(^m z_s1+TK*CdRbux=vJc~c3+u51gH7ABgGS=VOIfmCUlE)KQ(AhbQ*D;odI_75^&uCU_ zHv??W@JcRy%e3X*BDBU#KHZ;%2^&5n-TgfFz4yAZZ<8Y{o5Fto-(byL%WHr&8IHO=bjJiSrj^oBODG~q;ZJW@9ow4v|{Qww7%HsEP1583K{1Q z8W0LEtY_ZPI;z}r)C%mx<5GGU{$3(TN`=e(MEp|pdZWGZN&y8jqLuRhPs)J(=LA(S zL}7pUt4!@d(EkY8_#Y5OJ-v#A3U<m@%tqsCJi`)N5-HzVqx5 zDw)?*aG{f-KMcFg+=Tx_NcuDJN$?%@|P?jR^ zZeb}VM&{f#diCMUMzX_5fmyp)ZxVbLj*&UicOVHKIy8J0>A+4(Ccnx@*vA;GZ_~~2 zd!lswfXn{H`o5XilRM6<;duY#)Rg95#BOL#` z{%)t`uYG72i|j@vu#IkM$ke1)(N#X;*5)wQQZ{jqS%AA-N`|H%>83E-1_29vrUr{< zxVICVXeD1R&{W$rugPC%kzR`zXo(B6b6EFEp%|)&URO_e4;_|;ohyc^`f_PA92RkO zX&8l#EhzbLEm(Z3s4OQw3{*pF80)0&YP9!$(gY9Ysl2?F@p5i^ypqC0Ts%E)l5VEx z`E|a#H(&&>W>u#aZZ4cR5;F{iB#xCJTaiLk64qsIprKaDV%va8d;*J?MFB1T4V4Mp z`^+Jl1`Qh>^?O1lknhY^skR?M3pcDTjWa>E7S2y>1XS@yiQBf%rWvKQA9riMtZ~+V z%WmvYg0WT@2YZE{_uZGawR#aFsY}b=CA_S{egID^n&tPII9Zc{_PQZkx10Hwx1<=H zrS%lO<=xe5dW4g~*KoLFBH^l$yv~Q*&b0xr^~!q1Ap?+Nl)OIrgq%5j9ZAchq+Bj7 zNfEYU*Wv3uHFOBYe5VHmwsA^F0ryLU^iCuOkzmo~VvLo_DU|o7z(Je9-P9VKG}?Z7 zPY39FG@~p?i54=lYDKw4FYG%Bt_r)O5|`0khyM(zW7whL(c~0}xuZZ!a{Rtdg*heK zkK>;zm(Ee?R0YdTU7*27qen@I6kBn0T+O!%+lp>$sG_59fQz?O6$DqxH8Dm|DV0}Q zy{15T64Ys3M_DXkMVufNQ~DvKY{IGh?KAM|*2XCp<+dN1Lqmab)cV1esv=lOJE6|m zXlJwzv&H%>9%aQieDp$$N8Z@pUcOo+C}@+_V(hA(@`|_K=_}G`Xvaqv(nBGeCyg|c zeZ^oDe#%>E^#Lj+;b48Z?&I5st(1;Ow9QKUBd&fTLZZ;&2n*HujoMm#Rn-$!h5|s! zplcaA_ACTR9Y`KkNvLjRPyIe$#h|Z+8z@VyP~4jvu{biiIu!9Oj zEIMs{{jjrZ)YxrfC8WJtgw90!Pl2cTW?y*t^`h<-!cWb^%f#;iIxbZ2nQ7ROVW}YLy}${b;c& z*9aNI0qzY+7tWv;}sbe5P8(F#azrIJZuUDQp43&=7sSlDB3h4FnMzyp&LsA zh?5=2+ud|XGn1nqjOYmP#PsnK;R|+2B9-EYtNsc`D77PwOELoRBG2~Ly+wDqo(;-7 z!l+3I@FiXFe|{AfIv$$g1BpOT4zJzSj5H+0d3$P7eIQ#>lC{d252WdVZq1}2#Mr4^ zwE0m0H9tH7LlP;Hk(KGgMr6I|O6!IhVYIo*!Kw%OZE}Ep1!&fZkMdQbL`?I2i>zrw z#NCsw)qa}_eK^1*eaj&>oX&%oUn$t_;-n0XX2;u3D*(T1#iKdw%{JlUm5Tf1fgrWj z`#r0x=)x-sbZOp`Y`-nrt6Q)ohbC5fpcRFP+L6YqhynJJFDSg=Zy$8o$MQd~U`o4R zGa&>U!3+}U?w~VRnSFSxGa&ywWiA4$a||7Ks~Vu=WCZM)O%tCkbr5Qjjo8;HY7D7eJg!eRoc~k9doJV2}=Guz^p*6yHK=D71CcqxVhMz`BA< zqN|{jA_jIhyzy!l&i%Sb;@|L>rg2`-diyjxZns6L_qdSfX6vY`(h{>^iQ~3?$)=RJ z#Oz`Ec5brzX}U*1jZ&j$X9{u(ud$X|QR=tA^>Vfk+~vqM-4bXlmWIIBgQ7S~rl<&cU7Gq&xldl~tDMzt>GScW(8&R-r)PnL&D zd4+>KH}r>0x8e`w1tmcF<>W%;*gD|1ts`e1idWPlq??;VzSeulf-)_@=a2o+;ZMR$ z5`O^QRF_Qr}oGh)=>%ZzbDlzg@m)*OAval zI~<;CM2zWPoojsbZQUs36QaWPGxH5T@~;Ict`U!RAUlwla_vgC#jR_&q@zcUz%RadINu=&uWY!tfVYl#>?z;IA84B+aWng@~LNPY#Lr941 zm1Se~;q=GuOo1Hu&{7CKV5sZk&_IWc~`Z*%l8cP zIS=ctBR+YvvISGUbP}?miY_^1e)Ty{gXWv-XrriaCeJ0C;5*Nd8jm1iyE^f6>{d7{ zvZYFbTww36d25bvykFOZ?a*!QPEp$VPpFb>8pcAe_h61vDQrOL=ItGH5Yuabqd()W zorKE4f+AjVGGc^k6U`10>(Bf-b&3j~q8;({IrhUq%T}!d`pR4PM@*p5<%R@x9zEnS zgioP2@b%FGPDOi;*D3iRJEY44S}YY42P(7x1}636NwW3%9EMvlgSI76s%Y>0jtul5 z61R`#>Xco;2k`Ez&}s&C%W4XM@M0)q(#)FAw*MRI@*=A}-+((K+)-O@Y=^dPcC+d6 zcB1vTCd`(0K!xW(8P9K=d1Xt3`AC`;*Byg}i}X&h4JIw@3!AFSg1hkbIWmSC+PI;P z!>YH3(xaMBF4o)i7boczA60|xlWo2MFd;C4*oW1Paw(ouSru?qKOF19TshG10BsQC zA&RwgRTY1eE#0AoHy?k-Homs!$aP7>362lnhPJ1bJ`tBNU$<$2El~Z=C(Xck;TY+AUCoIClneP0Hz2|)VA|iqq z>o--IvGYqfT=QccVroANv^_rpzO4<;eE78uClNQW!Ey(#6e?)q@^1I#NXOUhGTr5YxP+bI-(v}9kD+faR7ie^`!bG_^) ziR8(qYe`+ti(w%R-5VXo9QnM)k|6|YBd=HAGQKRr=EcpoOcGnOxU^ORq|LtpS#)pP zG1l|@FNtS!SYx8Z{CQ8aYO-Z!J4-&l;$ z&$Sok6)lsk&g$~kpkMb5rkyKhDS@*l>hjlWyY@+iqyVz2^pd167#fmyfw8n_Sd|M) z2rX#6`s?88c;=I)ciQo~fLRW4PM=2OET>1<w18K#6)6l#!RnnSYP7G=;_!S`ECCb6PzHTwZT;O_b=+FPhYHP*?g%saMae7~eYNjf%r$4s<%Vg78V1VhI+_yHW41*jkM*2kX3E;+*n`C4LiMBHWS*nH zeb4>2I1aZ2$p18k`EGXBpy}R{+Z{H|`n|KVm=sYaY6pwVZ1FdRB{r6jsbrjyS%t~+kJV{-R4Nki%vX9~SpeGMx$%BmfJ@DSl& zRj*j|!#`@8SK_?H5T#MzJXdU3134x02`1mSjBH2_pe15={e9K9!Rm@7N0*_;A$Idv z%lCl)kk}#h^YdhBLCmJ?k+@2~;rmO^9CzHui z9j=ng-XL(Wi{{MfEWOva1dMCFonRcro5EVT0AGP<0v5-@OSi#;)Oj^E+b%{?1t`@L zqMX+ckp<@{e5W+DI$>K_^8$s^b6&8WA$QoPRhLXQgi_zlYxX~O)so&!bRKrSJ&l|m z_2a_jlC~`Rbgk_5E5ZK+N9e=ePWPw*l)hBBSpdd8!_T+t`@b@C2Kdvn-g8U8eK$ph zJqSFEPKcQ(yyus2Z~L^nCjj0p7qo!9ptf7INYK({R}(4CY6krPJlJ zgHU{(jeazTBO0sLu2@k7%C}^~ff2TTw}2{!S;nH6!nSoj;t_)+$>Dv!qOS66d*qgG zck&;87~VQ7>XLz`ZbBMS=XfV{GKi1`T>!%zc~x@Z2w8TVNv-wcz}|!W#~$$RI{Iko zS>zE~Y?ADhtQBo#IQDpE^!5ZL+$`u$X539`oxQkwO4MuTR#9?8-!e0A@bHns`rI|* zySX^&NoruJ7+o&4Y;M)OUCS4pc`7`T{&~M_=6FZz;@?oHtxXLs&EepSP(0?@b--Pr zs&UV08SAFNbx&;!qj7AVs3&61+Ru4}L1wK2$qbXvkdC%RBLz)y zVAxO^L$N-`rFriGbiPr+S(_lG4PxQ0+#Bh_*?%*_VL)F=D%8%wX4I_KjAnPu=eCx- z^VMz=g>@#Gc=cCI?M5YMK*!|N8emCO!tPr2T13~li>`FOioo~+qg&PT@R6V=%%&FE zj&RLY>(eZhd*jp{Uv@6NrC@VZM_U~G7o&~X2ajX{^* z?f%qJO@`|^$%A!&cOOMckT-ztP$EJS{t%?myl5%z2t0(JZY61koPn>+8 zHD=zAB9VO@L0dR{grx^!C=VpE4aMOR+ovY@KBxZ@4H-!zMsUq-DZew#=Dv(LgGE6k zxceB8`8C>s+6Nn6?4Bg*SNUb<-H&DL-FyBYSMMAhY4b&m1|8d;*tTukwrzGau`#i2 zPHatV+fF8!Xri0ANKRK_G2(pbIV;qc4BfiR?(2g*fY z-fx&C6E3}&zBxDM6CvhoTku~vZCl90Cr>*j-%`4LNPdvbQMih0rJJC5G(Yo>(Srjs z%iKQLb}YL?@fxbfAv27fJIKQKrgvMd-?&2yoDofjy5N8Qfyn6{H7smqi%7jOfyNq% zO^H}?Nfe_6T@{l`&i58Ssk?iJwwIrsg#JEhEI=Yy4U>Efe(avp+rJ|=+U%QApW4AO zo4sTbP#Q_e26?xt6WQg747=|^#L*5EzUeNze|mvJZ@r46xr<~Pz=LV4jL6iHqK|wL zJaNB&Bh3L$3KEYSdH2-|3w~)khQ9_jW~3kI346wVa@&00KJLrqf;Qb|-X zTQ@q2mF15(GYII`qEdNksv0`nRVh4*J5$L6y~V+5PHrYmU}BRRfHW@UVjCM2^erXK z%~AewgvXj~6uuw7k~;I!AUuG}*LakVR2&ps-nJz|(5m}eD{U1f6!|DBv?3=ye}^=K z#to-*75IYN(@mCJt~^~)wJ2lzCf=%$H-G*JCs>ygZPl<+-plWe;~7HHac88dsn*ld zX_0d%)Kcx?sekqJDYhmuGC@Glmix{`^}&19YRwJ`&B?qUL<#NkG=mJ}Ex9pUw=utO z<}1XJE^;HQAP<vuR4PpckAev_7hT&c05=ir<&ry$z&s1R9P$5L%0Wa^_i?LoUoRwyEA01D z`qoaXtX3|m5vDW`#tn>lK3$FE!o_cv2g3P0P%SW$hTEDr@!|DqfAhEcQ&y#rEDDFZ z)k@QUMrb*JTNK>p2pu;e4f90o(Ce)X7a3}YH`=Nx*1M!GrQDUZmK5N>nL(Cx99z&d~CKsWGE~XGS=N=Q>RM@OAU8uK}$sr z*Klf!RBUT5UlSJ#$+9w+36#4;-)Q|_XlUt0TT1g|zx@Hx$wSg3ww${f(g{FeW zAjec9Ia(JPFT{kVMhT&#t+dJbI>W`Ly<-Z4WLn5&w`QD|w)%(;!+%JuBu<9h9;t?9 zd7D2xEmP0wtb6en69wOOlw^@Qyow1W3qH-L>6bS1BpE2My|VL%7Ij-8`Q?l-Mq_O_ zDsGBc!lDZ}cFx3i`}$e62BNeoq^$vB8gwOK=Sw~e@PK*4a(6#+07Bgz!CriKr#}+?^@Sa(DffunI8VwPSg}9LAz}BqV10qpn zE?BCeRT4OGC>QE1DFK(s#d{11rqRF--JQ9NDMD)s#^Gfm#2Vq3L<}Gv=MYrbYfzWB zAKs5TpO+EEor}UGr_Y!crntPNEq(u%^}@ZJ(?{BMEO=t2@Z$%W;p$x~sUAU3K;6rw zfS>l*-XTma>=u{yM)^wUk z8)8=0xs3b!_y@M*d0bUZ1x>Yqva+tKen~(_3gdkZg;`BP-Q&2Y~|xQs2O+(d{1y}tdWA9K_9+&ioxdQR+SizPMe7Csh(wy5sTbfK_r_rU~Iml`||`y+j^w& zc{Eg{d0!(wPAyFz-Z?wcOX$Q6)HKY@MK@v4JV(YAN%*e8i8QU839b@=qU38NE4f5pc%fot!08 zrdKPC^gt3nwSL%qq10gsC+b=g>2&&VfQ`Bf>?a!kZsQHa&%}XNN5RZ*W5sjm$? zo`w95Fh2yPeZTP`;?)|kuYu`^f3HH-#-eYJ%>82_lXA5#lG`k zGe*A4NAVW}qdAANtQo|(1ehC8w&|yai|jJ=7T1qly!E6R>_-7C)P*&ntDO_2v$*T&S-^A(D6->F@Y zY4Wb6Ja%}gUn;t~i*Zo~5yDwTD#?W`j~$%TLDhWy)3dH;=mDK-Y6-zuDx3Cl05V*n zG+a$mQNL^8DcQwm!ZD-6OSvoM_&mgEZfQhAH*Zmi^ zl{skH%#F68oRF&CYTrPHT$Gv8_6X`2*KH&+AfEX8PlwHcO?mBsSvRTsZRoRU<^>>hZtB#qcyUhU99!ScOtGY)>~x4L-nPp&_?Tv1 zA5EW<k}IrA4|b z!)vxI)FX+P9Q+3=91J@a*P1!FE*n>8{B#3)Dn01JLyyld(d=~ERI>d zJNBfuj+*vTr~obj8)ccqm;ojb9Z+x(#GGA*wyZep<{-DfZWC9Fpf8?x_@Ce6pa588 zbGJxt7LZ&0XHDuJ3fBsKmlCtzf)>No)(DTh-Q77-^FS+{P(L~SFN`<)f%}5sV!P`JCSQhJ4o8#i)BD{w0QsN{)+hyU>_F(`!hgHsEgdf!oQhxcP?H4x>=3 z5a2k69DNNN)tJS}WP#=h@Tm!q>azru_BEr;I*DVzgYfccHY+%S&`ZJZRzVhm;i}dZ zg!H^nc)M-+&tywC7&2zQMG@pGXmU_0RN9wPEV6SR*(*BAyX4CUrR zPt`VotoM!GwK?^*pwo;}cNFY>VU)YDFW%~;db;`c;qnsd2KKtn2Be!RM8zp&z`E5I zg6mP+Kzalx#UNW=zEuz;&H+;2d}qX*tsF_}Y-S0e;FjXd5x zX=EAM`vUNH{+#JtX>b=z>vMdtb=*^MTVv$v5M?I@xq_fv*poq#Hsm)al+=!N8M}Pc zv_Xh^6ow$$(^Hx@l-e-fJ=~-KAieb;o@Y|Mx@I8HDVbv}@_={^H(eP#P+UfS;gAl)0=V}jqF3ZUP_@FeKzX-CBba>1 zEMSRay*647qVP_=tzuaI3HRJEO2SMi_}y}O;3Y2P=*g}(T0-*aHd#mG4oU)}S#m~q zBiy#w{G0D^!OdH_Q2O(m+}=X!6-Hy*ig?@eM2iVtsTjH(%y()ync>(Qb#OmCgXi#^ zn`8uUw`0M1Y}^y6KNeo%KydtZDC%=pI4f_2(L;pAHM4rTt9Bb5b*Hw1BMHhoLMO%*FlcIzzCX{wvkv{+}FuCX1B;9 zseY7t@o$J5l=~qyK$I9ULTcP(__=3X19=~rLBrm`KnC@Ai*f6Lq=;;$9Eb=bm+*8ElvW23LbD?WvH7t@R92=1 z{8k5{RKj?a!_e!*ST*_n4DEGO=dSS>%~&Fme_si5-h)7%NUbj@Vb=vkv0T#Lcd@Wx zKZ8WLpviCW8ahSmp;0u5Lw=6#@uAm$+o}gmHYWAi1=1|;Vak2?t;e|RU%sI#?O#|O zafy02`X(F)Mk<|S2YD?*>%`ay_C$lx29;3Ys1)Q2lG-^8yLnO5_g+r#)N2>}dt&7I z>lf!7gAgWx0DcwZn=n#_7u0F%wfn7juRfuVpA5SVd_@F|Qvq!dKZu(gK7Ey$hAAEa z{Fp7<0T?mFIn~!ajFL`%_~O*E_i}T%51q~c%_T_JH0+RFgTGtIgmnT>f3iw|+9WCe7_bW9% z7-tpA!o-kjm`*F|eV1-Btce+lp--<3`F@v$4~WZQEU+2zZhu|ddv+aG!L*sD!#)i= zSn?w|%bL5rsfNj~KqL)*kQ4PAc)w>fyPj^$o{A(+VIO?Yp`DLl4RfmD5C#E3UJ?vq$dAmAnd;#~0Pa*!JN~de-F<)ww}o zp+gX*BO%$z)xZQwSFSzF%{DPkUdU5&nP+k`#t-mj<5k+nFyhQ{oc=bVVGZ$d128ez z;Yldy`n!97T-28ra^WNaWyC+=qf2FbJiwV!HnbZpFbB}$U1+Q5U&503F#fk*qy1<^ zNRs_d_z2=$n573?>EUQb#F+gid?-H-$h1O|VXBA8I^nNN4xnzxR-;@;?Wf6GxskSi zCGUyyLG<*!EJi`xVC2FI8c~z{FsAuI3$G_J=4r@f7^H`6XM-`SuLL-PJ(OlbDh1xV zQkB{c;fzEcoQ}%lXy!)Uj~$A1W;wXi9@3y84^g;boIvVu?ibR>yE|VXn@34HD!YZMg z5M3UnXse@Grpsj;b2u-GvYGiv!2l2PitCV#iA+a@YB5X+{GXQgS~M|+A7O{vn0EZ> z4J?zQdMGNqjClFrGb`(~v47Mpn9zQkPOgB#hcMMYMc%)9MfdUY1us?kZMHkownmb##Ox2A3jC0Xzb& zs2)b-_y;lvGx;b5*ow&75D?8Ilaz!IN%HWgGBUS*N+|Ii%v;eI#W&`)q2sG(Gmu0@ z-3UL8kwB~|>>C-fEUzgOG{?2Iq39_2F1%?9d}EAhih-z%GZi*O=e~VZ$nbP3OJ-*@ z<7tO~a9~?_{S(wa@)PRy zbqMWEz?VMpZsaZ^E9yRCKft<)oh&PsSXmOsq;w2hji(qJypuMCxvO|@gJZ-&B(cL&R0DrSTT1Z1WB5vPZ- zb}jr84}o7c5S4rOt8u^k4E(Tiho5#y{Rjp6ks_GKA%d%iapb#6}DP$!t=t4GhCX2o~+w#l%V^nAThwmxsR2Uz(2}9GigN z7?a@p;b0~p);s@)QOBv|nE{r5y94hBw$q%TZrBr{wO2U&ps8HD)!=mcL_WfKhvwmx z*)>!6Q|u9#8OQSL9T>-PD~ULAApb9W9&{~UIv6&&!QIF_M`(xU0a zwDvA=QkXWSD2uZ&t4GkZqb_h_Fwe#`=x%T-ASWsfXVnZ=itaY_Z<^LFl%CW*tRBt0 zFkJzHj>L~7;tX%1?`N|=N<<_j7?OU5;s1dAl@ur0)S@)GK8U^ys$gMo)1Xiv)6tgg zPEO|$5^INSS9ma0O}IJGxEJsPJicDfE9j_S_R`8L`e?ATTCi&dvhU;)`}xQC=Xea? z2Q6Q)ilLTq$ARh8r2O=Vg0cb^j6#_5IE-!mrrUr++m6dXtCqqu`2N6SKy-X zY46?OSU~a6_irW*$xr5615-9)=uJ8#G$P%M7yUjG#dg(cXZ~x-pr$6;#MF2b?5Z5g zJ3ks5f^LiL?3{?qO$TFAVlkA)MOQakBvC)!652=v-Oy-+@2vaH~yO_e4107|ff-V2}Ic?HD$P zkA+EjaXcDSccnQ5>CAO;Eyr6XW!8R>r#Dsvv8%R>N2Juy(3w}oB{kBojA~s`>)JD! z!|B0EudRyhd5Rr|I*Bnv1&{hPkiaLRNnfEvWTOimqQfOFh@x=Q29CCSh~=VUkzi>> z=mD)r8udtAq@hXD#6`{I>BN@F!bVF%M`c9JFo+w&klVA7y>W>fe;{j1MpRRZ)e?!- zl8Dt(h~+9o@P#0IBNDqH5WCP5-|2}QdWViagpS_BBw`_xFv5!-j&q^3kBb~u0#GU- zm&Fdxp~Z5)g^jWn65Y|o!cWAFx&}wU>j9fcllERyV6oqJeQYdg^j}y^I+iga&e5-G z*yJWk7iA}!8tX=xcKU2A9fLF=#`+h>x}#rE%t~9LYed>W!$ymm60fDGZ@l>3CeZBc zg`+sl3Elpbvemmj3F96G+*x7q#`j;+hd+8JtC8)1`NM4%c&GCs-?%r$Xzp}|*8p=4 z+}Ru9Ts<2R+`v00Lo0mosEw)QNO;zAQru`aZ36_PW!kWERq`NLD}&l#J2U${5Q46B zP6uj342tV}?9lKB9YPE2SmjJwRc?ASKs@0l&0G6zJb1Gwu89J-q=i2n+ETZmbXVV< z7&k=vKfl3#0EzOqBmuhtUK#u#j=*}TJ<%479;1zFe7nrTg0=HVJ<0}+>LTbiT$bVX zeZInm5kIynFT@*C0dF{={!lu$LFK@XlFMqBq$80V2l+?d15+V z^TlW`m7E#p?zBRPg(?#7C%O+atTrXM4Eeb5)~@B*#HI`{)rjL;?MNsm3P6p$R|bs7 z3v@Uy*?G`mFzBq+Em!1CTwVW5P$O}RRYhelchw>!rBdXG-&n!n`Z0#-+ke;=vV6$R znmik6DNuU5a7PR4c7`1+5=h@^k!r_Yi(t=DTT{I5R>!s_96Mt2(w;#q6<)*EqN{@;o#aUcrFuC zl3JKUU?n1XeII`HgcUGd;5aWmJwrr&!lIdZP*=gDHp;+<5kdbQD(Jz`qdtn3su2XVwx%s9PN{+%d=*HnEo7QE2W+HDl7U@U z^r&7RgiGlGg>ta0W2;|@-5VH#JPS4pQEqx7@Ryq;Mq+}|Ttz)xOL$enxU zdH&ccu3aQNwoQUDXd5BbrZ1FSDCBm;Lb71lsUoer0wY@Yo9ZH&H;Mn zuSnaar7b65N?Tmq=Hf};(#%rzD7)K3pnEO2A8oBBD~RFg3wy%7;mj8=^vHl zb3E+FThNVUcXG9d<72Fr;zjlw)0|1dH<$4s3jJyquX+n)Wi3n|(Z*X2fsbg@W976D%7opRBsD5QX=);?W**rqH z?|uL|q7&9cLMRMBvc=m2YPoD7DMAFi7q7NB#XxyK_|2hT1NvRaEeq}ZZr9ER0L9zL z8&pA*?fqmr4TG}NS$T9K8abX6xf*`;?#!J?TW}=uh&@I?++sqW;BrC|Npw9b0{JxGqki#(Lvs~z83&qoL9gq{vea>-_U8O;n^29q$fM_YSFQ%8`Lj*c z*=N20V#}BAn|u6l(KWNT8p~#(5#wmPA?bBeT&l#SjB~47r_Eb&2)j+&TIC)lum}=D z!D9R-NQsFa(Wz>ONd52BQur>q)XyfGzf}y_c_whojAtxODTWC2=81KJ$RY+uucpb2 zxdakD&u7YGD+Gv#7Y1NOPDH$Kryy&4;38v)f)q4sdm$uaaXeT#m)H-Xi3A5`YK^Rm zL6`8cA(!Z4F z_F^8_Uq+OPIf6=X*A$IS-$$qU#XLTQ%uWPIc#%-nyaPw4L&Q8vN$_U$qvJ zXqk?Z2xgL3>u3lN8@tIc>kiU&8eD6zJ3*md3_Se1SCEF@U6|k znMu|q5L{96`s7@m0udUEILG3)DR_O-E>HOzi;za+1ire)=-e=`%~6_3<|PsMOL+X@ zUYpw)i|Zlc{Y(4xZZxjv%jW!ZV-BUB^qKZ;N)DGtsp#m>Y}_c$@?|z(om0SqSYwG% zQUbbS64TrdGC39trK7}DGP|H@Gp)xb#V%;s_t(e+`nd1T*3kn~15=?fEf z7>dJ!F+#R&cS7N}b=9Y&GhLoo39JB+yBDAl(`T&Lf-qJ74PQ89l^hWr7W_0S*fKO{ zHmzR00a?F!aSxt2iyg|hRSFflD8o{!5C5U`V=eSvxRk8Ayu(2@XTh8Wqi*TPqsaxt zXrfExm_uL@k58YO9B*|-8Nu@AiG9><2bEzG`lmoLvvic>;@^CA+pn8G4e`g4O?#UW z)p4)U>@-}!I`P;&InsU!G2M>Wv~}6DAUK}9Aureb>s9C;xt6iWiHxhu$ATBd$qaN> zcJHjQi-Ga5n7WJJ{aqIq7voGBLef7NIY#BDU})l+=`=nECvjRU55QP zb`ZcR0<(#L4Ku%XZk*m>4xG;lh*8Dixx!ws!?Ioh9o1Z@?QaHv1=nYNeCMMh$!*fyuM9RBY zGm(1xvyluPgV@bTx_DaklbB(q%do7jlEQ#(Q)xvea-p^cGRGF!83e&0>Oe6-t=KV3OtADV0Q>5xr zj;tHta!209f3T5gGl{a5GjW0`Fi{TM)<`=OXlNzxU(l0Pw!qDVuLo^Z{JL>PEq>tI^W@pJ!;7R@uQ)PgkDx8ZJU1{~40+BAy(dCTOcujShLW3` zm@F1o_ll}e5VBGf{mLfhn#(5kqALr^TkrE{xksAL@c#Zq?Ia7ERGlW?R_u7l1wXs! zmAu}LusEADcC{(WH)4CEffJdTq9+2BujL#TlXr>ZH0LygBzoC@zvA=m^!^E&W%h8y z2F}jYFUzTXK(T07Z?T|*RSan{rSdes#tiwstKgNub4O&Snn&{7n3OK@Lr28T67ml+ zYe60tOjsnhSln@vW+v4A@L0WCHW=-&-+(%fo`UrAk_pPD+|e~UhEtvvEYdviMB(oy z{SWPhFT%I$L$HZRifcZmogsZ#J^OtH%7J#7Jq4e@U)6iwldzHT+V_U>8TW=fe8q2Z zfgZlZ-}J#aUu_J#{^g)3+^X+7OiwlEC|! zHJU@C3)~H*gld`Urla!by=pN0k=62P#iRXr6ch77SE(qR>1i1I6h8 zh(GAGV?otndd@uX=$0ZuT(Su3fFj~$WI2t&@bk@=A@>ZP4k^A$I_pLtt`z7MwI4sl zH%fLap)el^&M_Utukg(UuB9P8kQ>>0#!YQRYSW(k#y7$s?pr3RyRM?@yRODhy*HK+ zzg`Vrb=h|<6DG&@E85(dFXUvA(YdYmQJJmwuu~fx-%sq*z8~3VW#+U-{sdgzQ+?e< zuRDXreu}ewU=2z&06|BhWyho#Nw0mmA(Cm0BHK`HhTPGWYAI-35N>yE_xPMi^=LQ- zQ};33gg0S5qc?Vmoq2KIbLurWA!efKZ#vqb1Tc~MEcXqbv$4-t_5=O_rBOAfnDItY zUeKz;9(J@IMwzzk9H3C{$;RPJSB{_W4R`RmYPbkCS{W)a1Nq@h ztGi$M(L#18?y^xLb1Kb^!_Z7;F@6nSovy_f-c z^|jW1c+_t=x78Il5XT^`Kd504oYEw=>yv*Y5^kXZBRu1SHTD6zl)ALz;OA6K9W@9< zRjxsE{tA4K8WzsgdI#Mf3OTU_2!`%NajmX&wpJTddyv0i;jiGtcH#HFA8$)#ZiYwx zM!@2prz z95vxLX1ahV(xQklm+UuNhAM69abmeJrDligIu~|AMG$oq2bTCKD!XAU&PkX4<`$>7 zw>&?kzinyH*QZ%(ySGrS;Bg{dBY2Ef8Rp&JIxY{cL8ug|HBqaCW-##^(Fvzw{y~~X z$*~*FyB5ZzzAHP6U>HW{_q}kliV4;b7}D^}BR9fn#M1*qd4OkJsfCqBb6BM@r|ukp zuHHqt&8dEyQxVnfTu`_g7F7YNCWlZ-!t_e|&Nxh#-JPrm*Tk4D;*&1plP=+tuHcg{ z?2|6-la8_cNnre*XZrxG9d}a7N&a2N>VCNR8D8|~6Wo}^Rz@}EV}?0-alh>kkZGO)8>UhwCSMuM`jT;RS8!r{_++2)&l<=XgG;3J3HKE5 z+B#eFRKks)nv6 znkM=OVkCSVDG3Q%IeHyJeyNr&BPe>Z6%=K?4A?`9O!y%gB0Q^`1!@VFuCMPYqZLrt z@CvT+@9a@BlK*-9nW?7cQ%0yUD(X)<7S~4sU*N0HV}{`8`#TZ{)@@M?q8OPN#-%Xj zpjW?vY+Dr``9eTS`8mddEV>pp`i||%t6vsEE^HcRkfn<{Y{QwpS|N(O z=#rKmwm3zRa$~F*-{A0vXx zxUpF*!a0pUmAOprRoSE7amK01EFI25BJsf?r{<^Dm_`ZkoJ}p)_Do{HebOhhKYR6| z0TAF`(R-V;3yr+w0~Jb>@Rp+$oTIU!!eIrN!NkNk%wOUia>eF5Ed)_|H#-_kbkDH2 zsusf!ZAF;FBQOw@&QUh%6PTjaW5f>X%bNgua`EFC=r>Pnii1woHHjMY`A()nBXm=E z7My99eXMc|QTGG$4TdZrpR$KNEwgBR`w@l=*;&q@Hw+BK?&0~P7%~_yuZRf`3#N~RQ|j}!7{+yf*R1Eq$?k}m*AH*W9j2)I;o4O^aChx z5U)iFYAenyzR#p$|2?p=<@IkX-Q_8*pdlZ0?$+MOtVv%iXWcslE{g)urbiuqKns)* z(HE{UveXFXVvQZwM%zbS>AzOM0LaO(}JE#^)tCkeWNh)1B6t`D6njtK(m0NTp zSTEZ3_7IHHq+@gpf_mVE^51-}?ywvuCMRHN>*p8EL(3S9Sn6m+?U_P&hL(KfJP$k% zWcb2f!zC6?1+_Q<#r{Ua=1p&A8_eFxdb4L`=#DZTu~f9Lxy1!lq)72N)|TnI4U~_d z%x8Sb5veyWc>XwMeeq^bj(!f>8+!b~Q+2##J+;%*nKEs);F;D~Sy}<+6}H}sQ>0C` zyd>s1NE1{oc zp~TL28fJLHO^xn>Z(oFr_?^V5%{EKDhxMSdvcJ*uX|rJdh_Aaob7|$Ge=Oq{M9(#j zni5PrwgSf_)2{{s&cv$3AhRzj>8Psy)g=Ea+`2o8&IeU05mtn|PKH8sZ)vONchT65 z^vBqTt3}B>pm*lm4x66r#=X7cG?i|LrnA)bqS(i|LzSwtO5J<>Y`pQ_61kmwq+(aC zjcO?E$z_!4E+@j?{hmd{{Qz^!Lfb|D0`f4CKtF0ulw#z0pu!)Q2nJ+*0MaRUp)B!V zPux}X0xh~Qx8SSK!$S+9fXykde|n9$p*-1p`q~+ z9%;#2oG%TF)x0zMKXvxP^CJc#-!_Im3}^W}B1IXIH--|CpQQQ-U^RZVI_co~N+6@` za_CUfSzKvMp|02`xrR^!|Y47k=Cfn;Hf8r~AB>o%!EOqwd2vqIOK8%K+ zFuC_98!%>JBi+iRXq4NLPGzzCtr#dCvP}a zMyC>-TRmuJCZR42qSEt-29R4wVha*`P{vRYQ&1v(V)wpkLUxg{j|7mP0+aT8q=YU3 zP>mamkK}(#JLUX6sR90EfjytFr{cjq8{ts)1wcv|pQwCFU7?A6mAa=n#b(k&UkO8# znN!wt9P3L>v3D?WQ7_I28D$EV0)wl5NP#EcpHPOgQ7=`D)=NQkxW%~u6-BTLN;2}y zGPp#AvyRZZ+r{`j-M>p3JA1yL?}Na9X5-6EMHfv75ReDB|KDt^pT=|mF8VJsk?|)y zRa))=_}_m^|B?XTXaF!;rw+j>|0DPPmzk*k4>(*a;VJmjfBNbLs$XnH3A6yDw3`qB zY+7F^0(9E+J^&%D{x>*UtLHg5-+yGm&X-?yN@)PXG#f(%qE^%^aJBy$zBr6o(sn%% zpwe~?zXaO9y2<|6&`=GaN<)tRawTMh0N*Nj2d?~I!|e?uLF-o-NdNQ9{N*{21Ax$a z`3N5KU!Cw4)W1<-q~!?!pwlXSz8v(wfM@@!WS{o0=dU3^w#I#cyZ_Ir;n%A4?>L-v z0f?!FNVB%|kAl0*6ZAS`2$zo~i+5F9xt!Z*{T!RY?64iAlG&HRU z4j>4mRVl59t%y!u`IG%?)^D;N{x?9BYYym5%3)L#MkNWyHE7E1OL3$yBcJj3uvkr% zVL-#kmxxP~u~6nVle;O6=C=tx!RllmrEFLRA?*}!652A3IIA3@GUv%slc-&eNk|pH#l_78 zPuV?9j%)>SHrRo$xFEa;>q`V(U9~`~Bey6TCoESC2%%`0iK`m#24!9vZwlqXBF3kG zepRj`px)?`Yph!#8<)%JGO#dq<1oa2x#tClXR*@-&BB($DJ|oLmqe{1t^J}xK0g6U znFJP4Tc*(|E{%Afy_w?2lZtogM@6ApvR#@=RkMdG!<+QdjerlaCytrDW%3T)7FWk; z{M;mHm2{uUSaA9h;$WF6!Klah4C-a};i_$l-4tc`f zl}8$lQdz}wXuQE@O}K$*&vU)jpTdMak6`_y0B@Eqgu0B;MQ;Ggs_M{>dC=s^halQ^|tede)Gpr<0qdpKg-~vH7 ze`6dMFSV7czC6$2?*0pz!u(BSj7`7dl{qe6R0-yI6e^yk-4-ImTAKM+A{4#N^kw!5M)(!5i{a>-BurCJ;zFFMYI6%2uGc`l^CXql04+CqcoRGS z^J>Ty=T6ff7?Ic&;-!oq6C5i!VDD)aFw%^tY-6~X<{lO*o+HD>(n)dEIcUe`!rEot zL@{2P2LJt4eqj^?O*mH7Pzr<(ek-f^yif^7_QVs!~bTd6H5?nw-6=|4i%a|t*<`u^m6YPE6 z*rN6$uJwQ3JMbDLzIXHoIhWMn)Qvmt8+FroyamNJL9LzTMfA)-$%`{(7;4 z2)BUG%I6Jx6JvfhT~Dp2>B+unx!OeW#P;@mZ*M7WKI{g|l(K|L>=O#5W5E$NR^(1G zrpK+W>K0)$rB~?)_<}!`SDh(oy%}n0{U)8nC#o2UCBF?Ri%2Krn`~k17j>O=3NtjS z0mWg$Dj?sa0Av>kIRRn6s{#HPxjU0}NV)P?(C)<1>XeQ^ZK|@PZ}$YP84K$6ob3su zpJ?Hgj$Tf@a%g-6u%z6GH+W$k_1NH0d#2ye&Ly7bpnqsR&Dp=#s z6~(w4E#`*|eD}(gFrMG@3X({K{Y9B_Ae-r0>>WKqFx!%6_9;P|{KPS$$UuHB+q^&V z47+76r1B?4*jA?JJN>;)5ZO+3D0oyp;cY1q9K7N1O0bm%jqT6z3dnJRkhMUCh|T`?&Nk$Mo!Rcd z5LC+^J;MOpN6|sy${JDh=E0OeQuIYOh-d8SIl=>$xx~Ozdf2ENqCk4 z(${*!KL&N|R@~1C1ugp7%7dsqV(dstY^l+BU8jtOW2vQ2Du(32-VdsppG?;sB!CAb zeoP1+NM~}+P+DTEVIR1Fk#c29fkf{hA(Nsx=+fWoy%{gOtxt%5 zkc=jx{nK|S5D-wb{~wY`+k=7r-8=I z{|}z|zt{!Y908%V1RD_bUpIkR$S+=?3;=GcH7)?=zoq^EARv^qHFE@v);4^=)_=zT z=i>jupf5xq3I?6F^$jrgFP8c@fPZjP8WA4=IjzJ3;alq`AprjW0*ti200h`pArip( z|3Xgx!ansu2oSA0WPqdp>KK#15XwLCq{UMJAX|YH0Gt0Ddt6%fbGA< z);MNB#D5L{BDk+nV5K<)f1x#On=jT%cQ(Mqf6@Junbt292L7LM5Y$)Bzfy~l_V0($ z%LU;0FX#Wb{|7a}wSMJ7=0D>vh(({rOZL=o?VyP&-)uDm0D-ETqm^@BXF(SXDW_y^S^VyFX!e8 zcv>KXjj@!z&$_y?J@vTmocM2FZSw+OpRQU#;P!WWINF0asO8ar^w;C;S8Iui3sEYC497F$k4~bRO5N#O@-gHne=OtEbEq(# zpssZ}@Fx2RSUQvCulkHPE_mZgcWA)I8IL4MY)8s2T42zlHV!w&#w0FH!s*O4H@ijr z9-vvT7Zu8(#rQz^22th zxtZ1p-TU0f=x;Z;+Z*K5&TEcLC6APDN_NF&oGLdUy+Q=XF+4oh=nCkLmf{bNk1(wI ztV>zPDGWl*RqZB34SFf%A26(%G1;caIl%GZR>XRF2Fz>ZMN$2QI9JsmzG(aDq`>nD z{DvWkLi)SwHs(4C4K@x2zs>VT1iR1Id<`MVoGekwYw4jrO45vg?e)lIE_0EfvwT-M zh`<(|u*trLDg=K3X7Q(RepzgZpUyDywq&jjgC$G!3CYj-wjQwqbyIzxFz`ej9s#2@3RF!d@_JPZ5>ss) z)p+x};v23{k#w<~x6a~yX+Cn~@$(f4v#g22RO5=$BSs@Fh67Ppf$DuymDZ{eppFK5 zvb_}r+(Trr^>NAdFEu}W+zUo=LVQf86Mgs*^5K*ywzl&AhUp`7GbBkGefp=|Gmb`_ za|;KjL@|yU!!&x!@d0DY-%(_h66>g39WZc;SZxblkYv4O z>Z?h5r1ClL*_-95%O#u2%6-9-K;y|4`VnW#;;4AAjj|Xy4OdtWQnn6bQh}c@41cJG z!y~wwwNq#W+CfNl3mQ<&B!{UNJR|XP;gJ=qiWAMbr)Ewc#qCFmi|MUP*zS`?R1P+= zAaiIT@tQsbI7ovYAEbsiX>^9$TT^djC=s_`L5?adKe3KKI@M%wW8;pjfX8hX={&k3 zWPnV)$TDK{O5QxZZVNVfZXFv3k%<@M&KKbBFAD~YP4G3l65Z*&QGct{Y)4(s{I+&< z>?&l38seVN5OpM>;ouj9yAip{H2K8388u& zdo0qcZjYpmUU~mCytZgW0|gnCLUeb58R5b4+5yVf1V;99+7P@Y@pz3WJT$~{H%5S;37Qm_I3zrp9R zeo{TxEc(e0Ki#}*yu1#MxLUZMab(*K6P^uq_|WP@9hlupK+9@r0G(uqv$Xci{~xZd zIxMQ7>k}K)(%lFmA|29=ga{&`fOL0D39Phq%F^ATAh94N4I-eVNQX!Z0urKpmtB2* zzxNNHXSp+T=G2_?n=|9Rp0M5l9z72~u1%##Y5Tg2*1DQNy01evaNZkxw|rT|Dy_y# za=xh>Oc}CJy^_TJR>C2&U)^?eZ)$3{(qEz?eLZD)pioiWvhIzPz5Q8h&ZB*sAcai# z`<;)mh$f8R@$6Gt$Y@h9_1{alyvSJLV3r~C73o-ydj($&zv#O)9GxYjbsG+0iQ7KF zjgwIw)b_vIs(D1ISP#d2x1BY)tbO6KPKGo7kgm}JDm|>O4GN71Z^61w#_5=KNMsNY<|LI*L*{4$$8>F z)jfNO;m7}6L3EgR7*}#bTx^5H-6%xj``G7@OHC){HV^_-^2RmQgmWk>H}skV1g{AdBS zJ)i!mPkc(-zNcJgs6SIiUs{!dd4W@@v*__(?QN?<@nx9i@@F-nx z%q?qz=ay|aWhHelV}#kfjosYA%fVT4+A;2Oi>%YD;N^w&=hsMNocYd<)G%Hf!$@{b zT149L8!CBr-8gTZ_TBCGf48_Y>tfMK^x3xqA--pt#Kz0B8Zwk-+^3xU>!a2Csyo-# zc<3w~ViCf+5iV@+RRW-kVYaY=>d#Q7!_IC2IPtHcG^5TePwp1}x1~eO-NlT!tI$&x z7KQI~`z*pQ6KUHl5%|&Y)?glQa-Z+I8E(qUhApr@a4IIaBZnttw zvbvh;Wjw95bnfAeW|#lESpN3-(>LC32ZQ+O0fXx9cq4CIShatSGWgJ?gYDm%+UnlqVdE(;04re2oN%sKq+QZ8#IX`j|7TKM5tfM z%PkB@00TZiSAdAq(e)uBBrxg#JsA-*fFA+iLwtpb_>o=4AaZmA3iSQs0)_49%|HVv zECmQFgvd4pAk;N;&P7eg>$H3vpEoLoj>7U{_!khH&=+wV}BADuL8@rO{4MzXu^q!x&^5U3qUba74mWYZxGWjvUc-=1eKM_NSSw{HZ9CtDV}7Xi)_5S)-zq& z#l9YmF6MS%yf-xt#)!vp!I3_t$$5CRYgjntSGdXK-r}w;=%G84;t{Q0-S~1k<;}S& zTwixVBxxH?$>HcW>lSxC2g2PqO+D$WKuZlsI#SZkM2k$?xR?+l~LewyXK@iEmUk?;n$Wh zN9^{3WwMQsw19f4EQFvpH2L0OSl$`dH2khCSE%Sq!P9rGF5!;XHnB?HvN*e@I}14G zu&hD0f=Q^TTh;t@%{Fe8Kl!5T(Naad?XJ&yAFldp;B&ZR*~N^P-!S)!lH-f9cSKn) z$3BZy=y=vkBKCB~gWBw!%Db?Fpwkn`Co_(;p(iut`A^@fk+&6mtEcvRM_%ve3Ce+s z;=bYVF4$ZU)_ysW`h`JFg+!ZRdHk&>pZK>sU!^VeHUm$dcw-Y=Tk7*8kG33U5|9+y z{AIuVyLN9{5KC)}ce*3`nX5O|3kxK*&!p+ZZ*UI%w8CjCo2IZ(O{Rl|;q*zw>-2DS zTY49K$oU2m=udDP$N%oB3VJIO_;t4qt|n+DMI#g1ohpHIL;r7H8fZI_vZxVri$(? z6Y6_j|4iTUR;}r+-j+nsBJs?lP$H6rwRq?eJi%C6(NnOS&^1!gdfz= zYPmm8`b?`aOM9-p89-o?vWxV+@4@D-xS^Kdo7u}%9W14~o@IH_L+#&hvA@i-r*9|t z@FGC6#$3u$`5?iMXo-Z8^*I(%Jc#Kx=2Z;6W1`~%{3lop6`cRw!lE`usG@sNAPD#> z9`H>(1Q1s_5UBmz&=X*PsvQJ!MmM0s($(%22~^%+p(78lTSL|Gp~#P6pnK?r2!vi# zfgOf4i3EkC`=M&r{{oSWH}J7P(P&Twit<&gM3=&W`ZXzn{xuNEdE-Eh=xP53A{YWF zx8oxj5<#};hO4st{|4(gXCQ`sOa^^GiGt$z-wt*;GXM)!L$aS@|MOF4kvO#}7ZiqV90Ad{>@?JjZAzCLWrN&#r zz=&7fz+U=O5lHjDq`TUlUQvM|O-ujATGXByIE}zT5c&g3Nq7tbBSXqTw@~zuKo%%L z6F^zuZ$Ah!;T7o5sm0%LOos#%`X0>&sxxZS4zP=ZWN8FhqN$+v`hP1EB#7+*7%Ot4 z3ABiA{d@B8UmJdeX&_)i+E!3Cy360=8$#r9``;SHRSre~CmDDMCOF_pjfuS35Bi9v`8Ok=vMdfl>K*9gm6?zvLm)A9T3yZqDiMJHQX-y> z{>e0d-368MV94+fAbB)3)E6bM(i8G@3`B*4GB_~96-r=2>d*eQC@Q}K1qT>1Xdd(f zZDqhg{`f`dB4`Iq4ut~%a%2c2HUI()uYh*Zo&V*w?KRNSA2+!=jQVS3RK)~_#Qh37 zMU(n_ctnKc+X7{xzccv{X8b+oB0`WI{HgE!1w3Sk4&WFE$^0F}g{FjR_*;8{ph_W# z=SQFsl&~m|`Va=AMP?p@#!&;1z%w~KRO?@35g@p|fDd3EVS%atOHh<+ppr9iPz6S6 zfWbKER$v$d(hCZH3d6=pxsNy^2TP)U2vUGmP(K1Gz$U04OB7&rxch9=@w`cppI3=$ zA6xct)s48tdpE9ss1Y=p*fLRwRn z#ORAUroFpz&gr)e2fy~;UmdsTvMh1uiT>KpYbu=(+R%U5B=Z`#P;fpx*7BCx^!BT)~cyOHz*p^$PVN=hm+u0@Frhx-@wE3 zNf}n{QV8=#wOLU#`@eC(W_q_SOavl1ww7*6GS_(tXB zf)V>-Z>j8061%{?cQe_`yA8*F46kyV@fU%*ka}RdzXy!?F0C8fj_U=@wu#8a`=)sj z&cZ2N8&WA6aW@OfkXqb&9R0fxD{LWx8aT5_Q~vZMj(H3)QMA{l>E-!+2zC zkZRi&{H~w`oOwNfnbEPjm)@!SnH%{W&$bYx?YbOw{mO8z1}!{tGA5|aRZMN)I-y{R zCOJGkN25y%IaUkD7BV)TOAz^u;|n5+|JmBu-;vOyQ#L_@Xl?d6JKsItmbJv^ohhgY z5UPIelCDXyQRiK1G?yQH@;>$J&r?SvQcQu{F=&T7O{pMH+Na)Mt>pI?Fs_av9|N84 zcFb@`?)9G{5MH=J1-|u(ApzZdZy(2aMzrMH00#g4xn@(ogId8Bp|vVfd$PhC*%GCn zKYUo+;7RwV5c&4#Br24`N9O$J@Xz_=xsO2YIcktTxW7?y_RDbGIpLw{p6#f_+fA*( zUmEYTv)wIoz7TBWLSJA+?70p3?2!d9-?*&kJekz3dU&b@my&o^tYuXxtOgsG-NDQX zIE;>9c*04$IwoL2WLk?{ncSkxZgaYW>GISXs$19Iw$s}u{3&@Xv-xBC2|YKt?B~6O zj^-sS0fKthN(W8tlh#Y9+q34^?QzIj>VHm3oze}<;kXnu!{f2CFz4U21pIn4 z;KGb=p4cH)1-JA@eq66RjSpepA$%>7I!SHw{@3s>_RkZkpK1g1>(b%D3BOkN59EWC zX%<{Y-!pVGU%PlpZ76{0l6tdw=}z^gDBYeT>*RJjoI!Hfihav}I;Ax3+a2D--9vv&y}jv z{O^H^TD#$TO>D-*q3`JN3Jum2F{%89S!l)yIIr2uD)r@s7NlC-Fz9~Pew<_=!2Z&{ znP1W)CWLoI%tH&Sfx7E}{if)7g&78Xdd`4-kTyxW!2a>%4`rN)8*95QbSn!B7n0P= z%?%sBzYEIGo2Upe-&`j6eLo_R8shh^d?BGP?|zmFoSCM(0RuU&_$DB=>pPhcSi)X_ zNAiw3%a)@%%w3&^RBy6;36lT#4$nv2WJI1340wADlR#S1UEpgjO!#axtBXBr*awXq1gYa&BSvZQYJYG*#IFVSwFPDRtP|h2HCqa%31-tCa~F%+&O` zhUcp_!U>CuB9a8S>|?&j6UQX3q^5s*F{?mqNV!))MK1F|)<=eE@y&M`avgEqlh+ox z5y-)zua@2pot?~!^6KB4T@-37A3Y_$WE%B~lM>1~zU_V3YH3m+lKm^+U*3qo<-u90 zO#kjJSIu)O4P|NAMFD7E=(pE3Y)M5!>bAv-90@qV(uaJV24b%G!2^jzrd6zS@_H-+ zm{_0QK4R%bOwkK{&Zh!ZR$FsS1|8S&tM5Yb3`@Wq#OyJ}l-)mGLrU?bjrUV9X9&8e zs+Z=Qt$5ht{N9CUrM23CllR(*Oxjn?lhzd{i0LPF2}{lE*qlb~LL?wH6-k z&K5Z8XSP4)_o+<$P4_25+MSX&+Z`5|Pm|~(mfO50e<7B#-|)v!No|O&*6U z-39COs)oIL*yKuiVZEQaq&&lLf!RJ>d|*_~�-uLYh3C#_$+nJxxmT%q8;N>fu~d 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%0AEo*y(`@;DAz_N^GmAETzwx2t| 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 z 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 B5Lf^J delta 179609 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

Y$6ecWfS> zR}pbJR~hHB>Y-}OtAS5JcYt9h%Dh?b=HConxc4t8P}KeFN$CDyTzJ082f?d3P@7%3 zJXlo!i1EKs9Ueqs0gV*I$8Gz<+S@x_*W4XnmQYgH$(Yro#iep;7z1Ns5&3t1dWlN7 zo5>nEEj?Jq#=H~!XQWpdKDBYAPXuDc*nG5KVek5m`b!Jx zyI1p`!WR~-4bqhAOVe92ej5i*;51t>p)>fPK%#0_yK3C&LtH}DkfLfG9il5JJ+per zs5D4f^%vGJyV3S~C(wt{Q#Gj+gBdE)rXed$Z4-L5fs#-OyFweo{Tw&2V~^Nn*#y0x zZwE&ijUl@yIdGodzi*yeL4Eqjqq+x?Y?vo};7XMA(;50^xe$0EW+b@dHUrhpQ1>s^ zZpl7dRpA@#dP5#)=3G6t^lJIl9x&^&#LtG&|j2L;Nhzv+z78Ia-KCk8i zdU-PU#ksl+v!z%fvwZktLaz5@{lU&&ne$GDM7l3<{yU%G2O-Wb4c?vP4Ncv?3j40w zN~TQdv@Zo*t}aVL>b^RIFL&qS$fk#|%XH(`&wuq$W=8*vsKJy)rVDM1%s1B*5OS5x z$!seqH3#=9`!FkKn~2TTWaTR?N2{Life=1g;dJE!oz_jb<&K{@DQR`j4335dW2q`m zZ}~)R%$Um-Azv2gcHW8|c7=eaG~89%UMx`wYk)n9Y;1fKWl6$KroGP3qdcB0KFgNF zV)3&`)~Jhmx+?W`ltKC6Lb>>KmeW{F?BtNOk58WT+553iy!++tCf}rb@sxPbH$dcS zEjcWkGy99j{k1yD66mt+MQc-yNPat>POue+ILZ3;#bI`^;8%X-T3`{S z?iCyMX<_Yb*C@%A7-GD|i)Z(bumxcy5|3+^TtsZ{VYbMfX9x*YKOe%RA!twa!aU_m zKu6vdlZs%ppPb??5>&C<@&Okn+ihNu#lED%Z{qe)U*!XvgExPoVR?NR)v=IQ?G)@I zcxOFh%7qjCrMNnN1L&=(wZnWm`6D0*Q)N{pVbDL;Ch5h7uny6rb5O*3;T4E&==uxzL? zG59G_s(2}9rpPLTTweI>ePdt)hYQv4i)A1c3-i|~bI~;V+k4yfaI~+HR#{wpTkVe_ z;leKVnf1@LCF8)-s6!CzYV!jb%dlrmlcM}8H*6=TGgGKR{_rgoLu$ywGCjwXQw~F_ z_2Yi2SzisYJkUR5T`VX!g_(nR$0vQGifxfBjLo)lY~hQXu~gG*-47ZDiqv!BDYP`> zLO;tjKgYg))&h*5^KQBNPMQ%y*CALgF+NwJ!mwJTaV=IT2Hv?12Z-2$w48N*-C^~| zS{xpjH13>yIND^eEcE}2xp^3nOY6(};n!+6@0U8XENLRS^baU=?=^e+imEL>==E<- zzu9UmG2?1ePWYp5;$Qv5Rr4(LhCzeZ=S4O(H`&V)J-xnVLxs8brsaL-_)~x4i!CR$hs@vP6Ucx6DdGG_TP~wTW951Ddn8bI<6`zNr&*Q7 zp&9SyS7wf)2J=c*4t@gnw1={wjVrN`(FBUqV>2Gp(^CgDcWVvVP+Jg{`#76VSClo^ zd|XRr8b5)un}u3yqugFSXZq#6HucPh4Nvmv3NhW`-;8d7e4xw88F6jGW53HW%;rA} zJ5$g?A3fF4ldz10=OgIdWI_#QnrZAk%Vrq&-5y2E1sF@#J9A5EvH6bbkQkH}`mibz zYtO%h21W~`UyqSpL{>nr_b$_ZTjoibI~P%z>+cvYnC`Hv5A*08S)yrCkS0{h#q>;n zwS|s`yrx+fAv#57)RkD-!voN9V#7(>T^P-X8FytMi&6>6x6oKEVCo; z_G3eQTC+Izj(A15YRuxg`x9fG?5h&>JLhw7rt8 z_-F|SGZ01Uuy+W+Uaj1G|$f_2sAm(bCnd=S750x18_1n#K1E={vuYn!Yl zhQ(s?DW&=a+{9~d(HXjO1e3O*E?TqBtDxv{`izmz#?ee6xxV9%Tg=vF(yd$ z?f84WN36pV_IeHxlH`2pilo^2lA(1M`rzM0(u=!3q*IOH#Vh$RY5m%03hM>hE)u$+ zm}lx6bjC1c7WBi!-Ks5Qc!zbCcCO$Hfn_HzFS%tT>JgICiH+-#e?A7b^ zDj5ygcfD4wdt&{+KrH$vYil>%biP$N+ow_8=>e(^d&j6`9t;MZU~uprzQE#*He)-Pkz#7*x6;99RMHFbLT?%TV}7!nf2V`9a6sO-Nc#!eiSw+Gq;&30 zAjl2CG9M0ws{4n868-64LhTE$jL zo}0kf=Iag|R?IE+1*TT=Js0kwytDx$dO2OyE}ce#2x+QTuMoe8YFs+Ee8@nLU+6Mk z!O1@QifBgu2eBI2BVW5eI*QR5TbECGDa{_$LO+ z6oLM2{;h4QFNx)8evLwqz*+j`N@+dtpD-se^sB5A+V|x7UZK45DSWz1NiY+W?IPwU_6$Y z{`&+Br7i@ZJRXck{;LEBuQ)-i$^gQTW65tYs32C|05ZsMX)R5YCz&d<;9=w8;_8thJFan!LP2fGeJaHf=G@~0Z4=1r7CaT^YG?$qNL0Tbql?eV!ZCAatCq z?$vC6&6Luo8;%=({xN@j!^_u-An)ewxL$O#@IXO+N|AMEs-+4ytUZD7>yB2=)cKHL z4mp1l=$;ayw1=1+Ctv>aUnVPA84jY2cum}H<1N`AD|&*1yVoSW9L+pF>S;&vc8P-) z&i5?o6k|$D3322U8p43=!Uf=bMf}e`f$G0#-mie4Z&L}ojZ1&mqIM<405OD_AZO{l z=p~*zR8P1KY1E+Du$ZcqY|(Y<9{9okB2I{r+I+t#y-8-KqyT%KOmAEb8728#5mAlW zL$*^B9A0h~-|t@~u;X(66>pvg$K&M`o zeP3lRX^qu9m3)V{4=35wvOptmRfcOD;x$9~4u0^vw&+P(7}O~BSag#Lr?-f)?OsVRYPKyC7N%eGlaxSN|OA z;klI1{IUMwQ4jB!LUL|2zixd>Vmxzeql7*VS%BHAgO)InT*fa>Bf*m^#>+l0kaMt1 zX^2V%cq_5|x^`rInOdBcpufal`t+Xn73NmohLQ+nVOV@fLIRbkzqbfo;7LLyebpOaSakwhMPQS~;H<4k4xlX^N<4NW&p!e&&I(xsv zfClyOo%CE%Sh9lP_-Mdw+*4(T+v)wgFmonFvc1%W51tDHtPs%sCO^7L-p+te0PWr> z2Y@cZ+R7~2nP0FfR|VN;!2feu#;ar#hO}BN&3)svs|G24AR!>1o6LZMpkyeua{|q8 z+y+&Sah0@1sHnB%D$tsrF_#{k>-hC^yO1XSxhH600Bfg8N&!|d@zVcJS@%0=DT*p^ zH)obgjS$m-pA{6-XsQ>gi@7QCd5rIzxOvd!cg9#X2_k_$i#C1B8a-PKdKY-}2kYzt z!a=`kF5w*8hdYf;qrFcnUG_MhxdmZ~F?M{s=sKd=X`g7YUMy#?wO!QjzK_sNs_kl| z`Xqnt)=H2dQKI1i>Ymh?A3rZv;M%<*LE1=`4b*A!(Z9gSi-$ zB~YC>HS+DB*DPF97k%6G%`MZ+qSs4aINCQ)^g4M%KWCDk$YN+cUk*R7G|}v!u-2AV zDC9nwWp^M4WgUeI2``3^i6;K`bN+-S-0%wxWhX-JfH;$&*VqiOp)AASBv@5YOd)hi z`J8-uBrK5@gnf&e9)`S?>Fv+0GBjoChDfdFJ+LW>=^; z7f3e$`l3}3Ee`0Xg(o&f{XL6{qCGKT^|g;e!uE(9D7w^3dCNmF9<7F(P#Zm=W=t&G z^qULLXpI5Zk&GLx)G(>PaqM8elW0dhMVfG&@j4#8uvNYpL8D3b=sVy?|GjQdOx6UV zTN855)-vP|&_%(LTc4tv*`;-$C5qA$VSXge{Cw-M*ppz)E-;hxR{5UsXCVy(DJ>+M zZa2jTq?yU98!@91?Yz)yd>8LMhNu*yO_E@h`6?3a4~tn3XU^-ar5isFjTWz}l@DTH z;(m>Ry!{h-2hj*3^nO2a!w5c)kRS{?exg(stc*#AY>y$OgNqlZ-q{l+-(KLKv9a{9)9p_7A0Hl5sLxOI^1aZ>4$4muA{)o0UlW8gs^D zwbQ-PFDk2E4UvPB-^(HC;tknfn4WZen@(BK2#TX&6iq!oKcjg#ms0Ep?en8NdD8X& zHLGBs7{GH3DMUyDh!6E02N=Th5p;MOfcDsWd1zcgj`~f%~x@^BP$fG3UZX${gdp1HIe}26tf!Y{F-x?(8V)Pc-r(vE%cU}CJK&3m(Wueby z-KD}3^HY2JNvKDSJ?kjt*aWYey-yN}u!1iaegeVO+-EIR2ENJZYz!waYpl+jg^d^3 z``@)TK)p`>@7VN_fDNUridTXLvO>Lhdff=EDT^-#dwpW@v)=WhV=&v`x2Y|2#6lM8J_^s8o}BuJ_6V~nD;D^g8Wo*k)m^njJG5LGPL5R9oV+`5f*{~?9s;xZr*KL|4 z_2SdExI8w@S}9!pO>DFPk|nv3og^!#e&)_22BSUPZ1Hl&RT^5OEz(^6zbq#-^v4ok zSw4)a%qV4dreKyZ?%N`rQGLA{6NTEA(YxukYkC6^*Rc4GLIi+9ne(N%Kw&5WJJ zf&WqK(=4>+91RX9S8i`{+8M2{Z>c-m1!{wbCL{Q2thXwGED z^Bq5t$4x`z909?C$K2(W*zc>Izkm2-G#A;AgM{u>x=j1sGsxSghXXUdA0RPIS8a=R zW#@V)m`NC}Bnt#N>%K`AxO>WQl$<)xrcq@+?7fklTbFGnF>N}NY+F~hrQu7s-UMDb z6bRroA zXAmRANr~5gD}m`uU_G*K8%>}i!6lN${Bx?{(o{wPr7k|Dcpd8JYl^eeS>HEVpeU9| zgkbZtqVe-+IDTQHuna%k$f8W`)?W8b0SNTZVA*dEJ=(FOosN7giDE1d{{bzX+#6{IIR$oy5~WRyh5~kV zNji$9dXWFSwcMt&9zULgJQ2_%O3VB;!$$?%jvDohzgqksBsI{Umeb=&R`nrhi*H^i zwyaa%Wm>&*+dA@1`EblWcx)>2{iGml+w)sEf#6AChQD#A_tP7Oxcj0NW9mQe6+qg@ zSP6k1+06Gp@&9Ta3nt$86o5GVW0n5ekCtO3tfJ%OmT@vfF!!T@ke{EHr718F-DN9r z6Q^_dQz}V{suC0$J<~oWP3)~H)9D=c*XyCL4pTa*LB$#G7R?~7UcsZ*up4DWmfjq- zBhD#bp`$!mLDNvTk8#GJ-WbIq9@0A|pdPXreSsY1*@1dF-ffmqrhEJ(ajSMG2w8e7 zIZ*+Va3LyCvI)WrBL3V>k1V}5icc)WekGNd(K5h4wn0Bg%uH6x`4NlrM2t?z;#EsHt?zHtl~1jhh1F%!(cck|mwu8- z^^6v8E!UQp|_fwdA)gF7|sW&=lBcKT;O-Xm$29&+x1#i(yLC=Ps1EFT)-GHEU zdU+0!k%b@$xh=8@OJj=Pjo^j;Yw{OZ##UDOX(NuV{TiSQI?MG5wS6pOyFBghZ6i}j zS&ZPIoUM#mGOy53W@n1Gjo_g0v&tGiyXMfiq6m#f@O~Xu^LyRu&jK4Zh(kJuaW8_RWV{ta?)=D}*BXCfhuBEeM|0aqB&u06=RFVWE zctOS6aF*=z~uQzADv!tJgWVBS9hNhBa2b03H16p(F7EuC<7Cu$dh2zV$ zYj{iSW9Je*EoXX@l0u`?YKEt9yFmOK+?rH%0*o%S+?xrrlnd47OPCDGHvN*+BBtG$ zaqm#P@pLUjqD7X&{k}Ix;%#05LX`h_)G^h{-MwVHm+HF;Vau(W*}U=_L{$^N2lQQm zq}c9jY`-w~j32~M{lyKv%M2$yQk~Bs?>S97&mZo1bM!_d!{l1vZz_~^L6P@=Dol5;rP}Q@TWlkZZ;+}eW5h;)Gq__e0&*Z5V)QArU zU9_((HZNekdrZmyDJVhU^_7PsD>P&afc~$~nmHjOKm=mwkA1)$KD;#ZfdKZc)W1%) z}|E58nB&UwP|(A~W_n z9U6LrMx|HOD$+hS8T5Q&eEzzBxc`H)zKvk1qqVV}f`$swc$8Fd`~A=2=OUnm>uZuH zttW1T_%3!4gb}szbcOS&pCtG|0ycBwd#uo=!q-o$#TR~e_gzrsw0;_CS$NOyQ}wDz zAY-Xo!*6J~SR>rjqDu-qlja~Cf0cXW0k(56%No;L7EsrRaxMB%nv|3r41^6xy3K5u zcYaS>A=JiIh_`+(;?M*f#;@yB<{}CYBjPt;H;Oa?&%Jr~(YVm%=vZ_bBsu5TVNJFq z3(mA#x5DzA7%(cd;+h)u3bgrghT-NS?T6X8nc|*rEg{`iLpS@b+3@u{LAKBuSy{$>eEY`VWEWrce+biF14RhG3s1Dc%uP$yIws6@a0dUE1EfKHUC8%=y`1$fSnVFENeX1rM`quog+Vf7-qdG*+bgesI1LF2zx?LM}8XLXN+ z8IVa3mgVs~hajPn7GO`GhG*{TVq7wl)Rn(e$;$jy!Y;`wt4%0u0|BuX34;#?dTtbu zlkt%oP=^O*%B^T}9cL~)P{Zj8AY002ruOB%sq{>2$hQjmQNH7^UL)ysk2Rn1TllBp zGvuFD{KU+)Hs!|_sOS(8jSBAi;mrcZu87V{HSiHnIAAORx^u1uWNx>jFaA7>Fgi&I zW7sLN!3~9;>N)Edw1JwQI$WY93=d-P@8lOU%Y@sGb0q~Ld(m{2*j?&eQ0*8d5!jQT z?5FU92xw`+w8@ovqG)0eY(9$VU%l^4XV z5?UB~kh}9%jGSI)Te50pn&oy#&*jChiV1cZv<7nUD?7AOi-WH1ThSCr$v-b-HRi-1 z;hYW*d*!H3l50?sk?yF8-o-yhUC(MXQ%EK>xABa#Il;CXS&f;F#I{xxN)^6Kl*2bb7%S2r)4KB zb)S6obQiT4IaPI118zITsA0D81fDIG;@mUVzZ1FPSKs~pIycPnx=OImyYLC@9CTcH{iS5x{ z!^q(@&&QI!OSBaZTq$232xV^|bQ*DXAi2ok7oNVN36fzuS|sj7hVc0%=Rpb(z@Ewt z4Qt4lBg!}+rGSO0kt6nZf|@C5#7Aa);}c$p6(6rrHcGOLLUKwNjn2&#d96U5%&)12 z(AN=uJ_%){C8JC!ENU^L*k4EKZ74ckfm~RF=;@7COw{no>&}fqWJ4O#p^M*o^J!|E z8=@;udg(Jka<+pS`BgD3B$GxQOXqrYx=AQt2bJ~P0`bPavct8H8)z>(53D&-WJWY zE~j3F7N1wP;-u2urA_h-BjCXir~7BT7Dd&hu3=@rZGmEcM856QuB*GSC#xbJzD zl2yzKnqxI-WkPrUh{95Y3ohnWcP2Bt3CuhvDMI5;`D33_t;`q1!zPP@jbA8;Z52Bc z5k2oG8b>yFh9QZx)ZI**KK=c=84UHX*hnmb#+1r)hOS31DQ2nj6c|Ot`@LL$5`2_G z&nTC2k{jQo#ZOjxs6!OV;poh*C4ZQ4FP%9FiWURXpkd8v7SaMZ81bd)tq*Vcr05v5 zefpxCtxQB{PBXmvw=sB_V>Lc0n3+&D<+8p{%PHrOFeGW>)}Lf?j+oQVl-sq*?8#!NBVoZyRu+Q+pDpS6u3?`JuW) z3VL{VfAm}$aVEx{9xY#0)<{7pgRcnasB^~bpvdWHLa{0A=lfw>5E9r`<3?dk}}9@0GPlw^R>n`29Z2LZF?X~;U3jF{Ph)@@R}#GC(-j2 z6>wuF;r7|WZ_*5!?-vf5=RW7ZeJ@fQd`_beuNNeRoSoNO_*TUlGsfAZN^)9< zGO;J4O9@{X)FPvU_0u&qbI*gO>y=cV|1|dSF;Gp#$RumzlAZf7plbv|g;M<_K$pUy zQs9^)e4(Eono_t4a1xL=tJ+5K<;eSbpvk$V$E;%9vduL3nk0W`|5vSf(J(fcD+ZQi zoRbKh>oJE}XDZi>pZ3*U-+vFy?`8e&)Y9_JK%-BdHii8n+N?^Lvu|A}ZvvPjRk(7E zs=}G+lgsbFBtm7{2>^o{{KU6qtW3lX6-Pto$bH6QHK%XQSj{_OIHKT5S^ZHo zbehcNw;4CZ#u*`V;`U*JaG8}q^^i~f;nHWcl-Y}0?2v&f6b7ufWQWfs4&}24uTFIr z^7I;%)=^PWZq~S^$#9<$qVz@xXn?nhIX*^klRZ!K9VLA2`i?!rTKt4J>+X+*h(;Rv zYMOd=I>>o^>%EoNyH-RSWI4_QSi!&Sq2RAcN({l5+sa?cQ1Md1x$Mg}`*66Inx7>cfoLDHIYf=JS8*nKiN zpt2B^$V|sO;#Wv`@x`?aiV^s|LDRI}McjmM4@1gP^!%7#wFhz)8{kgMqX|B`SMnT6 ze+|0+!+|_doM&hF-gL$^{%25XhaaC#e5+enDhbaeZYeYm1MC^Gx7STUl*c0p+`TqY z=-{v(^-FPJJ4qo**_tZ18saj{7aX>^Cc=-j8gGiXdLz9$(ge2qCYqS~CL3KD1+s;w zlT)60>p#|%KqwWqCbf?kuHF%qu`@2 z@jS-N>!Je@Rz~-ZXQ^dI9_W*`Z3n9bv-kO~JEWNk>=(}f<`Mp7Z`1)iaby7D2wV0} zyeS!g5^>F3mtZByxSG~{ImI{NB=VOz+eSzsgwYg6Q60O@eu!Kz$Y%e@895^X z5A$(34UpLd)Kl*{%bDwcHOZX8iu0G8^lcr9GetEdy4{TG{mW~F4o)3$KC2y}_DYk3L6FTn(X&R-N_Yr>Mk{D`_EQeH`h#6=rI z)Kr*>grKp1|NL-{Q181%2yYx8kd<+ZE}Uya2TYC7p4lJIjkPyZ6 zy5QMzY>cieq>iobsYR7TlyLOt8e-{TiKWLeW#M&DXf=~)>T7lBzW`WbAxDEM2`_QO zGRxTiW)=wiK?&??!w9*^LVJAVH}VtKh=zgKA@3AmuNl#?5w0I={_&cymNsmF8L})5 zd*NY^kFfXH(uViC;R7E?5e^@&Owc4Ugn!!Z*?-Vkps+!oM_gJk>{SaKx5^j+1De2y zaQ^rZ5sML5TQ$-)jPQv#AfVN{QANuk!p2!d#E6u6QwvtmPF3xN#<*dTx&dH%=f zBaR41|Hg&Fte5`37%&(%1i>9)6^`~FOT#FEP#F(|e_lD~GCr;iCxllGND3)^h4A=P z^?&Za!vDVi8WI>1-fJpTMu(5BybW+R`3TO^MQ*_7=|Ll+Kwye4a68}?gWY}!9GT6& z=zYuR8(4Tg>ort=RzsEK_kRm{nrMDre=*b?Mbp&nCL+XZCk3gVX zDj9+h&Tt$i{5yUGqaNJp3hf@U_aI8%3Qzl_tOWz}T%8w(O>4IHFWySTj)*T%j|)}R zi>8)LRVF}(hI_DbvR?j{0rgJMDd z7Pz!k8IPe^%>NzN&S(>RSMxV&_Y35Y3gJoG+}3a78_KN8j-$ywiIw?W;CO?Eii2_X zN)D+VSYsy6QShD>NBHtj*&=d56~SgAi)B9EEN<_yueXk%I;mJ$^g<_)bR`u6BD5?! zy;V09W4{!#xBcRXWL@(s@ey2Dfe;U^x)-M`mD^V|rNFI~!5ZL^GTNX&$q}F67i`9D ztEfy(?|EyZVEWnjqSK>elaru1jVX&HRK32~tn#^N+xM!f#dkXnE}=qV`fo3p z_LFJ}@W8%3PfL}>t17d?i%M61po;GfDKbs)QyPWUOS~_szc?gTdD?648j*E_ECp4- z{q2-gqXtG`PiYa!8`g607Md(4CsSRy@3(o0EWjt{o9#sRmy)o@O5g$%&F^A2LuOoI zsfVqttr=MR{96ba&DxW$giR_;unw1q(%KEZ>0~w@ddzoGRu}O+vWzY@S*HC~f8%dT z?mAYC^_osk5B4(HR$04xA>rPFg%oTrQAfj0b?V1r4dxs7kDCs$BdH911vHK7be?h= z1aYp5&V3}5Ul}5tG){H`@o*>1N`C1&i-{K%-^oMQIvT0R+|UeN=&4~EYflTtY_Vrl zNX}?6&?M`|%O;HZW$(oOtTgz#`6*W+jw36Z_w_)ZrVv&&2cgw(tl6oieiuE;+hJ1n zxScT3I3By~E(q493w!#HqVY85s8Wl!QylpqYz=7I#m_LTl-XQ+5R0_CVJrZ=hve7C z70CFb?d}x4O8aAG`0Bc(q`7t0hhf}jxa44YUSIHB@pB#OMcb!3BO11Zl_BD_SnJ8@ zFD?e#Ub&Rv-|6~&a2NPK1aZw zBLNiV7OgMJ4GKMUOw3rW#QcR_j@!;r#Aii1&s)+!F2fcVm; zLdFw+Vlr>Y_J0=a>UCKrIkjJ-qs!K=@FC>O4c%wYf|A=Eop!TiIej?egr7Z4R-li2 z9x4Au|2|3GBVsbO=i}=N2kDsfXF*uaVp^Nk7j8;*VAlKy+Tfy5cAyB~)EWTNWvHlh)HHtQ@e zrL7TC>$e#Ko|t`A;7K39zEfYv=Z?EeJ|{Xk$5UG&{GMB=T>#OlQTR5wEh@iEQgp0# ztkT3y$C#%6ZI(n&A@rMZ<{4ozkJn$KA(!s#*enFs@J3xWWtry0Zd1k|!S3tWWHAL2 zDnF3Nzh5U!Z_7y;`pas+*q3^?AG#eN>X_nJ#eZa0yxmegQ^l0V1@I?X4%j$cl?plj ze}uhtP@LhnB%I(3?(XjH?(Xgq2=1UFA>vBj&2-2S%|3Cf7{|!B${9q^m%%7|QP;D?2ABFOl zGDck*zj3Kx>ELJ_k1o6n8Qmdl?b-R;qno@7KmhGYyL9V4$fkjlwNHZn+Tqx8;|?QDhg376PaQwuq#r1h#ITuvSn3n52Gdk+V0@iv7Z zbkskTK#7pQ&YWqm*P57{81$l$Bk(#h`dK(oplyc-76YeY4<%yw;Nw2=>B79-xj(W) zB3(D8jgV1S_nN=F5uBg;L*Th;g28H(bDV!dU76=NFww38*Dh6y$5*Q#6-NleTHkEa zBc}AAyIe%t9WW(XnCi|`UYKC9%vt)Yio2}Ub4OE%PT@X zsNWefoJY)r#BjFECh$VY>S)*znw+rN1DENLtEMoeH?fWzGD#W`!&gY=iw^aw5|iar zgfItLWmHM3D(Fo*U6~ZQ58}RaMBQw{_gkRRObI0eWAmhs`v5xXUYNWwnUn{HAPLj- zcLtna{3;4r(`usL5VoqT{$Ww*R1k}@hQn=1%(9Y^5@`onRKpFofK&UhN}DrPRV!OK z-=Ej8AmpPT#F{491>lso575nh=`kgMBe2I@FK}I-MF2g0PhBt6Y>lKG@ek;xVg-tU zD8kT@kz>uXk-a7gN`_{|YF-5HZ12;2{N zHH#3kA)C)a6j5ghD%B~koy$4tSz!7;tNk~kSToB%lBjR8ee7RJ)YNb?4z(bsg2Z$@ zRZ-+f3o_g_@yOWGb|^Zfq3s$fj|-(Gem%^f$s{DdOx;`xg<`P$7uWcIGxh zGAG+1wtZZFX7@8hU5P)Kl8OK%Q-r7HjBnd@f16CMi^1vI<^D#o^teFag0#q?o&JCO*(rf+aC_d zq{f{iRa~#fzmrnl!a#g!A>!6$zS&T>Wq1^y43!RjNSJ>n%+~4%n}1O>8I%Hd{ftyU ze&2ZimIW5VRwH=KKOpjRJD2hl!yrv^ zTV1(_M5y>^m_0D9fGk3xh=6r`VucFwjva|}m;FD?RnJ_1Q?=Yq7xTOX*|eV~ zO1;u0fhZNOB+wlaM~}G!-tmsgskgL6d2}sy>w}<2f_AH0G>jZw;vxPs0OoaK<`DL` zZaKYQeoa(!{HfDlkqx@3J@`VW5xB%NKP#k($)-xWLNbxcb&z(P zMiLO3jpL$IPU z-N=!PZ87I>v1evH6E{Sd2}{1|HTNBoT~b{2=kn*szTU?^CGg;OufCDyiNA=ee#>{oo9A8>EImn*woNfXq}0P(?*M-pr803Oo=lDu7aK8eE)z-3q(Zd*LW_Uj{9QwHWV9 zLNO)yH&rz@s#Z+z|V?VWx10><|uNOwchRRgXQ#hABt%Ee?jUk5YdCc zOtc?GQ73@Crw^hBo?c@SNFoe;PI4_DQ|J4wGG3xIOaq zl!YEOc58^i=afGhckj_IH))RWg+!{|-)k8gsKx+Y%)>#A+iD{_Mg!j|wqM%isYh1k ziK){?X@|P%Uylky5>S5O7&C+fB+=(qi0(B~PfpeP&d<%KzL2wS&>G-%#uo zcTUYUWqUTT1)8oBiZ&USwCY>G6>HDWx@+iNiVlAKGC_|+wo7I3=w6q))BM}*Q#tF; zby4QU*{3(wURl{IS+R4TjeXB$rTRWAFmy!h59sBfB0z*inzn8X9+Nng2=)<&kzyZ{ z`7FPprgD!%czOK}0H|;B3y0oIukn_%O3{4Y2eJQy^-fYxwx^{VA>A8>KSJm}fHSWy z?b+AejfNo5%KaG(RA<%S)|A41fN+f;!pA4QFx?4WL1yMs?{IS@TMZU~k*g6kD;Y93 zJHuv$NxcwLy9CD$<+xjk4_5nZz_-4Ha;fV#<7Rvt#51fdE>PG7`; zIKST>F-f0hC|2EQyc&AZ+CW&3q$7E>pD>7G(-$Yya@M-oIKn@-Om;rbO`!Lqk86T# zA>u(%>T4YF^qgK?*_^|MzCz?H!1|O>The5rw;%4Fr!C2NIv6thgu>l?f$>gk8{s+G ze@+d&GJOd=yl`tOu;|-mt`k$chP@XOwE>PJoKnbgoDSnRLK0-uI6f+@-azsEPUWYO z@?#(?Q1Zp7ka>~!kM_+#SK4N0bS_pX(o+ZP^iS|L=Jd9YqN}SHZ|lHPSXcoPHj0@U znHEx13CCT&zmjD)A><`2!@@aLq^5qbrlIat7`QcmVChkbm7XJ^{1IZe7&k$5&03(^ zQz*}Sk0*KR;&-&YejUHSnNidEBqpfXD zA~o!7V#8Vp zp(2oySgjBlRGIZhR&HxCnd$&t^}k>cTdy>?1@x=i?H|am8}C*|AW>3j;EcdjF(FS} z`O-uUTI)41@ZWJGQx)yS^mFwdtpHXD+C&L+?`!SKI*Fu_7t;?5aY*V2xS2vQx8!fJ!<8!SQXC7BiuPJgt$8t`6HZBj_Mg+O*4_B&WDl$%bmCs zDUQCscBGy!n*_xiQUkpH&DoG32;OU+d?Qi7h6htCAOd@hw9~YZa0FU7H5T&Mt-l8- z9Yy@X8^ttpBW+_%$pNs10B2XA^ILCQ8r5R|@roBMzl^QnX2A-HNTvVp|y06t{KxU{hiNo zIn7`%@L*OR<9-n~g;P7tKCL$#jPoA8nVP@vji39t_eX%Ed&Eak*PP(-}kV97th(JtRT!^ZG zK+Y%pBORkZLpHPgGMdK1u3wbj-H3pPf#m_}ga?hUtSagK|} zq!jkC?G$5~>P|wx1UkOuqyahJze6@qu;<(dm&PfgMlQuwS9;**710+Y@3wug&_a^b ze1WZP{>UpaYM#Rr65wn51`P#0?m8qr(AS8(?`;1vXeiqq4V z@jx80SU+Be1eGf~U(x)Fm%!AlUfg$1d*~HuRWb=!AwYVo1(8rh9&^kmYQ9FUTSCE) zQm5Fv%n>)Wd4gKRxI!q2ulYcVUtUYm0;|B(eWO|=u}0FYk62;!3458e+;0c&sp`!$ zrg~)5KKQumlwYe-i1}Qy)<;A1Ez%uks&$tWwMSWF#S# zwklD$u!aRD`$|agW=KcfDJ%~@vA`bKBTX$TE>9@t8LEE6gzFp9!(2xR4816Gqy682 zV|Bd+`U5y;|9^nfmjY!Db>ab{NQF`YBB&hc{*s@X?#!jgCSI=aWI6adL7D7fVp#qq zZ|u(m<;t#!yS1`wwWdZq`XC%|5;8$a{r*Ir1vex{1;AUg5<(b3s4zKqrcvkPn@c2m z7BJbO@|#~urp1CijNKl`QKu1Q&90M+tH$$kz9xUv$_NiQ&g+u3G zDgop<)0j*3$RN(kn9B^2gOs zv${35759ej`EuMxgpJT)nB5>$L)AENvba-1N`#cTD_Wzbr7JXo zBYU_Ts^p6!Ss```5DmpY&)&JMCC@YJZH;{Fe(iN$2xk};KOGdrv!@%O3bZ_H>?yQF zz+<3~y<+&O+Rki%q6mf?HnuU8=Ao^BK0$7^_M|W#$YEsNV~J4lr%j!*Zid(?Y)Iq( z*eNg|b_!`11(>nZ?d(vqmYM+ssi2tW`2-=19nRjs2%@y=d)v|g^Fp@WYbF6ng#OQ& z5E3!d@l%DdSZNrGMu(eUb(63h!XijarYZZDyywNU(Bmd7anR7~|w^*va9ED2~n-b6;E1ox1fBF-wq-^}hG~p+}1*zT1-o7*t(?kozG;#gMG!bge(kZUdFDKoEok^^@o-3@gRnQ#d zkwSOMFwccpaX5^+=3U8&lX0dZcwWgn^~*w!&q-|_lx8@7r6n-dvD(;;{MR(`0IryT zm?l7@8BiKDER`V^#2+Cejk2(ZN@`O6y}C0Oxcawwr3S`5R^g?MPptay=0Tz$i0<=O zB(m2uX-NL#X^6lUbq^0(5v#;xW?#-7(PAL!Rx=N9%0E>(K zNbCHFMYpc;uv6MMiWKCTJL1P(1B}4t-j;`?f)PJ3&o#}9 ztisMAW&0PqM3@~fEW@}N%#Lub$1MNO%U3r`EV?)bLmcXTGLBG#)eBr8&r7?TPJ~-M zevUv-r~{|BhcAd7It(#a?kvp&wMcaKMnljldDun*kXVb)Bo4a z@IShDn=B{`m_CoAdC=D^D0!fit8#la{9N$rcjV+1uxPo1-Bt_tU}Jm>#GO|6g+RsN zuQo#qX_YH9ajYS&@+Cx@`AJ}Tj}BQ0R@bOEPmfuItOO_hpV~~oA8m#MTh87eBF$*_ z6XG~DCS?4TX6zRr(u})fVj$A3(3nC5N-{8eWdmYQiw1_R%_g+HCLvAK$>&Ym5tk+!2un1u?(G($@M1u*-b{D^`7=A){- zowfwa;607}b1H+P!^OQfl;O*FjX?QP)L`TZDgBfZ;SWWVXD z+2gJRB2vCzMc{*z;8i3d)s)CDF(7SXX`%EF2t9eFKN-=_zQ}NNM+$SZ)kGDAqC(1P zWSPl7QAQ>CzU(w-wvLh_rg_1qX`K9i4=iuYCZ+XO5E7F+4Y8*M@yjY?O{lT{>5`q3 zA{V*#1@|axG~Cu99%$x5B#0uT=LY4%o^~>3MVY6l0TKLr_zW9DUIie6|Ekap!~-pq zk@u2o!T^U~y|+&0v!2Wj5&W_K2>$Sc@B#i^1FT|Mv|;4P$k7nJzg4NAlo+D-r!30= zjpz-3K?MI{DzxS?wui2&B1MFj(Q88zE+Ah!OuLDY=m0G#fePIWCzw7j{Xt+OGpeSA%g$Te*}MDm;UtJvdV2}$}BYHw_{GK z$<^noYrO*FYiAsgQcH(7{2o$jxvW7>2?FPZypz9z|CZW=bi?(lJ-e}v$;LHErM1{{ z_bEjZU<)Bp9*t|yDwZYfv#D-J45)6^h1k>FS#rE!P0Ton{e5xDb{ztxJ}sx=(G8;g z-gEs*dh_zE2PjsO7^~;(26N@)bWDmBZIZQipL$FO#Rv2VW(s z%s*EBL?(@%2fq?SR(s)c`iFZ9F7>70a-?_&7EGj6esQr4RLmYlwmf{;-mN1b;O+xgU+$P~3Ic^GNDBiq$|U z9U6ijU7Sar{BWM1l06oLp#z7M8mtl|Q!@}N+TQguhUlQdPpEi)_`Lm#(F+2I6HQ;1 zB|(vpE%gpZaR`}r8_)mzEBca3Q@5h-GX3qc8+Kn2S)Z2RYa!UALc|$!6GgIH*_O|Z z6u2w5o-(^7=V%DVd)LA!KDzY|DizqW<=1t&HN=oLTxINBeu=9(v97Y?G{8)$yp1sK zT%u6~QUe?Gcegi!hJ{KI=;<{tdqa}cIblaG(63Sg8OBPBZ&mO63Jl_tjvm#`XS@Yr z5$M^9k4Ct&h{XCUtf&F!>>PN?Ob3G|1xOFZv#{1hzht(7O3Q-=skt8M0s;q&WhXM> z-Yn(Hh@Ypg!l`|5&323sr>KR0z5LBOY^;T%V*CFr-J6{M%w>Otege?;>05+$l0v8+ zw7-@m3e|tX^Jr=i2N)h03jE(w=zsE)Ag2*Qu4<43d*l|V@Bac4|C6oMPTmeR_4n>} zNK^~YzvpbTe*UcZ9R^F1l6dwwSEeku%DLxqDVjx6I zXOz;sg=ys;PI5h4W=SaT2U@Viy4W=V1zwtMECPO(BT)V z)RW-GLf#!R4NAO_wRWLqNG&-+cv1TnAu3&jEIjgwxvx4GkC9i4K7YAD3y-4%;*|x> zSuhI*=?n@B$DAS+dPxVN#z)@5bLYPkKjiTwqII9U%ktqI%xU4O{{-`VzvM z!WQW%!_G$0B7OxJg5xY)lEcmEvFI)Nef!z9-#nM@cn%vg!C(vn5SegVEO9~&JrgKh zho}Zezi9cpL^@Z?uHHCc8%Nj7`PB?IMd}>H`Nd)>u~7lk4*VSIfaBw)%YwjiPrw&$*Ygi*|y z1Dl-+!;5%wN=C(o%z(3YKd&dp0=jp*14rxDEDKk4ye*v6*+OTgrzaKhA{KG&^k*&_ zN4=R)(+Dt{rPutd<1WS~bH2#Z+JbK`h>Ry8{VQ!hxPtVRQ<2%!9I^iT=GDl?D(eSOd36ArmyKyO6RUW3!G?2qd9z`_A zZleuIuXAD%vf(iyqHHM8YCM1al+;YXdBtrjvSn3zhho+qMfpx&03XT|GAawQ zFIE!TkNO#aw#8As{mmD(0sf1tw@7BnnICdpcy2+2Is`6GigF|2 zz~PK}S2o6RN>6>UuZSVAr?CIkgR4)vU+IdIGnSBwefs(a_>C0Nhn*W&eWF{?)wWl% zpGkmKppxD@*Qz+fSuql)hp?e&g@PqsBO=@Yl|(+9a$u0eRBrps3t*Zkr105-X9`?x zv5L}LSvQ2yqcLCtI3LcTzj-vlG^V3g(bFB6NT{zf+32QMSb8>Ui{%%*Lmu0ZTBki(&1e0iUaXo z4{oOq<0x#)>Q`!+U)jnntpxUz7*{oPP3;=$!MVAaK+;ocB-H9**#LF{WphWdg$Bgw ziAU;T8e$#xe#kZ%(|l6pL5d1vjmB42#Di{#1)7(3>%a{8X$wT&Xif8dle1+ zjdpI%(Wo(lpIxvw?~iD(%|f~W(Q@8*WK*>?Az=B2Rv`~R1%n-G){;bOfuW6B5(a4* zW!~a`8FACu2YdV=n9MYexo_bo19or!LB5*(sO|>A)Mr~yFU6(!cpdr_%_n9d} z3kI0<9_E4tFNQ8W-ho$if_<57kL}=z^ zAnYI#J_?aNMuwPeU!jv$d<5ROKP$lg?q`t9f9D5_Amy`Du7txfuft7|OX;mPW<^EY z_+da%-%gjIIEQK}2{!>CHplAq;k-6OB^~JO%71f|th^tPV_eo=`93ZsAZVc}BIW8x z?X@nUaL)G}W%6)09CFhp4)T1z;f#X#yC2A4VbMuV$1g+L8a{cFJs&5KP)C`#O<28Yk z{RdSQ9kG|NxutEGXuGkbA5&jq$?Sd9#O(>?7Wv<+nx9kS!igs;(axfa-%w}3gX8n{ z3WjoVHxu@b-K1&37MN#mPm7D{=rjf^+EfbzFokTv)|lM{!%@D`==Ka8a6gjOL6)?v zC0kGWaj>=!JdpbIwF7FcQ5vCV6bA?}8<3Jb*|7aGNPTT-98OM3QPjtbjhMUJfGc!d z`HT~|xENg*A>9S#Lp<`eJJHf5ZKx|e{@pfAoD&OOV;pq}Rk_1A>dN3xL^o9)Q5yYE z>#b#9J(TD!Ule*Wu{#c`MiTb!H(H**k6bdE6E}Q9b3yk^nAy%r+;Os;p)mn23x8~% zzYIv&$&cH4Ao~K}iJ};eQZJ1Y#9IudQYpp7DuMLmN>KmB-Ejb5ESJA2(X}aEf~z~v z14JS)jVRLuOxxc29o!{JMu^@lS z$fx9PCVe4s!Qn04ucMR{`-~ROS93-6qVLCoxJMj_g_4w{J0_gt)ESyQPwf=9+%dlA;p|`)rj$VJE`^VdQ=isxs}7 zRmg6RSV`Y!JTh*yv@)fj`PLT=)`u*GahBxX$VwVqG#*Dg5vp>&)uWdTN zc(EJXMO3wvH`rIzl5Wut-G%AOJ0yA-(i+Ks$3zrV_4F|%{EW^@kN?9L ziwc=*L?yh%o`6o~lXDvEpp{`JjYap5`{4B!X+vR`sIDA)ecVCgUE&8CoOk$o?EP*S zE*$Fu&SsdbN9a6Gdi-q`GHOuYfhZHq1oZ~343=M79`>_~uz&U)PJPEZw@SVOt@_Al zq<$FsiOI^8x!Vz97oiTnM51GX&y3`==o+uwx`VCo>1jq`DB~en!Ml$(!|K{b;D^_DH=WcZ!8O{xNdvZlNVhNWy+26Iv#SrRI#Mb~Imw~YD5+XXg3 zX%&WPB9u1YSa%ab(D=_42L>xX5`=K;mVOgSNCfX=EHd)=Yy~LiFwXwW-1~TYUgBEC z`|}F%YtWMp^E;V-#>fc%!SBF5MEj0%okUh5ujEv&h}rBNe4J~K$qSh(m2FdafqYN( z%G90$3BAjxJ&&1pc_K)vJSMoRY4S<{Z7m*m&o!A%8XP}ZhKQO5jSXo1k$13m3CK-p z(avh`%M6P#2^?*7)anjK1G`SJQtz=h1h0u98zhV)GF+HR3e4(^ztRFnu(GhyRSnrR zWiZvO6JN3|C`)}};wO(qkC4dnjS+Ug*|!@|v64dv!Lg^8+&ebgFLnX4rd!F{ zqaCtte0B?lZdDDKYO}z*^QSo&W&?S}vW`x2Yw4*nr0f z*-%{(-zf5+BNsU#qn2iIs**;&Ys^!;=~8*KMGsPnJ&iQm;UFpm$9et_ocYP&J=^ev z-@jSzyCCxxadY@a&5BXMXWsI@&-U$ZFU<527?sNY@D5=2`uq|QfAoXl{!b;4k22)exs2M)>Z8&t`Bb4H$ z91OJBC#drq$9fWIe5vr;>$g7<$i+nz(t*QEpVSa_W4P3OHql-azQlhX9h{`FjC{Q1 zqvp%j7ZN`oe# zfFOr(?E&*pUjG>GpU~2F^d+dC|NSWBO)#M0{)?8jLnv^`-%tyX^C1#d`|36n<-fz< zKcJNU{uIa^RPC+@P?rpU5C6P#JLDs*6#pLjFGC_wowXsf8p9ac^WUR?wjlj;4jxo% z3ElbkHpp)!{`Z@|DXOo3uA$4J!h)1^P*8wnhDg5H%U+^Bu(s52+^3hp3F6=saWv#% zIIGYkU9c=dQ92A1k??6k>Brgn9xf)T+*LQrkt!@9?>xcQwFN(3r=Ng5n^S(b>^9YP z-k@@)xd$%DmyliR{kq4+`BZOzBsbt(;2=L>s?&!x_@uib828P6Gt(WqB@oP# zoPXrrFr_AV6wqC(Oq=J{T}-TMQ175>fb!Wq8lYrB5Q;OKW#AILJ}J1VKWs50tpD!X zLexm3=;O30meSX(guKbGWb!uel@pbi^(4Mye$`mZY2y_5IG-g-cjB*0n?c-oKDJ80 zG*+fpJu_716Q2ztVG?zqIaOFw90qC{kGg-_#Ezkx%i2Gh(5rwnODncP_`_%vyWKuEU&+4F^QD$~MK%}!W6s{9fF|&XDk%iIm zJ9Lfhb}7&F#zZ0^BlnGliF0UbYs|1u<;=iH4mH}r{QJvB6GrLB6~Ru#fv>>EZ>2{D zB{$72U!53R@M@6|n(ybS zY}F577)F@u=*u<$M(DMFWxNAgc*?6f@2D>ok(}yLC>oB+tAn?0m08`4!?BDlxfEvf znROH{QE^n=`&Ih;0nT}v7Eu#*2ck&}SIUAyLY6dN!)z+P97pKz4~Fx)7QG}Hi;a0y zbpT3??Hw8+@h`)SI3#*I%nWff8}nI>Y4H~5ji~RJ!vF_Wnvbu;wsOGGVwpAn3V;u6 z6Epd+99xwuU#G4hp;CH`sV+sojNXmTZCT!_ay37G1|W4`M?##rQ95%%wZ{BF3KPK? zcD9C*->-Xw)`vTAl=e&e)6b1YF5}I*+I1zF5vyR2Lbo+vzjR(X*BB4l*JDalXDno z`@6rdOt{)$jecGkRL5`}&q*dCvIcOLu;Qz7?u9#}1qrZz*oBF2^x=$)v1iJpp#USG z__HSLraAiHA^}HSNc>vx#{Q=-ncQy8sd;c4z_`X_i9v6aSUmX(3d2K)ew#-3s5S1% zTbypT{qYx6ena}MfrSVA01DuRGqfbu{T-Z(1zd!{9>K#d%GW66fX&)~${MD*st?tl zLG0#8^y9!M=h?HVC~EiiuBc?$l#Gz~9Zj^b!8kRUOhgAK*fI3&LMUCF_zaF1vIELx zbNO!HIM>&|S!T-bUA-&BprVSIW7kr6$z5;ZEw?#$=d43bQF&$iRD`3;~gNdtlGq_@g?8UUq+(d z*(VjMk1e%p-B}u;8zWx?Loq*PHwCKFwgw9LL9cl{#;Sq0-tb1)%ynizGsi@?hCY%p z2j>y^4h|Zrrj)k3kTXTxiv{pPVA^BPk{&pDP{xs^Fs(i{nSGZVReToX@NI4q2>!xr{4?Sh-D{_G zUaz@%m^w(ApbleK_8uRDh!0Bw`Esl2BNKN87ESvPc_Ob#KzfRcNnXUG{IpLYrCuo- zFtEl$&{YH;`%&-Zx;mxC(x*nR3}2219_JAaZdOJ&DOb1kgFp7;(r&BYt%0t|8su*P z-zUOUk(Fu8HIcw@+4s1p`K<&%R`O)!F`KcMCZrdHY8cDNJhZKx-YnspJFyiGNWhI0 zi>Ee_`bvl0mezj=2|S$leJ-`@#2=dnHUzS8Cyc8xvX_G4UXYDG-|VvO&Dqxy*D4k) zgxlt6WR8;?e0!f<7UN&4V~VfC>Y0_xPDrGqj}}{X{8adtW;+fc&F6 zjlqRhdqqaY>Iy!N<)@@8ua78Q#b>|pIt%tb@#R#r0omHEGEo}ObP}}103CG+;3h~i zv{T9Agdn#L^TVze+c`S`U;LL3lOt9r5|8S_XJXPq%kJ-M`j%8h;5y`T#x?W?f^g#r zFLdKLii`R5SSk%a%GDfgeJ*GliGWU~fEig)jweE;MLjQa8qP&seWcJM!^OwnTm-f9 zau&(e4-$TXH=oAIa&^|?lEl;PfZ?rN9Tls;F-x$%gvw8cnuTh%P) z(}hDcPMl~pxU$Dmw-Xyzv;O|>k|R8?(jT@6q;&3cC&D_d9Bj5TPy1B;qjoZo;#YzC z%2@T)cpqr|2`LK&PLWhc2N*9}2Bvtb)2+e|aVdVXNf}T=XHorFf#Y3nZ}yd>Y3!w@ z_HkvZY8WjuDisSlv|`#c=I%xspEP>--AH8dFVLeOnztY9W+$6-s@qP2ux#{P*kT^R0QE7-vS6|EeroXh#W zW4#=s(ZET>NAL0L^7%0fuFz5&>y99oRax7pJxUd}9EmEPbml}Z+uSB$yNcT?BSj8% zf6Royka~yjsrTu^dccPThk z;&fl#UB74_g&reI$=ySNeY1+^&4 z6+r_2+42tT8z-vYdN`#Z3FsX21F-HCRV&Fu{BOJ4oo}G+k*yC0qT$%@@Z?hxdA7II zz(N$#*UuEv>%;60Kv>bAaO|vPfbr(;%L>NQ6&dFolYy-(A%e|>;+H4VWBG6F%>8|D zYSw&Qf(e4FKLM#;nnhn;lrDE;FIVGxR@2oZ#o*O{xy|grRGG#4yONg7+-%t4QVOh0RAattRHw~&0#k}=T!i8ls0YsMVG%YhQ3A_2Q_TiMzuKrE{YIL7j(+8H(s|s9?hQZuy)dxzoAM|6 z>=tn8_7aE{L^QiKs~g#;bgQ9y;!9aKOF*Ssu)SdC;MEq!4;|7B*(fS~2&Tl;sDUe- zKQv^%(rMifJp+9`p4gBqvVZ-TqV=(#AX zx_M62Q!@SEYMti4;qGRJG^=oVzDK8H;9mo_zRx=&pGw<4U1&RT#B-}hP_1c`vT+*9 z!pPk)jGekix6ySKY|Rrqp-f=n4`?+J?2hL52x&HpJv@ECJBc*KVpucfOf$6xbC9%D z-aI(uC+_Mzzv|^JJq#lZh;Uda+eJlWO}Uf2pjx#U?v*!mp$YYiOEGoags z(bnkAzCvO9-siKou&y^4y9EqyP8R^g^lnU)4Eu!ObgE)&V-~(~ngfmuf)|ujnIW)` zsGku%M3u2{Ib>ePZn7{t6zveW#V1A(fo~6U{#;kY_PKvXZ(IHF#FhV+<*>>KwSCd) zBbAqlYfC+z|Hr>* z1`g!n4*hSz8^ZPfv3!+W`2So>)I}i#iReNi-x)oiegAF4iw@bQ{@;_3tK^_VPiRb_ zsz6xM;0JPZ@iZ!N^nv6zP=E-l58@Cdl{o*yZaDmA%x;};Xd%Uim=i|&eBZ6*uJf+? z^R8n?*74suUTSL7%F|Y~=sv)L=>oI@Wi_9>nrgkRhs_5az2(zqrvt4w?4vw`(8wKd zlJI!c6rS`oRpT{AP3{ubU$1)z%I?yEue0emz4l^~bC)s4fZqsVvsqYY;p6tzc-qX| z6V-bbs>^cAKgShRW$dgsz`@!zL@7L%he=TW`gM1&G2>l5N7rm2Hbv87V+Rd&^d)Q? zoX-riNDlV6x<9XRmlm}TR0_pX57_S0pCW0bm~87LvQeGLNhn4jy^&+SV{9L=t-NVY z&!KhsC81CUw)zOO1{19%+?%jvxd_@*nt#}IOwz2ip>5%UX}acaactE-$ZtN-W?>#Q zrt}MkXOY@C$IMK_fR$;IF97TJ#wR&~2h{mOEXf1;G7aGIOWES9AfKni%#kJQU3E*( zg4yv$=NXgG63@f8A{c@)7nC8uH8U;cu1eFWnGC|t4o?F+Q)|1s0pUI7qe4F7Iten8 zpOUl#+duB0C^}nu0(%;?Nv6NX)zV!nH}m}X$UM44E*ELc54UqD?=nwM<)xRCU^;P^J`FmWpz>Z1ILz>0ZN7_lJ?bLc!47WpvpBA6d?oL79>`hn-TP zq0T%Em2NU}Q2OFxbo5iAi2cGhqJ!So^Mep=TF~06qod z;Df?SOUO6D$&XqXhKo-xC4ptFy{jqNG`;pP`F7ZuHG{(Zd4QyPN4K{{YWSZgSJ&BRk*B zHZ=i#N`h+@^1TiE05QA1{)&q%VBw=#s6R4Y?wuN*MQ%} zc4ZULq6kG`fp{83)iWp9gA>=cwKAjXsDinQlQBkp(E)d{+mR=>uX6LSge`_+;`fhV}7>6=>c3>`15ic_{AXxTZD-;Ee@23$O$Fq}1 znExIx6YYjWE&?`LFCV++QFE_ShL*{<`-YOE;-Tb}HXq`?6BS-u#iZ}Uf)7C|*-tl!zd_!B~8bY_HFH}Btwu(V)U$3*L zN~c<56j0Ld$`FlvV4hR^mjta+c-v+Mb9J48sbC)`6i78!F;on*H9p|d3B@t&!0Ijl zUGTl&k~2*GftT;wdkwZ9%X+K~+ya-!l~aCcI@JuM#LVBQ@!F7DiS-bBN(Uz{0m(aW zu3{^V-J>6k7=>O4PnWm7NH#z4VQ}t!S{yB#>;NVtk)|lA)RKQ=xa93A>F*Zoq2rik zyyYa&G5L}uT6KZu`G_t`nZw>;7*uC>i+w(R?BEczXw4+23rb|X1F0Re|m%8ns}+CJg#mN_rW&%}>e$zUK?UK>_vN3uS)e{{nPCi@!2qCYAi9 z4u65aQp&Kjf3}9|stXn>URhm+@XZm8WZ1o%-yBqHi?Sql4+AcI0j7bX!a4*J27bqXx!wvaP)?C$8As-=}aziisr zdOvvwNu|-PV=_`l(v3+91q9-8QjcG(2{WT+N zYfH(2e`RLQao`vZ=QK>Gq;O8$+Q$@Zt7AKCkKih;tei|4dvRvmx5quo>44Z#M=y4g z^(_VSm!i{Hr6~)z3QT4SL{Y+>R;rm9%DQ*{ zI2ET+0w8I`7@KdqJSK~X-@k>Hjw`itf9R5QPbE4|#~BD+?dg?+iyDw%%gIgQDL6~R z**eaVX_mvY%;>jMKq3#O=Hw-n$J2D2EAyo+D_;uU5+!Gn7&=|YQk;*_#msr4xWwxc z9hKk7EtX5S=!;i%!ORC2>bM9iDCXEQpI|{F`#I1eZt{OF3vz^gD_o*uC040ve`$Le zlk8vE!e$yLfs*dBM#rVnU8YZ&HhFYGadBbMxOt;SmW&=>P^@8XfL|$DiUdowd+-eO z%arQWWL$>JHC&}6V6&?8K&sHz}+f1HmOXt-9#3-O{r66~B}*2t&i>D9jFV=Gqp%8h(> zN=;3re85;3W#9sL78}i1__{>LOK}}S`|?ngSoxYiGd^L5VNsD_n9e^R-R%)}S# z8T}YlqUj_-mWm@mFofAS%uPCOkVcs{reI=0NmycVi;f%B(|a>9kQQr}v!w;M>3BQd zVSAn((&kvtvqL+l79!zYI^K=<7>|)dt~d1+5STk4G$mo1GyOee{WHizd63AWue%UBmJn3TXCE9WGu8myidl$ARRxWkFbQt zb!<>i#zGMu!sHuu+<`l-$6FyPZ_&qF5$)ZKPw4ohWbl#g4YK#$IzEkmAnP``fs|n| z(O8BwDy(dL)F40#6N%E5U}$Ne%B$gyPt!GbYzfj4w~6W^llTe(1l ze8XAZnD`jCNIqcI6ZDwxNRRn${Ccyc1n=wk0e(oA!GHr9e|7u>Kc%o7Zu@3taOv;h z0OFpM{v7|L;TJmo8NZ|!2X7lKwNYj+u}PB+UsPKoxmvmL7_w&s^^0JN(qjIq<5&1M zgsygiA8fEi@fWrTXd>CG9G}1I_>JV%9m~U8VlwM=;P?+oasP=>bC?v@!Fk1=P^Sj| zOULi=2LxRLf2hQo__-)1Zb}l!Crcu-$+!gDg2lge{7I#h&J)`Qbo|9Wu`T(l)5P{c z9e>5&sGL1Wg!Kd=FQJZ8a9{xYHHK=gC*J!=@r>(C$iR?k1%^POXhDG`kvnBtd^H7K zDNELwhow-kwYkzjF~g1C9rrVv-_PYaKw&dW)mbY^e}}xWrZZWZ&f2hagf@0en+|bJ z3j#atXQOV`R%h*4d%0xV@>KzOmY?bsF)EHehIQ1LmvthF?VP#SwS4C8khlxhg}fT; zswn3_0wqJ4XLoGV5l?$Cq`7B2SL=Fr5u& zCsmxl}^%GkyL5wxPp>UzcNKTMqCYr{rjH};NNg2( zf7l%9MNUQN(c}=g*<2b_QknE0r^`VuMR@e^{71Atx2W?di~Xu(z{+jFl7s5g*#fqZ z2G#H!wyOxfxZH*vsqy-ZaCBGbY_YUFk^e=SFFSNLTs@po(>~bd>e;bj_ z%a`!jl{#Cm=KCC{`GTX5XRxcK=xbs$Y(_d2xK3x+vl|dRYGvBUxtVuf3A0rKRQ|=w<3lMfE}@Ip1*^TBzWD6P-lKb=d4So!!pv zkZZ1MA>Ju-9_~Yhh>0DEx%Zo@7taSQwLNe&f~GCtGIj_jiiV9`-c*gT|iG*&o@nAxqbb zSJwG`RmN-2zUpORFCtkJ_7SI2*dDf5W6$gC1-6fvPDM@L!V3SQ`uTZfb!Bv- zyhe)58&hLQ7L_$}QT);5e-oQ5t>nKXP5oJoy@HU{j)h~y}Mc( zGOxIBb^$_$txs}xVWBid_9lBvV{hy19r=bzn}`xJqE`E7lvdXJk|`Lyr?dCj2MDd} ze11P^h4fuhxl9)88gt^n&Gx6TkJ%?0`&8Q9X9%5R6mRg+rAFDh#XuX^ijW@&9T$u!k_*&y&(s11VBR zzO-h$oyP84_1YTye^F=umana~Rdu8lDz~xqYu=P;lV=o;DHx-1B;5uj71dYG_tlP7WY!Ky&UG%N zx_U*bD`G6Da-O7fO;+C3el5$Bi zCZEOoAUyYbf76qACzBK6Ch6eendG8)Ke>5G%n4%0s16tLY@O%uT(##+;Bn8+!;hsg zd)tD6RGLtp&ihMS&aj{x^bBs^-^~XSR;_E1=1n4w)A?X2qJuPL2QjkDP@Nwy%XAAV z<0x*J&IhvB<HGXpR{U##c%k%IFrROHJl-0wF;iY`O#>;eggA?m4Je;CL>_c!A!_)3kRsq?e=*@x-O9BV+( zmKm?gsWmG{m^?-A)VVr8kFTQIYXe&c_#77Cv_ReLbG}CB=gV17t)i}=YN>yvY|mPq zUnn)4tmY4jN~?VG?8Q32gkP#2^BUVftcvrYmMq<3y1Pt=Vf=E0Nkc zf44FB5V3QJ^=^I*rPk&Z$6$Y*&aYQAL^6X25wgUMI={)vA7hESS?AYK!b0wIqt0*T zw-F&S=7+-Er)?_!c<0SLBD{ga0tY^U-y!p&JBi*!!cabl;&qgy zyp*Q#N5jZjOjyfYZ=22^5mD~B7TQ#@)J6Ll0QWj6vUy^+pOmt&fBbsVbb|+GXAvA|G=Lif7)cO z2n$mz!nPKFC%I)n^Q_LF<9n=^a3hvg*&s7CPM72`+!_21jlX~}B+g-sn3tiJzNqt; z_{)@*2C))e4B_IqkrJ_5E|O>^0GkMD5;U*s{58HGp{)s;l2FJT<|FdMnlNcTVBXOA zoBS<=-gYk&wo=yynsZvr&ouFbf5t!_TP>0IE<%3X4#Xxm2)_4q{sI4x;~J4YHWSnQbLg(|KZUJy@m1GX z)#Z(@uk+Vb8JjDg?4#V}&*qla;k)3OjMl@yKq4kz@W1N(EB-gN{cLSTe`zI|XipE6ba&X61{zay4ZT(PjaR6a~Z z7#*wZ@OZYl9zha?u^V3Ni51m8AQJS_!m`>3XVx^R)C1v zvfvUYid0Q4f}$JBf*ZLp{B^RmFs+I{219>vB4CvUA32w`%(`x-Y@ z%mg$-YDMT=PoMZIQ2DEQ%gIMD7gNmIw*78)0_&s^c$t3%g1gr8utS<@=++7?Djf9J zQHMA}tL_D*m6h{L%a+JZ6l=;?26mrMk2DPgOst_Hi>VL>#eb*$e>SZq0O2M^Jn#fT z?*18Krxcz{Tdi!KmWMYZX_Ss6wb)OZrRb!p*MzsJZKqAFXrgoUjq<}&+L?)LBAGzq zijWn*V2S7j1e^Tk&*Mp#7W!B}e49Ti;wm%t%WLPzzbHqJwe-fm4_|!U3qqo3h<&nD*MTL4~WeCMBkn_igkB*&)qrpMj^tYf_k23u-Vwfh5i)Z6E z%cBp8{&dx8a%f(n`&K15{o_nnV^k3L4Z(3aCE-5A?KdxJe<9H^&DaqK@^^&-Z|b>y z<`PfIRpNTt4q;q`gG{Ie#4l zIVC!;58o1}e=PAWN)ny|L&zwP6ok+}(W;3cx5O-20xbz*X?8Od7kA)kYA4L*3va^3 zIEw7ZcVN4W@nb$FYI?;X7h(Ki zK_*00fA9Dj8LM4Eq*SyZQta)KFgY7x?2*xeCeDqyfq+$P6++LZwS~~in1BtQ7|;wN zpJWI@h_cO(Q+RAuQ(LjHqPn!wkVdqkMM+C<=O7dI_!ZNBkInoX>rUViUh|)GG$%_- zk}que$`P&&U%%IUb|1d15_r@Ph~@8%X8Z|aV%t*I)gURF_CQ(dKgx|A>Rtt4bEldty5 zcSq$bu=byr)2m8X*uM6#8Mfm~pYr*zA;h-9p4x96A%kQ^o^4l8%AQhNv#g>#q~ztm1no0*Gg_PQ*5gfDcHFMe{M9vF8%i-Km@Sz z5`OMJtCtRu0~UYp|6U>z`5gU!AP}O&^&+LC)kM??eCAUEB226zti>< z&C>%yce8KKKUOCpb#u#XeUdo19O+3D?H?d_$|x*s379meIRuxkW{GIcjhGD?*4)-7 zu3?ACnIx)($~4h#>Q@h|=gz;*BK!7M3vIypyD2Ejvju}A7pRr}acF|H)yXUq@v|E8 z;<_XHGY@~^d2yl$U=_U)+S*!RZLf@g%d9sZf)yZiv-K|Gmy~1=uQ}pB&y!FuqYPu0 zkY@YChvmv6{Ii(}Hrc`3bhI_th#OX8m&g4(G!CzJB+{^mXc^QZ(Ydgf8>wMSo8C%1 z${Ud(_c^|X>$EN63_|IW@Tcj{cO$rmmsM6&SNMNNAb5(EGa6eVUwUgB#zBse^$_$& z)ztXw{I#V^C;9w~YRc=<#8(J?9X2$LJkxJR>m>2D2U>~0>*7=KS(^A(?WEAWPNuQX zNZfZ)+`n}3vG^oS{D5#m=HUz_3H-Md_>(R^6d$FD0|+A%6X*b168ax0^q?-@7aydF z-w=OBCo0szcv~mAfW*2`7jKHU(p((j#Kgo#c)m23E6PsFg{@sK&Es;rk~Nn{ccsYf zbdPJ+lV3vILZ313pXN$c8=p7t339)}G+5tSbEQcow9&;I{L?g7hTJWvxzsSt)h=vj zkLXa2JVoQtK{lnME?yJ+(_Ebp&P(7o1X_P0Ow*us@wmFmLF*RwV=!?&97=N?g)lhI zg?C|tLnG5us-u@KUgi5qIY-NHeRT1Xcsb3LiE!5Mr<@3&Q{%E^bFy{uB7cS&mn**= zql*{BzBCuP>_yFOT;k5bb*!v=pf2``=hIxrA&hn2CM03Wnrn!ZJX9CYi9J+LzWjeS zOc#F?&!)LfKqzmKK1O&{*NL*;lXUU4_(Pg&6vC)x^e_?fA~SV^H(|+bf%G7aRIEQ+GSnUW?j7-AtSwW)?<*`09_lP*QD$Q z=$Eq-@&I_3HQ zfo4C4QE90kEh`%v;Dn&~B-MZLWlCgwqlhI^6HIVwe6Twt5>7HivOaXLo38BJ3L_g} zTq8`_3R8@O>_#ZgYJgeU^yjpvp|laoigNaVhkCYf69~)~yC7>;dKDMjp(fwu6?;JU z3a@Ji)H0xZRy4rbxmjMbshn274(7CFbLMbNH`xR(?Cyw3t>K741TzT zN?l4N)=`No;UZWMm%)EkbaV~e4A;Wla2-j%o-}#``~hxM+CLL?k~doj;iADB1QSJ) z&`9qiX&Bu!v@Vj|O(Y8s>D>>yND(?{B)Pvxr6WOdyNFhzHI-WpgGHKXLsA+cosQBK zRQ6fpy3ZI_b(A660u$}%Sf?{a4ecRG$o`Ijq=PU(J*84$XX$pxmvCi-?C^o9o@6CQ-);2{_d50jKfU>a;DOmBgO@F+>! z3TMGKlJ*!O_;EsP10i%fNo|BX$Rj-fJE`O@3!}XuS9E_9-D&)eBg9Fx3X1YMIH{@r{jaI5sXA1DH@Xu(fBRN(CB=_k%6y-E^5+u@+UE62c|N3 z8rw8thBqmDCz3K7uyX>y4nj8EaW-HNg;7qZTTFp!qx!s-6emA#$L^*NodMFzJWFTy z5H|OcmYydp?V}-jk&yHfVd!Njf>#NXuhD(4lB9nRDdc?wE8t`DXrGY8PswY32DifJ zgv~z@ZoVLF{#j{!DWs6BaTYEITe!?LaajaiMPHFgI$mKRw9-Q8b&x_w{pjcpXh%m` z3XKic2sT(~Y%tLn@R)|&Y|~?Afh!E3{T%Swc(R7wBhZjTXy`3+o%|#A3EF+5`6>jZZTIch~U1JxIf$A%S~vFmMO1g#>P#Duy}&b8>$e zFtKA)U>+X^%&9od5Q%S@fqRo9FpJ6a;Y`Ex;i*LtFr620epqIU-8fS@zy)D0&KX+H zu{$JWo31Vxj*AI18`bAIDjXLR75hqkZm`1fG~(ibT_72|K{`3Y_IMQZ#vYJ~Js}Hw z!BCXHxqLK~U>}%{eW4UHVKMfDb1;7k&c$rF2y@_K%!MoP7}$V$a5MI|xx4bz_!tlikT`~;cOn3|g-%ZwVZ8C;S9c74oGx(DK_!UMg=Qb@Q z_~I!VmWKr2X%tUG2D?%WbBv&i!|`)meE2ba=5Q$*s|?Yc(m^r?z%&a-SQLL9N%_J7 zO0EznC2hrO|QYF3I>Dyq`S1lbo!u9H0%uUa>n2(NxX|#`!6> zDpGb6AW|r1K1_g>pC8bW$j^VT2$J-Pa-bhZu09Rdc`l`yfX5SX^C1O?Lt8unI^qcE zizh-ho&>o#5{BU@D8w-^4adS991ruc5EkOeuoNf4Dx5@MEh5=v@Bke@jHke6oJDSP zHo46?@By9*AK_{6CC;T*%!9A-boc>F5wQ$Yv0P!`3QE5F!i5Utf?$7Bt3d98LMT@t zPl7oxjh{y`T_esgR-8abZpyfFRh&;I7uwx)tD7N5nSdZRp{qDA;A?2F;=GV}3E&LV z0>Gyu1$^qgONuMM}oswlQs zAjXFI?(6XelT`FINyUp>@y3AfzS*+4TSIs%-WgyN_u3i7{c$mh2Q5bNh{-6nNJjBk z2&32@jZy51#VB?;F^W}0Iyb7%#?Wa1JcG=lj{Lcw{P{BIgv)=S53YbgxDrO;nJ@*< zhN*ZCl;L?$kE_U!uO>#Z2G-z(k=I8-URXCdnD`uuk(Ky5bi%S?B zVuGB-#0`YGTL^O-33Im+hq#S6#O=f(?jR0vCvk|oh(mweO&sDL;t=-|huB0M;y%LO z{lp<2Aly9&SK&iSnG3)Z!5vBx;ts(CX`?kH8;v1RM;T(e$rw~Rq!L0 z#$Zo}XfQt!GaT8%N8$K*G(LQo&Tys_jh~uq!ELgI3=1ccEkr|#16z3AVhe9OvxP?d z%tjdg5{-W_d>x%Id>a>G*wqwa*cCz;cEw2;?t(3fFx*86c%%CKyCMvCp`4N4f=TMr z@QiCHG)mJ;#s&(RjYJrB5MkI!gkcvEh9`(HJV}J%DIyF{6JdA;=Hj#9!{-R8d!Y`W zC#1dr=i`fTE51bXKPSTQBGvE?Y{hqBH@*kY@DqND z0zbzz{F99|Tw;-idWCLD8Wx(QVJ=J)rzp~}*dh(*TclyPMH;qRq~TMGG<<6#4H*_` z$OvGcjuiGu1MV==VAMLxs&%$i>l`Q25HJ^?NgAZNSeIgu2D4lY(hw*Si!_`{cJjSA z&C!2Fe;00oUqvy&xnf?Ji~b&eFkSQ$bgzr9+^`jY47li@EyMedG`vHG;W4IMv|(q= zWzYt7-79jpGk2InW_pYntiZ+G5a%3vi|L$Q1ci|layP2aC2B5fBrI1>dL$8p1LkMI zNf$u|b?X~~|3An{|C5~bcjTo1MNayA7)({&9)&-`Xq3M!`xBgkKf@9{0G0R)5rqH1 zay$qt@K+)UzY$3|1nU^s9CbI-Q4b~%8bn~S<(@}d?zz&Mzgl5A>NPe;eS zjxxmQrlZc5m*AiSBMCTPie~ACX!aqO450%d0=Ki5FQEe{f7cT#H>%GUm0Mm9?~pA(?p~h3U|ir9wwWE|Rr|Y?cPcla5ERwot^{!(`S0PGw&3 zu}-jry10~eB`kJ>^=uGqpyQ3KAKb>W;31X`kFy+jk>$e6>=<~P<-vQbKYYLjz!&UT z_>Ri|%8WezD*}R2Usz_k`voeWdiL?~lLP|qgA zxoiroW>aAen+_MV8E`q9NmeimZeg?G9ySLW*{QIDod(aaxnU{W;y6>bC05F|B*BzT z4Xl~6RYs(2RbeSxb(EBCsYb?XPuXgNDO=!LNXo`02)`pD$A=?wK@>#Ri)CSmoIq-i zK!4=K03s(_h@2LR$Qc1d&bA}+w73vC&qCyU6OrW-k&8kQxg;7QYhod?CNV@VCPY>e zBC80IHH65egvc`pk+p=#IznVUA#xcZas?rBB_Z-mLgZP5$nyx1s|b;+36bX$A}=6B zt|dfXNQk_M5P5MJBA3UB$Q2eMS0so?HGi-sB3DKr^2{(qo)ra==V)YDc0`^RL}cKa z9gz$_pj5!%2RBkXQ|ZcA5!1D3>c7NuTVu9ba7hWQ3oJ987X%1;iaPVODd zk03L(9c%@{O)yvH7{zX#GN_mf9E*aZw`Zhtzo z$D5=g`6lR_?+(qw+<}0vn`ONE?pt)m;*6(&sGTSy5*U?S1U?xdvK z;Q{mW8B)Rn@T~eYz*Y^!RoJxzw(AIN*FzU}1N0~0GB_rmS$L4Vl99)bthCJO%dQSiT?fc78}fQR4}_AtE39)XY8 zX84kAv2w7fiiT#XCvu&{YO#hQ;7aH%&KDODtsMdtR;V|ExwQVTEKq$#8C8h_)mLII zm1F8iLYS)~gHEKwJBmcOpbNaLLVXfx;Te-o$f@3Bs@JUmIfzOb^0e+2pf2D0k;RM4UTWh3|V**soJ8;B83<6bm41Vt3C$aBFPk@dtnvnqfah z;nhuzK0uj5AiiG=9(E~yX?oK$OmFIykj>i8u9`^v@>(E^zHtY;l|i=juRORGjZrGX zc0dQV)8=QrY8o6!+iBtwI)6gd=is$j*0ouIm2l!xGNEs9otcr{pr|FlD$8?X-4cC!;|g4QtmGq zs=#AnF#{Hh%c-24GF)XLaFxOns-qK31g^3WxC&R&9dZV5xx%r_qL_wUi815O*(wYy zS7>u7JmrEo2x)|xgMTytzriq6s3K383rQ+NH$YW~5?Ejk))h2NpYTsj%uJ@LWi#5C z;VnBWM@6??;j#Eb+e*PUR^QqvZJ;`m+F)iSS5n*8lNOEDifgFl@;+}?BilVOdoQ$U zWY1;oU@tP5NP%|}0TZcf85F->HUZj6Dv|vaTq>_U6lO3z}@O-6jz=2!Ys}1ap6SlHHpnDuOec7ORv;U_zHIbD=@sT@oevInZ9lm1c)*~*z&3wN2dnCE0I?so25p;bF~ zyCnKHViR=S%H5_^PGRDW!1;beNt~~=4*l9g_By0JF0+737TAT$W_9Vhou_W0fy{v# zsHO3|8a{!~xy(J>m_lL07`Y9^7J&Ug*~w2dT0c{G_fTzOcyfs|S+rUjc9q#5C@Gx%&J9&H9%{#z8?u9pa zC-{VSrxtX9FL+n@hIfMl^!*_3fo|RxQ+O{-<-M^jKN`F8KG=_ED&#y(_!tPo#Wl)M zOQ5s3R)3kcpPX8nxQ@>41&*uf9H-DcR$Q;H?u4Vo4RqwDJ_oLTp=L#{qpJt3a~92t#l40o}bVXpy!%|GLR7H)}sWI9L)zqHXj20`SDP|hr@VsJ`?x}P{Bt)9Y2x6#7TtoQLvtmgB$pG z*uY1_Eqn~z!wX<5o!dp{p5le@ES~@`^M8}!Z9dUr<#mb<-9iDP!lXmV)Y{Wk7}1D# z8+1sn1ANbN*zbvrGN`K~8G@KPGUf%-VXq=Vf{5NzDrmW=w~wiym851(lBqV$B0)y2 zw_3IOjJl|X+o%RZS{X?*WR#oieW)Zs7) z-p+Toa}7>z=OWNc5_I}tSGy!4G=n`}x9xcm@0OpU=o0VQ&J(0dxvsntqD(0ZWjV6yuC2&=XyA`J=9a_-6&*D+{Sv=}KlSd`PZ3^~+oPYau;vVT( zX~eD;_e!^`#!os}qlR0p8g4UcP~c>y3?B#u)1m;k`VCU0-&}bJPJ>iCtD?W^g7GOf z5%ZERGgJB1&{7upx}Om88s8tAeDSO>^2N`LO1|!LAYTs<7=;7b;l~8X4j&LocKEST z$qpYBNp{q^=w!#JCyeYECx4@oogofnXGk1mCqF9L$qywv`C()yv^_4fK(ojWKNmE< zn!Lyw=*usF9DX4T|9A?=US3@6_K5*iR@fMWakD7 z0XGrZxtYk$Ekt%U64|+p$jib=qa+J-DF2klN~)n zcJxQGqi4yE_K+RzC4W15i6p*2cC?S|=tZ)lSILg{lO4T5cJwCM(OYCk?~on6M|Si+ z+0ln&M<0eTTRM$K7k&Wp z_hySSibR`(@yb! z1~!Vmc5tNkTM5I9u)>7S)#l{?K(U&PzZvc^KcA$|-vhhVrvbbL;HAU1kW53CF4~h@ z=m0%MN9Zd$!4S~}CWx*uMH~giq8m&XJ-{z|!nvXstP{QAM$v~rmkoD{9JojHCGceu z`1-+{CgaP^$@opS$@tGKKz=5U z5&ab)KeHy|KeGV&nFYvKO+a>m=d8*2o#tfxTMDGx%*pr>bj@hfW@?kslEZ1-aocUYtOP83FT1_f@2^TGHg%RBnwJV|!`j6v{vP(}-k3iD*z^ZaAD|PKwuB zlYinmEVCxX*IGzeYbA4Qtz>Skg@m=%r1;rklj4Tl$JC_wS~Z5uEH%n>K3Q@Zgf7#r z-(VPxC#o6o<73Q-Z>NF!0}+gvNf{0gOUlHAs7YCWhonqCW=uwpIYV%=IYaPdb^|}X zf%|0UADlDu3N>lQ7v(2eFN<(V-^g(opns|HCbe@LsG&QP+qnmOjMw0;G7>c@IfR-V zZ;FYUdP4hYIK5^ZlcCbs99&trnSyb4a}OQ?v}G- z4En*{@CbF}5!j+WMet=MF_kQ}nCMOk93`ehKXD2S6|;yO%_grj2j+@XVX-(3mVb-6 zgsU>Rl9KRi#R9mM%H1t0;6bq%9-+_e^tn?kv8EHoD%{BhmJ>|ed0?)IyA-(A#GOur zbA`g4^Z-v{R4r+-} z>mww=kg@VR3o-zoRq8iFiU;(j+yI0@_pfdQv<^YR-oY^$Kp1wH&~ZvBP}alML)2WNLhc z$JB&eFY%$3w+#*EZC6-%+f`wC+ttzYwrd^owrgYOZC5zuZCAw1+itLOH1kVH5*Iyh z+YmKx+Yp+!Z3xfXt_aK9Hh(lbZxgEt+80m|SxdCzA{zfoX#6jQ5n>&T6PJ^bUP0XV zN(v@d!6I=r)QB4>pj=B-kaOab%Xz;N_F!04Q|jc! zQ-qJ4g7M~EmT{Ldc~D0Us;lxydR?ZDo*`DsslGpoz$4>nW)yClV{F&bDVr+Hk;|<3 zUEzVa%od2-D*2#}q#7Fd@LgUeHJj|+ac+9LoRUh8~a>7>5hIa{61k_)A$xr_rDG3d5 zmqy;Oo$m}E-IIuSkAzm@BwHt2E6M}vC@{LM4Iry?fzf?I>@zE~I987FUVo>~#?XeZ zIuIw?IhHlFZIp0>V+DrxMIvy9@B(vhBu(za#CL~_9AOh_UsM>NZJI&bsJ$GETz^OkYUF?1&i8InJ>bu0nLXGSL`Hl0UINiA!7Cx1*FXke3f*~)O>w={ zQw~r^cbYxwC0>y|Qb$U03LP9UojUm{-|yJTSHd3{R7CCMU16PkO$0>lRC`%bQXwN? z2d_{Vcs<``tR36V-`jKEFx9*%-ZH&~X0oZ%vWzJL;T7f-!Ey4)oFZ^Z;*=(zPA7SjqzaSN)9KdP z>L4&fuz%NjzAS;1-N@VLG~l7_+#ANOSa;~gj)F|q1CC=oVI=DfW7yF!iS>bLtS_9( z`dI8L6TIp{a1sqeFGYV{G8q$Zi+2>xPE*7c)X^!X7dlNXa%bx3UGbi|v|Xy#ka4T2 zULClR_743;Ddm0fL35PCRtJ?L*E1@m1eY`JwSQJ5O0;Fmg^CUM(ss5kOey#>bi-F5 z6JMox_Zp1E*I^940h91en1*k`srY7?Qr0A>6#4p9bfsJvMJXQ&lWkH=Hk2|uE~FIM zkTNBJlqo@_1ZIS!Po_A9Gq>}pVK#@8Nh4E8BU4Eu(?}yFq><^Qkr`o{*cMe2vn@@` zR)6^qs&n$~b*7G-H1SvzO?)gqG2!7hH8IOfVTeL$qlQ*G1yagvvepCqW!bEuAQbd2HhzCg#eJn+!*%UF$Qp7B4lb%_s`;25y zRm$PkY5+sVBTAW5)$FI?t6R$nh%^;t1AkiiRD5RQqtJ9tDOr?=eMT{(*UaD!fyRD3 zRW=8eqW0gD|5C)~;!o;&3bjaPO>Xf8oN9_aP7Re@_`tuIwVi+2!2i;~zupFS?d1Oe z*v8(Km7uD`2rk8t#{NtV{FTJJtF=o>akX`|r$IHYc6N0)ulBI6_IC9(&-F9TiGR3qTzTfv z0M{V%>R{{Y@vh$8`YWr zf3}>lm5JjdPK=WfTyUr@lPC$$kT?fElpsg8gC#ozSj^ZO+e*e7Ga5N@NTH>roF#;t z?xyL|gQn?W(yil#ZArVkbhq2xZTG&r_kC}-dqLUnJ&nhbJhEj1{D?H~z3;x~$=~_$ ztKR@{1HI@+2}%|CRFq+V31RD?IT}nIoftCAW5IDPZP>vmBYFnN{&koy_P|!ZfJ}g(Z;o)p(TfdQQJy?B!`>*sKjywRVr3s zC7~)GfS@E&q0upWf>7Gfc)K6fSgl}{F9)~mQum}Th?5n)rW~5WLZiVCG;A$1upq_n|u@<2=Par*+9!&-L zs99M4T0#H)gxw8)b4^(Q&C}@RXjBnE6T#1nJ9XY4WS?ztm=Bxgu%QQsQ)V*Q!5`fN zN7#^zw+WjS1XXMi%B(F6N+`F@3^$?WHWk-%P)la9#Henj8De!#JcN_BKCD~KBJMw+ zV!HsZ(T9eZSYljvkfJ)9J)ZJo2X-oGR{%!+$KLYC~IiG2w}@6qo`>nYB-O}Tx*q38)LD}6PNsW>j{mZhgmgY(clswaih zPpG(mR~-0f3Y{otAH;nM?pN_4e3%eiSa^q5r#3bwa<;}c3kd$qA_VtvLJsnVR}eE8QtbiL`_?A|(wX-GUrIq@)C43nJYm5+0D0 z6lnqJ?hb=g@8%qR-}k%s{=xHX_F6M*X4b5k-$^xN%7!N+_{Bh*V(xBFOX z?v(i6&i4+EUfr|z$>kr}?GpAi_~5~n-bE1liXV{lxvSX-zP(LHCEZ`to2>;E=6V2= z{6TiC3YE=UB$VlXZOMmgC_9W#!)c0CzoqCU0?lCA=K8$KYZa-kurI%UoXJ;bFwYur z?}MFQ0A+?penc7uRJ**TN47u^@B^0fJ}#M4x|$o+CT0jLy}eEmRp>3y1N+v0vm)SE>+-(Bh+H^2L^b}@rl!y_N1DaXX(t? zw;$r#U20e2`TA1q{(7HZtKWA%=-jpKyQOccqP-bp`E!qP85y&WOeX@@LTj`vv3gp{lmJPvt6_q*wdx%R#(MRSz-)raZL zMm7cWGO&eZt5Crwm+&%bOINGyyQRIpmy=fBdVHtjNbzZL_nka@7h_`%S_*;YqD9nl z;i#^C8mU%u&Z3V;*UJD`pXigv=fNSedI!qKR;@8#X;ADaZQod7>1Q-{Qo$=o@vk`N zMIo}f2W!U!t;vf|Q&aBfO)WE--{&~6{asGXn*MNE>yY}_?GE!Lms&jIy+>qx?LVYl zT2G=qQupVIj{Rv~LKg)~@P1?cE?msmA28{3@(3gRz|+Y`pt6|qa&}N>6RCgTA|&`V z&ztNk>v?z-V-%Z2oNbECdRN@OITHVuamVj@oUEZ@s$ zNc&cN6VIH~CK&|F+VN6G@B@2KSJy(G%y${5S#exVaH@HecH1b^z_iMbIOSWy!T_Td+U*+x%CG6 zg;B1f(}1p@ZdcH|I98$tXE22#!IBd2kLU8TxFDd4;NWjXk|C2PjR1(6na8O z-Eoq4*V2D$zMeCY+p=%GWmsGtT+TABbuFovBayS3E=)}_d&czVYhE~U*rV}2on&T> z=~Q|~(Gcb84>^nPRo6x1RXRP86|a7NlX-tH%TceG3P*34#nn$i#+LQr(9_S4)VP)e zpO&+hrhZ@A_LWDBmugw{m)V4+Wu&g(cq-;5_Ib6T9-@5o)7{tSm1QJ!MEHcWYT$;)st>;Viu2XOeBtRqkHiWqSCr;5qTgs-JB0;7q`7 zqg1nw^{h&=GO21KxAcunV?jYHq=%MruUy~yaB1jW$yYM|3eyZQDhUS<=UBVBj4|G8 z5?2ZP@$X?V8&iB~se73Eb0afg`mu?`b*Tw2?N?t@6UVjt_t=V#nOTnbLR{?y$L>D^ zD_Qy)z2U<0id!q@g05JCS<)SpRs%;)Y&zcp#Ew{F-%>c{--bqAr!yosHbGKW3RjnA z)$KLbK^8B+HL1VO+iHh@0QsU-Y7n)rwB0y()9iqPEFWs-LMiCa$0k5PR1YmRiO;iJ z_T6%ykkeUbRm{?MG52TTur@1yLx6jWVTs#sLM-UPcJ2> z|8~rl{G!%7-qzIV2LsNYQI<#tp3YFN?8t>&+XCL%qB)8w31A`}2J1ba;*pSE!V26~UKB`TGCReeaw@^$dbgH-QN z@2UkELX~@ci=%c;%LkR)2@kcCH1{9iJ?_0jJk*9So&7oI8}-q-kr!Dv(yiR(Lqs(q zaWJe}ZmODXTsmi>WY2c$queLg21T__3Cqo^`F=~Yk_&?R4D7XI%;3n6c!ym65D$x*E5Jk{kD{s z4wd{_;VbjkYS$*He0leeH02{j8ZRM-$&(u+KDCe=nBLkU|6;RK?%{JCS$k*iRcEKl z@U=vaq{UJjxu7kh-&ZQ=t{*;<6kBB5?$qR*O(m36mSRlZV4C@KM+W`Sg0y%kA5xqQR+FI&A5%W0B7?ldNZZx%|nSxNRJ$hp`pMO4+4pBv*) zxmk^tJ4}njNCOpDGc5fnJCHSe9Y6Ux#KJAh)ZQj>hTSG0CA1?c^}_RB2$HYReGtQA zHP;HcI=Y_TS(acuz|(zuW1FvZ{XNJTN@m-Mu$cOlGyFB$l z?85ssHoCs4`TL8kdb{5mqZ=2u3kvoRMPz={_A^qhnHTetnZJpMd!w;r$G^DsX5dnN zgiGVB-WEYalsP2-pa*+?%+6Qcoet)DSvxIhj@`98a-Jw6gGNa!7$Qr*5Fs7qB|!bD zohUks;z;1!t+RSugmW4Ref4%&Jkm`n!b->-IS9FPyxWNHL(DG(Z8@9$ z=RT#ccPPD&A^JM2TDn*;#r&&qA?;P|+B(tuL_`zOoxwW-VevhG8&?(SGy8}zdL%qG7Uzz6i%YNg zKFSpSYt{t*OEnhfw|l`J_OCC35s=&@@gB+9F6Gua?};{e9ka}uDYEJ=J1!!1 z^<)$&O6(QyM;ROplb5CRjf)Be^=DFMEc3ZijxFlix2Kd=UO~Fr5UWJi*+rQX(a#c# zH)itfI}sIhw_MjgVfloU7M4gA!Ob?Rp>+K9XJRxep{_J9CYD|7=EA^0#dgLD)1wsQ zu{D}SDXQQ6m0nHDw<}^dVuz$Fqed23jOct@byhe`D?OWAznw3}m8Q*p<7kVd)uZsm zu?be)mA^gQv)_%(-s>sWrh2(&n6fukd1_9P2k|SpfEUAjr)#XQiRdK^E)pBE#9mIJK$INgy?!MkDOdiGeom)H#`Yp}pF|Ev4pzHZa6?$@TmH!bwMfKCvbq8nmfkBUN z*bjcA&&^0+vP$|!goQ=R_3u|FF+1n-MjQq7xe!_Y5DtL83Fj33pA&ep#l;sT34r)L z9DI~|GY&iE0E@q$nj}D_x8fXOK0kTC4woJfNQBS;aXk=RV9+0d0Qf)QkfDCG<4B>8 z!9X9tA>a(50+@^t9KenY1Q(Ukg`_ar}|fwHX3K-5kLAg_a2=H-z&JLm&JR58Z_d#W#Xe z4neDj=80A>JsuQ=cml@*(>YQGB93aD!a-sF1&zW5wD==%0cR6XDAX(tCAt9x9yc!R)B z5w5DdKD{aw@0$1wxVnlXi)2s8uQ=>}raShnv}-V+w}NmFA}=oE>UUM_eoh#NGJ$xT zm65;LM*oX^jk8DYn&cY%DP-v?L{xn#y6^1<){_sSW%BExQ|?}{zM-mji5}frN=96d z!cuyv%YlTCuf!*>J$$u8?bk-S%Bn5o^!(Z9dTM33nDBm4w#91avnpg&E2p6KV$IE( zufe_e*8n`2eN>x4tmeb3#k&cS?UR@84aS6vd~^L~DcP3)fQwvh%)?W#XON7saDGEA zacT4UW@hgUUWoQkjszr zKRdv3izyg(XkI09lVax1(dYGH-xi$lxJ?@?@X&1aBzGwyA=;BXoMabE-W)!9V3C6!Jbg+PQ9KZE$fR>b&>G@(gb^5`Vni8O&cwr&q^&!aN#pOY{CxpU_M9 zQuamB!521xlCqKEyaMF9mwPOe*>3(v+ zeqlmAc&J?hc@>?+V7Bdm%-*MuGNf;OYCiklMp>+=UXLrGC5&}+AKpf07SrjLy|BO; zRh|5_aeeuhu+71s*c|Ph>(TE_M;9N{CUme%(5YrUZRz(jvuN)}Zs_c~kqfR}k=PLz zQ*=~o2xcd|(iPLd+K?^pCT=|ZBu;uf@T;`iYo?K3H*#+byHBjX*S$Y4B+9%2ea%MG zmfhR0xzQi`Qb_gl^S4#44LlrMBE+F2d&P48*G_^OgR`n=%k=Kvk}~gk(C8N5za6;u zB-X&_H+Q0AWWC7v;si2XU;wvmq=?cebyH0>Im<)s8Jpf#K7-6|h%;~h^uFSjJ#FwfVnKhJVsmul!S#8kpZ+pbSbU6Go~7-INX z@?&(Oc2v;wm8CZq`>A8u_r1j3(r1s`Y(H;9`gZ2u3m7ur$kkj!dXY5VauN+HJBKC3 z54qK^TYnc0D_u+P6o^xk<~jMY6`M>UNB4jV8!r>iAYuG!2fg5NDGc>1}qyz{!N?yp-(YplprS#8m{&$W01gU7np z{8H0N`BQ5V$&a4>8^b|MW~QUF$9;BeB`*Z*~h>hfB4PpNrM`vQBoB5_eOq%b+Rjn(7^z>il-&aiKSqDu;cy#S3vy zNnG$NTlRU<39^lfN=LcauW+0ZHmO#+B*_J;2X>3*K-~9D)3TMf>h0^|+7eN2o-)jD zpD5&oD6sA>yhPHa6F%Q3cZIL*F5bdL${%49-A+4ke|+LFPK)zZ=> zpSKcMMn?B2DC1t!@n@bpJvyWBh04`aZ|6B32`XJR&zw&!4-bseiNclmE4_ zwF7K9rIk98oA~#xik?QAGI#zu;d(T}@omJ>S}Dfz&CO>Y9|Y#)bJKk=h#Gc&#HUSXh_H{%`og+z6r; z0cQjis&fY?<4;BwxP-w3C=k17{|C1Gg(z?!))oX2>|b%BFcca?usROXd8j}j0E`Yh=8MLNg!Jo^8~{& z^FRlbStA%x_sJksn90ccXIRikmlFkWVW?V4h{zwAE^w#-8H5l3;TjB>qe8#{ei{fK z@*1@<;j;?F`20Ln@>VUSv)kfbG1mJLD^cUnF}&RyDo>K&@)Z?^FTKe&BFB2reM*S>nZQXwN@mkZsS;JJL QQ!baN zTc#`^m-Q~|Xoo)vPA-{jpuApVA{H2UT8vEhhHT!Uk!YhK$5ry@cj^**Xn5IR2unZn zx>H{VK^1{;z89~|8ww5f^dUN4850q^#JUh?NwP=GE^gN{#~)2r3PWjC>kOh|Ejo3T zKB%gUuu=4pR!&sLls+HsC729xa7YoDQ`D=r3=g_tD$?6)?dGgmMFr{1z7j0f@2`s# z#XS`-|8B}PIjEWNRDVCcuTbp%^&cGTdP7eeu{E~(guS6%UuqpVo7X-Wsxv84(Z_!*WlemFkREP_a=OS8?3;t1mKk-Af#f|s8 z`zqC9i!&#x#*JK->tuy$#vN%(Us@$Lkmvq-bc$&W1f9e0xiz`O*<9ymKM>?F?j_n> zznMH_EwrIOCeOu?>@~Oy^e8&s^4W$$<8Zg{<{TF~IT8qcv`D*IL4iF}#~l z969t$G?Jn!OX~d2np#NvRS-EJwxCVXMxB-6anEdCVKhFO{DF;Bgf@khZ?u-tYvjRp zdHQ}g%Zz}hB#9E~8hOA?Mf@e60{mr?9+8RiH%Et)Bjr8YJi(&@bMtybp*R@ibUKB^sLzB){4!*38h zVt^udn~p}0c}s;!XE?>hLx? zwYo}_0|kw%cB9p6?vEcCVh!Hk+m#-6TCN=FTa3b%@6ey%KF}~+4xPfrp1OOr+eE3E z&$$1^)3*Lu3JrspYF1ZIGRkx=_ksgLmB2ei6|8lz)EiskCnVfCYIQl;5q`+H)TQ)65%;VS^DlxUNgaqt2+0qZ`IaxMwc2L#@Pi68@J7lJ5AB` zOlgmc82KbRl{7IEYzx-ZZA5?3mCFyOivRYQ?!4(F)uOx;U=QBe8|>Phx`*Wb^%EP% zcpjM&9uj91sGaP(pju*I@Lf<|?3O=kyLQTr+1_y8o`vA@l`gNfs3gwn`GUjTBKKZX z=kl(B<&|@N3jW2XlnpmO@aN6vM=`2?c(eET=4rMqv^gpDP0=w!(;N#DIqutE$~P01 z$a{SC^<6`kysi5oJhQk~cs=+?=OSM+?uO{{Eb2NxM}xS6X^tUfC#6Im$}cW$CMVl_ zEA5Y2`LEg4m~@U1NOSh2@~)C4u`kS!ufUpWfb{Ok_l-#|$|A#QB6NN)3cF1-QOfFN zT7v}mzj$2jb$2;^)#igI)h3{`mfLptIOi|%4l>Mj>7dJYEPJbC(+6J2>G(O{yc6s- zVxTWW>E+UmfP|$x+K1ONNcrjNp(IIwL=!;i zs+|6Pz>Oy(efd%MEMjbO?Xlza2o6EX+g~h|lLx7{BoEo{C0BU#d0(lijeX}c{DZ-L zBNt`L7yg(*DN;UsKrS|S4|xfQ>8ftCTWU1U>|OfK<9Fykw)Xwby~H2+mV24p??Q-z zr+l&Qeh9|;osB&(qrl;t`bNJ=ru9keaCz^2M(E=vrpjMC@>!DW8Iu%~Q(gpnrk=WN z^pY)*+f=vISIqjs_sI8@iD9m|1t)nDv2as%xYVt3M^|ODd-ZOl<}FAn)dt4KV^U?g z%|hSU9Icck-SVZ9RDzL!^d$oh|M2$aL5^i)l~%X`*>{`rWBjI1NSb)@3?X~3x7RB? zhD@2d$Ld>UfJ`dz`+5Y}=51p??UT8=uOuz$zmSH_Wp2M>jR)2N6JgExrM*Q$#+beA z1tLxLnbz)(m+e2ulE4F6DC%Q$-Nnf>_X%qSUz>hdy3`OeqbAPhMyd9FC2v8T+*_GU z)@6$Ni@d_79jWHw*$T?-t4@*b7CBD=G1#8C%Jc|b4ITozuaLHU{9ml zb9}d$|6TM(jY{Z@P0quzx0U%1j=*107VXW~U*^43r++q|Bjc+8LuR|s2y?$oDqj(U z9edJP=Z;(@ImeQ{W_>sPicD^&s7_A!_94kZoZ;X`EcTs-+rqmXhe9vnOIOFlw(;?{ zEh~r*>nQUW#=@xbZa|0#RXzBVdl6?gLn`a7k`%QJXFqLxW3~=x@0Q4&k9!@lo`()l zCmyhWGVA0%u9H1|Dl2+Q5%^@TE@#e)L2z2_QgA|9=3Q z01`~+-8LW=qGEK;=q77BRYk<)vmcJsMJ76tz%bQEM8*5?z4<5fL?zp#bSbbGyKMsCY%l z>K{b)r<8>@2q}=^2jaD6Wk}s0`W3Jebs=kFpEfSgeEY9N|DeBr(OZ)m#xYJYsll6wto5iv>nf_ zjfgYpb0zKzmiL7^jIZ0Z$gcCnn&M`(T$TOc_&hVIu$`Nf@#)L0+Pqo~3N?+~=>y-@ z-W1^@vz4O^M%hc#N~#K2a+k8iTftur7ty?OFBu9fyRx_9)bWM4uKaG4l*?9(eomHH zP2483^0eQ;_{%b0lb`YMR&n>`l+n~w(XPwA)?*3^elgT-IehzO>xmXt?KS+d;-@qa z-7*^6#*X;X2K{#w6YoS!%k6nfuH6q}{ytzNrjge-7ojpw=i(V}A>wh(>BFE`jje-H z)eBQH*L1l}Q#c7Hq1%W>n0u#M{-XS#Wuzkovc;ax!NeNZ&~J|LsrnaqwD9L1lYDN% ztuEY?;2SpWtYL#8+J-bRu6w$V9b63bJ@ktppqE3qOo&6b=so!ONu_?%vIKC{wY6(eVwTRYWcw(imYsW% zmbd{gv*efgPA6DhdjMkE0Wmll^Z6-We>&t(@w|=`MkMx7*(E(mH zSdn#Smf-EsDr+d+t+a=0Gb0OgsFj(~s1x;a0f1-?J0Fha;O6f5Utq z#&47FYVB!HcRX&#O_S+fH^11BLcmv0!@pr;VTt@d2T}jKxdC^dmrVd2J3Q(pDAw|8nhx{pvqeIIp zM+oMe>copWIvCE*(d+)-Z7;YlMDIlZ)ZN`({_ZvZ#y@mL9~U@v`?J>sx3e4o$QA+I z@c`o@o(H5A%@VvX0GPXg6>_L2fKym+Yx!A&^ zKx?yLTG7u2{@t!K_#&>L@{%EC7^eR|V*%>|mr*e(kU_LvQ1@R!iZNZl+2*)-0s}?e zNQcN{m>%$gM}dJ;MFXH^`IrT1#B~0j0FDo|MSrnZ#V5sRl$O(p< zMZ%wa1!l!z^h{kC6#y-PKoOKcR4}a3C!3?Q8fXM4>PZ=d3K!k^Z-zx@Bz)9B4detf zxBowD|3*P@F#OQo5D@^5aqIn`^oIfy_%%!`C;=bJyBRW%X7z9N;jbkLfP%*eW>n1w z$QXtI{fOsp>LN@Q1D^y9v_ryS7=12EM6Q7ddSDNG%4E)K%|GFkRhq_vUev)=kEnypk4F4g$@Lu$^pvx#S!;s&27vrFA&Oi+R z=mkoW>;QUZ^AuRTX$}Gx``jD^8`FqB!2aUQb`5t@3i<+X zA7YNaaNLJzAf2aczt5O|pd}E&hA|pp+jzt)Ye!`*e z`;W~>bP4Z!?|xSQvXO0H0{3t4srzc;D{{75PQIM%(3TVscrGF%&8BY4wN~jHc>ZfO ze0^$ZZ&kT!PJ!fYDiw6tPN7O=EWy;JZ{Hja zhgY^7gS0*)Bh;*ldha6Z7wkIwnha=aG{yag65mqzupK>lZcNp7b}-HSDv8T(@d@yI zy01T>Ot85$J5^QE1uu=_-sq^J%mDbA;ZazJj9TgkXPVJuetTPs3e(XmTa+-em$Kil zP5*dX56!fWZ{w}UR_tFAFTxVU^-F%J;rk#lY&wU81<7*mq2_3j6Zb87wxCFPpvwPS zkVqv3Z;S0JW0BIszLJdOYU{6W0*Stm!HWWJY=zzM%&?6#-t}4SwN5oG+&igZPddj! z$}klzpRSmHyyajCM4!`qWWy>StmYYd1Wi)ZAP`eKy(u+*@0rA8*rg?oTGKBMgpbrh z1nfIrWoRO4BS)iy8(k&TT(;M==8NGtxP++tAIU>HSqwrTKtwYp=e}Bu)=$=Zr^n z(}i@slbTxSi#;X!df(Y$K(b|1r`v*k^~PFx6dar*hB|ejr-QJ#w>m?f4z1mUH!Xp1UrS$2p*_iK6Z%IW%BTXlN zu4DaD^0?gk%6@l1J4iU&7=?OcPIZE?mg6~;>`Fpz{}7uDp!^*;5;}9syQ`9RDY{O! zuJOL_Y*lmUw9~E?2ku03EI&WF?~8*I@4jh4LYCIKrTGNuecO}-0<)1+&8mejVmghx zXJbR7CbrrAJ{o>=hfU2l92>NSQH&1m)L;5Gepz&`JQ1ujau@Cus9)-&wIpvT^EEKQ zCDYYd(y9EegQuikCigH}>*b4l*fu2huI{Dfo71A~?LqkC0%7V}I7Rr*C4p1hAmqX-e!Fu;k772Xm8A4#A?M-oP4ECxQj=eBVCxCM(YVPozL@-9Gok& z=Z1Y{HVLK71lNk+={q5Vj(u;#)^DH zR}!f*RS^W7o3uJ93Ad?f!sxT4vNJ{Pm;*jAKi`UsD3$a4KuB_3h?PdUF+`L55^RGl zoaDax_RBE*Iua-sf*9hlA{>>IJVA;dW59qc6^ys|m{2B9zrmbK$W3cicNv0{TWiDS zUGrnN|M&CxaA;T#V)H#m#9?63+nSYT4l{4qwA%UO$e~r6jD(pYX!zA1uuo-oekPLC z>omX*erG+hn?Pz7?o#n&Er-h+{91@}^M?@Kn6~g*CO)yF-y1&Ol3qKz>}Jt_p!A&% z8GsdDURnI~zMp#RT+}%=e9$Q@dvWUw_65TaC74$S=+$pct!IG9SgTB>Z0is5~CBb zWgZgqSMe1G8rd=~`ZBie%LMNKpsARg*{UlO6?sC}Wl}uNs_ck`1oYtdrkC9zC%ya<$rL_iv$xt4K?BVIH$^`_pUX#YX15Y6h!vZ?mYZh z%rL?;>9glegpHoMnMJva=?5(}1*|64O)6x#+tRPYS+p;}K<_CFtg1LSkb*#fZ# zgV*1Qw2TB~(X`!bIg?tmWptwzN>KXAek9A?r*#Ic%GOgU9?C|uCzW!9(S=Y_shBKl)|-NSzSnngs>defU-(69bv_Xa9%FQI zE{_->)4VBiH%OV1d*4ASHTcrak?4xB5CJ%iR74pS;bVP#;qp!I%_l+ium_t_H#JaQ zGCIjaw8bY*T}KT|-K8`or|R$0dS04rBgqnrbPb;-D4QY5lBATn>zEdb4bE4cn(F=mX-HbL&sJJrn?9OkE0h~{+AYyVtgWNm&ze;28tfMIfJcFl z(fOXJiV*UHc)7@2Q@Mz-b{|wjV|yJLRrjE&Ku~_?)Z4$=NfwgF+ZNngM)XUwxhZjv z+_)-#J-`QRukYU1XSI7fzw{^Ox|n}(6(HKbcc7e{r}2Nj?k-F@pZqco*xjYS0ySF6 zx7_u=e13WPhr?%+n)TfB(Cm}uxm0Y?A!dW`9d*97+O_(UPT#x(DwrFEC09E9kv`w( zU&WLwzuBMs`E!pes*gT#V^;evxAeg(}XmqlH3IWxJ!yhW6TGW;p| zLWhx41(`PIxk^!{mj8;?OwOu=nJ#beO%K9uJ~F@NaB{BD7rdG4#JTa%r?)N-8+{aE zlF|9_yN>-yxZaN;|01J&e7t90xql-Yd-8XVq+z+7uAw$O?qdPiC+((H(kV?_ZR}+> zd@s4B3tQgJ!6IxEeEr)eIWIHv@llyvnKE-J2R?1f?N?HK_3M}uB{fs6amET+w_N;` z_jS?-z%Lz{&Ra4&-6|d&-+rcLpk=K`!O@SJ%CvVClbMSAm%Jqfjm&`_EFK2Z9J%Is^$;h5HZ+Lx`dg^SMn#+98xBKsL ze0Ij`*8R4E>m2U;{+g8}5Zcw64k=qQeTsMVUX9iL&97bZZ1*3~_P zx-{lJngxTNRy4<}(pX4zeKN2}eCIj#ZOHRg-S5yR8>M9Y36-vS?UfYWFFs35@#*FctJ#iLX%4OV>eP`_$)m~72Pq$zb>*NME5nSB> zjnY_HSPI~umfGK+)KP<{QG-WMgRk8wK}mp;pAb5ni(BYjAb5)s`1$u1xEDwFq674Q z{pn>f1(O9T5)ink`d<)fY&4~I2TTGGXagT;XNDrkP@0#Z*P-YJaKkJCxRxLwfGj_p z3N;ObCSoWoxS$fiU=NfUaG{6d1ATbVaWuiK5J=GS0f7MGJz)5#V|=K_C3J&@5jH!J zS%45gWe`G5G2EHL;1a-P4=5?%A_64`G6acWC~H!v^#8Vk51HMd6sTh=Xex%4b|W4; zAfN~51Jbjhgut#Q42C+VfimJ?2AYCN0{r#h4$yTSd^SDb1I4|NaS`1J7L(b5%T3_p z?oeKDVHAm>B`z@)QPwhG3V0G)3qL znjniE)V3lGK?hW1BN%}65&{@%QVH6F8K-3dE)3ki2897{3c;CQSBFksP=OUGb|4-K zr$^ywLVsbpqWuG$C>Su11cjmQ=s~40*7-Yw=muI~FAl8DJUfHoq0a9?!NUKASGvhx z$n^qz1;p13%822IHaVIfdTMvAptNv|iWkla-XlkuIYMR8W1uqKpduIpW{~~0tUv8rv`CEa| zgg=^I_!c-JT);)1Q!Yq!azk0C}ZhMaM?K2Li^G3peI*=22KtHse#@c@Creg+zTZ} zmDfRUqV0}4cn@X%k8l57_b`Ac6_mue0r~d~Qu?4J7=nv{gbEslYM}o`4UR(zFb(K+ z0Up&z4RFpvKcN*vo6oo#HQ)$fngE6gg%_eG=YoEUjezlCWC3e~=oO3$ zc#^^}Mn>O4FTkf{FpM8$iu{>3;ASBLG&ecyPh`W&|Ek!nXbjCINuD(*h+_ zux0cuO)GHKWo9F!P~i5t4Kq4=!J`9{cn;`V@w1?ECBj0)%k1S-e?Ywn#s303wSMur&>9Z|t-!~%fn6^6P7 zz|1fW=pX<_heNdC(JlZ65!~bwFmpOv62RW2!(>MQh&lgQx7Z} z(*vBKNen$Ys{K(F0sIapfCGMGu+L~SpeOzxJuaXM43#<#OGL|y0!_w;xdKfRh~f4( zT+^Uf7GU==aT9G!FmBSKKCi*{F-r-(Y%Yw5BHf2+WAy)7KPjoQ!GXL@Je^{Y)0g$yIisSwbWBrc+pbwDO zWWqZ!lLba@G_WH?l|$jA|BQ_Z0~cWgA7BE%_m39#A`GIj9!e7dhhX}mEeJ+*E`ZMi zTsoCx@UMTw`6otQsUH5?PDE-ZlpGfDu42|Au-K1c8X(hUeo6g3lk2!mz* zHt?cuUWFTD<^uGhV)PX{o}kktI&3yIf-5hD4PJzqsEgo<3gm&iVyM9IN`x^2=vf#j zivlx;1jY*JrFVgafoIJimqB5;0Ul<4(4GIFJ~+x%8t(UJY|!t(vFQNU7BI$%%EGHL zoY36CVXvTWD!^4Sz8I|vSH>6xZ9#B3GoW}i{^$dsClnpDLD)%z+SY{AVl+TEpwlj4 z1c=hj^x$Uym)@X%P@oV7aDNN|I@W{HlnHHZ)V47^>YoXf1uh~J2F#3D!iO;pXn8=8 z!GOB-08WnKf&ol_GAt(qzfE;sp|s8{hK>3A|lZ44j)F}M@NJU7=s%1fM;Pi zfe)QPsP6|~LH9t1!v6{Bc))HaXuP#Ya4~eaMS(yg2t$f~=GO8Ie*ItOEvIlY;5_LP zA#gJqPKFFA(^kG^5_032cqR)iIZiFf2ShuypsMij%^vlm@!=dx(!`gK=VB(ll2vnE z%`?b5d=ai^c8Js|N*kUbtcq0O(r=n>I!g2JKk4`0+mZcMcg7t=e=LE;SbR;dr%x}I{YN$PXJ;G=0;Kt*$mH(Wia3<%< z`x#!>t0JyujfI^F#eyVPDtTvKuDf#@8Q*F67hCO7<&Rv44MRO7QD|scZiz^2qmi^~CbqpzmiJ+v zp)POVy{;EKLZf!@q~ughN2ObtHMbm|_Nb)y^BD|rT2Xlu96Jr$=)~SyVKM!_-pYXI zZ{umjD94X~l|m`Cs=j2f!C2UI<%O$6WX;jXbwx%A`Qk?js$9idMo+m$p2Mx_+L^s? zFpPb+M%I))H2?5O%CTMI{adrfxJiLmEX@=5nxpMpLt7=B@4-iob6dg&aoTI;Zc#7q zuInU^lJoy#s#FQRNl&YH%#IXMyf z1+hUE_P~x;gUKZ8(h+&#=Jkh8A!$3i*@@-i<^H=!pNAAWcb$EM-IGj9D;lS?jc4rG zM4T;V24ih?tx`oxV_8LI9{1L!(rNR)9%FbrnLbjqAPJ{TViZDE-re$?9Oj|)4K$41 zY-8Lc9;w#WT!@4@X?`NqxH+@5+1O%g+E{Rstk46$TYHM zRXaAjzZ8;vZ9zGheRb}(%MBmlNlqZ}(bmbv@8CcY`~3Y3i1hpPoH}AV2gPOrqQ@F| zug%U+zH^j~QI!r1z0V76u8SDZS7`PVks*$t_=YUI+W+n&VXle@T%wXSyi>)Ih@0iZ zCY^zDh^T~!Vn~fdX$&NfPD~->7oFHFOA%MYO{-8(>?_(a8o7?bCuA(`7Ldp)O6|pm zS#Og9W}~Pa)(Ra-xH_@yI!P|~M_bK%*ls^g61MtX@|woqY^isA?Verd?Ct*OpWm)( zeszvR7HBmDq{mkI(dYQluN~e{`g)`PIni|kyw+Tc=@@d$YRhQR=jMaH!xJt2V>jBp zy96g@<|S6SQkW*MdD5ySm2&8R)|QKGIf=qG0Py$HsXmY=q$e1Y!-!OWONaLNG6~)M zv^@8gxmaN@D~UreZ$~T%M|;ELisasW5m#C)DKcw=DE&t;n`4g8TgKWaZ88cpDm6IP zF=Ty>ui*@w;h8Wmz3(4WGW zQMV5{B*!~vW=<%z;}7mB1n<;Dgp`i4;PXA=&7M!VxbWxAzCYrtaAVAG?Tuc3I@*FUcU?acX!*+%TamayH31$aQ+<`vS~n>59RZ^)8>|OR~(z z=-VoZf|qi>-=5IlfEG$7yut38QuSkh}E8kAc;yc+`rK!7BSaxH@=U{DgeS_5{2 z0>3^Xs8RZF;LiU7pTC0=0mN_Nz33E;-jaa{`w9yD#CQcJiCzl7O{fv`gYm>UEe_WM9AbbAE; zr(y|$Bw+yjv^*TR(~n?BZGC}%!T=ReV{z2}1iTjWFNiqNYNPeR18xq0uXp^Kh7%ym zAXW^}1Q;#u$JMORTqjyx)O^@YM-^HQhxMzbQv{Th3EbUUlfQ=ty47#7S?4DXy#AH1 zxp$i=FwCLHx3k{gXRmIp$@}}-96J)L_NjTBy}XKCeH4+WkiyaNr7;cXoz0^vf0i{t zPd@78g*@t8_X0|;n64XKHXsT9R1sf=Jn};MR$EPmpO#mIwn;x9``UU{e}<&IVC|vu z`ZLz6PPDCu22yXnY1Oh$xkKgszw|Q-whP4=B;xZ4eLG#Ow0n7q??d3&K;8)rZCzJX zm&=F>B)n`>f0t?G)guZ+PTX{=*q*_H4q=xgLu?BnrS#?kOWd|)x`7pi$cD6GA*8;e zH7Cs*qrDepX?Eku>1^kRO|A(RCapHmy^`7x?XYy%6$Ohf@7+U_U<-9gGR}w%_~(=o z$VdxIG@gmBK#?Urt$eP%f4;>AaqWUYDCg<2;M4Cg`DRKNicSSn&FfNK72d4t(NRW` zcROCj1QFv@xp0f#-(5Kykbe8V>ZMmV z_>FHzTfh9L$!3pRUEdbJ5H#TrnNlgf+ftxcD3xJHZEwNZR5mYM996uVy|jN7@3Im; zbJ#AzYHZPLB1;J0$(fC2ceKEod6>HY-Y?Rkj!5#K)cN;LX74uYT^^x!kmR>Uic%-v z<=?Y=TGd^ZA75siy=vR(GDz+J@31mD{mJO{8Vt2sLbLhcRi^T_vOE z7+dk4lD$ff>Q=m`y_+n3qZb9If2c)`ws-8cBDT4K)ss+GBKGngn0-ZZk%L^uT|3ta zt%ETq?GtjvwiN?Gg?>8MDxS?4r1qGGeP8$zqFuHAXXMs%X(x-XnjUg_sfr^jSG*^> zBW>jKALQELujbO4QmVb%A(7%Q!+UdoZHD7m@{vPH0a=}ZshJ-I@mrD(q9RAcL1ajI zOSi#hA4}_0qOT%F+*|q%F}zZNhcC#_OIt5doQxJHThNayX4#!zCN*wq^FXHWX!Tw_ zt0`%IP-gf7d(EIW>H1U2=Wll`>s|yH4vBDoYWNl}XZi)a3to%ten<%C*lf*~$VLhKNAnz^KOv%=aF zU581;_?tu??6TI!&kabct{%{R8rF4x-Q+sLPD;H~c)5E-^-BOQo_~h*Po(c4ws$Fs z_ql9KAU&c-DTf~K?8?H&LUj#Bt8>Jnqlo5kZTd@z4|MzZUzr;|>`WNe4u>fZ1VpUd zez`#qK`Ir>5hkd*@CN4hiTLXI1X~lcmFe;sCBt*?7u8L9MiCL<4;>)bNYfe|$4gd4`IN3$Km?t7r|A(x143FfC+I}Z?GO=yjw#|uc z+Z|gITNB$hC(guH$F?SuoXq^6_q^A6&X?+SRqv{<5BuuczkRQDFUnSb5sZPni-7=` z_{V`FgAw95rZ=R&`j2|j0(lYmmoGiA|6Bk0{AbihkW{Y_3N5y(9=6M5YfhutgTe&LQxqmJss`hq4?|kR@I{nmN-%-JUKM7g{cjTKg%ymn4=H>yZ8h`(vW%gxoGpjq0mm z8FowKV#0iZZsii+5A*XeDSH-E!<%@OKL=+6Fjq-)D1#{6^!hyXxpTL00tpbko2-sm z{dlxi&@+@-ke3OuD)nk~4y?(I^LFYr!W2)NE%_}KDv?P>z0_T;T_;LIRUH8OOSU%3 z;1@F{3_L`;el_n5w=7~mI@e{p-d%!><^3>XEmj-9zIx^H*Wgk>%#?G=h>kLi-P zoXl=Mdeu<48r2?RK&hp7rE);bL2SoP+#kXEoo7{aar!IXji=Cf^p0~#ev4EEs9G+e z`>9=q;Vb0C2oz9_I~#-k+im2TEX~Om2QAMuPKR_($(_`8ya2{ztbV^&MilJ2K=9oD zA&k@;JnYQc5F27*f*spJ~wXpHt}nDFHSPF<_UJ`Oh!VDi^M26h)6ez_3qICC>=UTnN^j&a` zB)w!=R$eaEUDtPo0)s?^+aeMu1AVm(^Gmv~zGj6bXzTx~-sw2bAe$|K;0xQ1Ge$FQ z(27>4>sP^`rF!}%xa_*Z1J!Ak5p_Ui#x+G>C99R2Zw=tu!3bJpt0N!u=ck%-4~~j2 zh)FoP*dFws1B=lFX#2}IMcG3^PvFt5u@D=yN5OKzxc9n?waryF-jxjps;QNijnHuP zaPXbu=BO8%+YpmisMq7ztg!gorPpzk(=mq>^`MDVtJV|XLd)W0Wu85Cba?Byx4Jej zbb9kq$SX@{NR|e^* zwaun}wTqQ#n;F%nBF$v1YJEbD8pj0=$A4LXfxV!4+|dw8mArI=gU2q76$w#5*ISWQ zLh_PV0Gdw$=;zaM8tagLqu-Zt1q6pATAq%W`FtD9KSZcQ6aF*Jv%FRmml)YA#2lLI+dJYNAALMW7HWSU=ug5{ncTv62fkRnQ}|T+2WeH$fshDhV%&gJ;A`#K@9|oInW(W z=BbGb-n;7@dxg*36s~+|}b2OKFWzz^i*eXv7I9{IA z0yW=rxbc8}*B=(#DGk9bxj#t@U>^|Hdn4#il5lcm4t{F!9q=b-`h;;3$VL$ z2uW#7OxVS4{Eij=Av!!WY-x-MK<8y?D028<-WS{*_)xnsC`>hfU9oBaD;7so1z3;% zeirHvr|~Bz+B>y6vi!Nwo^{kY*iWSC*w2HaXG=wrqC%A-ohc#vY3N@#fSEFSW@@** zN*z0guA(;n74OzUC<4@s4FUI3SX!UhXJPSs;>FzwSZ1vNSD&i8Aq^J`Knpy1I9{jt z-SH>g#r(@CU)5RQ+?q-cL~>1wDn%qO{J}KJ(I$5COnnv;zl2)scX+J8(=QW7-jet5 zG(>7s=^C|xMj5{?Jg9~=GlR(P5M(j%9d&d%Ix=~@v(9ik)_6V3&@thSC~fx8?$kI1 zarVzs&Tb*^rEXoVoKxM})ZtqX&z6GpZ|v>XCWV#JIT+i5oCPKe9nV`5(s!!NQG9Os zS(Uqf?UqGwk{2|%dH1i5xK12>X)<>Q$y`0bhqg55`gtEu*4;$0d;I~5jwI}MCS7I7uQ_!DmdT8Dq^pS6WQA^)QC5430?`!C+Sa^r~={s2-ja!F_e%H3f zB#aO#Xjog*7TF#soqF-l1!kN`RX;atziAKV-dMd0#A|S@xAr#3Z(vW9W_gdOjbu)5 zWF|dIFz-#}`xz3X7?@JIl5oIrFVWU3ft-vFTx;vhOk|mJSP-_B2|3Q{C?aPc!$e;B;zDC zng(D@GW_=Vs{Qjtrou|Q1?z0$PSEYIQ*=jMg-bizilmM8CY&}vx-D3^aM{{5-cZKVjNvK^p;qy~2 zU@X5kdzBfuKSPMY67`Oi^^Ulx6yIQ2ixPal;JtbMCWY*AzK6Y18a}QY#*9W#ll9Hq zLKLlWbpVl+t~OSO`L0R$?uDnjBxXDH%d*akx_k_s)zY%a=;T-+r$viPs6OQe7b75; z>Rw_1v(Pj@+YZ^VYKONSOl;WqMvtzi=uWLy%QqiGQ9GpDS7YD|jg3_oBD>2yVrKnz z)s(*zOMx%VkXlf-&xDWOe3Ja_(W!`;BjHS!1%~{VHSl~HLRp)J(RI%g+qo{g=1AQM zJUjK5v)9s+KDZxq4bZ*+_liD~o+{G|IZ! z2ASqGd0O4v*w>W3=0lRDI1?amS!YOA&Z253Z(%3GG>Q&!CS|?sWmAmF6S*sNyK3=< zLMq@B4P!aQHP_V#urr=Z#`Qbware)Y%!~i z6hgFSh*mV*&>t(DHrxoJ?rgMPtmWpUzBFGqs>@(7FYl$BMi=wxzI~Upv82x` z&y5WCCs%Km1%ucNat6b^PJ<*gk#VyHh zdl_R~OPwX@!Z5=4cmYhGi&;tu)`W1soq=vd0r6a|SdLd@m!>JU%2Qr)9s{3gkC-8_ zf1_tl_k2g`N*mEFep2b`nl{!kSLe~k8Kv#4tR*?G%I!;I1hQwCr`@RE_zrquqb^C1 zeULbfacB&yu6W83>G#Cc>Nsvkko4q4V7bNNxJ_#n1M$rnr~vxntfOuFA6cKa5#nQS zEgL(-oJWPD${wsfz9u+~I71@eGF$&Zm|~Wq)5^vRJkp&HkB>~={iIgV;nALSyY%2N z=ZR*ey!J_Y4wR~jh`u`b0s*=DO`l`#YZTW?ZFt^1Mc*ZBU21TB++aPj5n>3k`?HZk zG$~demFN}(sw7}IPtp^7h;UcA zD}3}?mQOfjo<;Z47_;^ud6n)IUUj;Z{?jWvOVQ2w!9}62+Le_hl=ese5G`%GXLGD5 z6$I?6CGW+KAx~hE+6*nOi=HAcHfOAtrZQM9+M#XyY&1Z<8Tvz>`8~_{?T2tH{0U*c za)AV5$47t3)350>q`CofSpcCst_uJivntACfd(gOZ98i zO7JV=*;YUe@vQjU6xq8|iO>}}v}+)QcdVlRQBpMB5bivco%M7`&MUTsfR#QIokLw>gTXM8UlCDS{q_9%iEK& z9HO?IOrad?O?03Q^D9NA7kiwtbc}N3a2e6aPX@p{nGJJCO1-$UP6Jn-LY}CAAVYR= z4q>k+LDU7GZMmu*iC$0-?P?h^+Zz2LwpFuh5k~Q4eiyuTDL=*wg*oNWrx~p*rH~18 zIcd=?kWAxPL)JKyr%I(#sq|-D7aB8(4q28_5)N-0+}j)tsV*g#M5(GEHYXgn@uOoM ze+NL=%bhtyhYi;Z1Op6XesZ5BS@#arDf38%1$oMgXJU((>T#%O!&rF|6%FoYdrSJQ zHdkx}=tOpR96&U-MxYzeB6&Fb*b-lHvD@Bs@H<}I=?+bNfNRxU*_|xVm~oRhWf3Fa z))3L`w?IY1dwa6mXwinDvRbJwuc&|l9ycI`Z?4+i3D9hbS7%9Qg45}uAV?m0G3|Hz zZC|%wG8c3_GylA`6!HKsgQT*3x_Vcll_Bnx1t(uvR;wjfigbPq8t!z(F#{Y>i zpSe;0qeDpj`b_nEdWE9;PXzh@2oy-oHqg2M2`vBTCjayf6u{y)FI}`{{13$CJ{GFN z9ecSL9OG1oMxuyO8f9fLNHXN1A6A)09s%FYpe!tu=ScYzIm)H8TBO&DB)wPGTdZ|s z*4EhUk~rk&fA?Jdwx4g3zdN~lGS^Bq>zf*RSAO@ri`#zr^JnX-yOr;8GQ;Id=CvHm zZ35#DAz|VuGB!YH?5?4&WtE^c9z3EY^OPDrJxYvaDn?6C2}Wy>(cr>ox`kf!H$Bo+ z`=LFQLquz9G1g90Qqm^FTe(qxH#GzbI)0pUHA#`GQY~Q^+V6I!Tr(*&N=g()aZXGa z4vkgFIt}1fdEu!?G*qK}Fydzq>GsW1Tt`Ub zYwc~O%TNH|P75iwzs|?eWPVKq_!NfhJoY$aAhBtHPLA*<5?<~{J~@P3fd~g zdZrC=mhRR=%A6CsyiB{&cXlVIzfq%;YHqJOm}&&LJynP0xUIlrhlIRe`66kt&T78b|J?^0fJ0F!% z#s{Bm_5l8Ia=oZ9W=%>R&BV&Z0wS4Z0u6R9$dq;C*%#rR+A*fQ=5w{#Sc0r33leR0 zRVh_KfX{67Cd(t$O0*y9Dg%dx&*U5=TT&OE`VW}u$~?0sUXeL!sgVcIo)}!Tt}mP_ z-GF#2O^}XmP|Al*NNP{I-&kxB`}u>jrxz1wkDGw znXL6s!SLf4VWuYB*_$pRhB^{g7-BKc3DX9Oa^ zUXJji4V{p=LfV8kIR>3dx0=VD8p-f}$Qf<&q$E}hW?h?OKhdHFORXB%;_VXyK|KSAV~t_`Oh8!_^vz+ZA91^;Aa9xr2UY2%8e=IgDldQ{K)%@E;s zbu)W?N>rC=E;KHdE2!9qq3;jdgwzM)z?*H&07HK-ky`m%o6?x_yzKXq!X!~cD)C0d z;{{v=syhkMl-bEPuzXT&~lBz~vRp}C&j(m_?7p2)#|v0tk_ zLJ0%3Uc1k3W?u&7cGUx|qyAhItOiybjxYX(0GO&mv)pA?8>ii*fSsNqC(7gg$6Yix z=MnBu>I|>ij64`8ZM)TeNo1D#2AfM`W)}NKRWb0ll4!SOq=kG<#mV~!Aija?;p{AL z@XUR?C_jbn_*54{zETv`826j4mm2?GxZ()%Xu6Ii2r*6$B4xhn?esc zPl&5io;u>UH9NA&x)ym%s28-}8dC)pK%8V>dM`*>;tVDGInN? znr0&wyYOc50c$}vgQ^)&z`5wB*a(=4$VW#)d6IAWe0tV^W9GiZW9A{R!qJ_>Xo5j) zB5!!xf@9_;@y`?Eg`?LP(F9;RB;N4llJ{7XD%t1)XxxB~xYAEwVpn!mA_`N!ghVG6 za#CrQ^8nu%y2oAMLL8hJ*{(1#NY5;VVO!MDKF4m0F)Ek+{5t&6xz?V(%JiuXcMx8^ z>dJz&LHQ-Tumrs3QNbf}^5S9~5C?gfM?;xNO$|n@CF$9w4x0D)VI>qtmr{+Pez+u| zW|;E&YdJt8;xq~Lq%qFu5gvHMG=(PWjl<3|wOZpFMHTei1hh#v$7&sJjxS7~)OAWe z?}+0?GG6A&efsJ>T0kIwFo|b0%+S!9mc2zvSJ^;bM5lAE^;ox)C{v~rJ;<=LWE$kt zP1}~&Pl|Z=rzp*>nQLhY4`_~ugUcUByuPMmWeSKP)prIp0k*BacWu0H@Widh6?efz z=(c??s@RuLXJHY^QX!rEO^pggH33QO;X0n_m|03st*BGtvnECId2nPKoHx=`%=!f^ zQs!|{rI3TtO}ERGw6f2sOkmFtL1~0t-Ju~%rZ%;eAkHgppFuX{z{n&u#fG`r2oD0f z12!(PM)gW>Bw!w|>49y42ENs-T@D)PR#gQ@{Qg(W$R*O;9%;d+&zN|ptkYJz2n$Qq*XU{(8W`&1 zJ;nx+GeBDYQ0`IIDk@Zs4dc6_#PMiKKsL(hFlNr@A?R|Ypq30;EJ$G`FJ_~dc)s~GJKq%;Fl*;PlVewu-+n9{d7|v*c z=n}8$eF9w!cISs;H-(ft^2_%;7krC!=R99;D??91omLDY^!N|BAUY1sHS1gU2UwH= z^rgX`X56FTuZ`Lpoi~t=uhLop)++#v#n{qgGH#K3MdbaDq23$9=XbcjDxdT$5((X> zK&*=YzgDdOB)xz6vm5ZxhyOR-=KtjPz@+iBf0hzqAwm;?0W1YKqa7P|dD@jayFXyX z_RS>0>-tVOT&F6%GZ;O@G#xAtKs3R`1$Y?eZS!$CO;W4j^X9}pAlEod^XkY0M&;*; zahsF(6t*VUguA*yYb}10bws~7;;0|fZlQO zCEk_AHrTZZ1L(QYPNj3g=}LEq6Iq^SXFAD6!!D@W`u?tD_FnusVXDpEz|$I@Sn`c3 z&6u{iY4Li)IP#-clyU#G<@?fnTg4e`CaDw+C47gblU}o(z3g+G(UV^>^+rVk{ZQH`loib{=0ix{eEq zqT^%vdxJtbaxLUsLKx zHxx>sWvz)N(o!Ad2&sq0Q;v)Uc)Ph_k6=1&csoQzFMWzB1vI@^_do#Ns- z{c}4%V|aiugxNQuf~nY}4(|~DNyvaBTj!(%I2e4xm7@)p+&iDGJipZ5kE?h9=xoq- z$`9yaNEx|gV?eNw!FX0f&{+Gg7*3N|Y0X!6s(B6VFcx&}9{Bsgi5F^YE#YI{OD(2N z+hzzCd+WYj>=^g3EMAs4*TGDF(0VIgRn|;6mmajTv)sB;J6cR0Y}$kN^6aamsnhF{ z25js#Qfx0J7m5^ZGm3F!)RnJsyuwqYYBj%et z1$}m99Ce#Ri05c!G(%zq-w*jHrxO*vKaR2ZisT=+v&v+JL_%FtgUrJ~x=`cb#~iX~ zucAU)g99FGFKUyIWGm^<#2C26+%Qt8CFu!Rlq?Df5J2hAhN5(rO)MJckiai_`Bs*F z8cM5sdtHR`r6nB~5JgUA6wIn%c-gT%Yf@UUeMjYM+j7`usb+gxHXIoyJO!z9*yJ50 zjz|>g*O)i(1_$fl`HYQ`G9lczLlHp_dYa}3-2oJ%&jK2)JOmT&JS^^C$g{7K|ws$aC*Lu7d|k% z?f?>;HPeJVHhH3YzKq!Uy?UW;9v8S^{8`}6N?e`2(dAA0HQYIAB?|1}{Lz)AhQ3HS z+hOm4=XRmXb@?)Fm9dmLJR2L(~aJ))-hSAY!pgQX3k`2)hBOta{8& zl9pY2V&h2N{pM`BiNdPDl?yGxI|%`kk_|J=Y)lf$=2Kjuk``UUo@_u&T23T^4&He_ z-BH8K%0oe+*2w_ZeasYw`m^jU+gJoGVZFHrmU9P24MVC0OE;TkH~5dsj~oT0!v?^& z4z`4o^-{`T&Y-1QccARuEZH}2V<9!6A=xR^ErK3& zPL`Hsc|0c?COfhdTSNGCyU3}5eJ6m2rr6F5^d;W51*FDs_hW*N_H`#S2YYL=SJ5a@ zqOFVK^T|5-(c7m1^GF;A@VE_~P@Bi=V&z|?t3h*rS{xLSCA#A$pmLa(!$XaQ31^Qi_^z9W*d<((w>X9Kr=>s?QZ>*ta+R?pPGtq_|t1T zq*^~c(T7&@rwfDQWO{R2rSk#di*^)FrIqI3xnk|6JDQ;UPi*S)x&sc!H}~{l8%!3> zHiXS_n6IJ*^-6^BoRrIfRd+VK5(a2}!>!|M)d5zs2Po?Cp)5i{+iVoz`eMrBp|2aD zQZJE%jP=Iv>oI9ky_4$UuT-kM2(ee9Z0G)j5`*d+9vM2~o*6R;As_$)d4pXS+NXts z+C6lkTC}3RO5L=(W8KiyyUZTl{@~>s39`~>Q264|Yuuxo`mK^);w85D-;9N9?>9>* zmwvbS3!J)vZDD$&fOx1%*}cxAU-y{j_FYkuM>i)XUB=hr?-Qo)=j8P7I^Ws%=;!o` z9Fp9>zlSeG_wiu#@vsB5DEkFC;|FC8ku|SqYTiM0B{iH7YIX{ltBV)O0ey}(R<6LI z8ynBpXLUYQL2e`+Y5^qfc&FwH2J*gr*nlMz2HM425;+KUJ)U@5x3N4Q(l#a}PI<1| zsl=}}Cp5XLLYVdJGuVQyZ9W;>33f64f-fR|NiVg>=)U<@)Q^Bjd^`}(8tNJLgZ7eT zab4w`08gcb8%{@|rfYrNt=W6|uF?~9-?9_8dOhWO(Wc|=s1NMy#kVLLe{uBQ!l*p8 zyUOiho`bCe3nItFHU4OtmA4>#VKB-vj5$B9crYyT!eA#kV@T{vxw)RZNp>?~3`|E@ zOld}^D}M0g)Iop&b1WdizpopKIr_{qmw+o4unYe#KlX7DP#2jw#EoP-%B}5}h>?xy zb5qDQ$@#%NS9;CT>?@sJ)T&TVq$UlY53fFuzfoHdBIR>~u~l+dJTS0)gMfxwfU#{_ zgK?*yUFmR^{eT%AQTb_^T=BEb8*1C+z&CGQwX7o$77Vby2LHALnfWYchp@2i9!$^^ zr~!5;@0^N7#d0kQ=Hwh)(Z>1hckzTrdnwYmy~GDZqhsM?7#^4f@VOqe5XIsKwT1)3 z>E%=D8@RK0=60y?cS>$4_g8LDwv2rd(>cdx-lWw35whHzgz_uJce_lNEra$Tp-@C6 z`UVc+nSsuvJoz`df9$rkW5Mpr(Z}Bfb^i>-_{XPRvM$R1UUmE{X8X62;92}kkM|*k zE{6utf-ft4v?f;Z@GSaW;IS-L4^8vmi2i9CxEFMz37uB(f#LYAPOFi)C8t;5`ZeWD zv;bOj49lvSF>3J6^f#NupL@6;m+ddkNj#{&QfYQ`%!=*`Mmhb24LDKFifPqz{hWD8 zyxzSOU>)#L26di6V}u*1I4u11Exk?i$DCb&?+L?(lLQKWKIG~iLDZKTKalSsCLO=Y zQn8`oXK?Q)VO_`E*6vv63xwko7G^Thf5rrxM z6?wsrY}?L7LA@?a(Y>+>(JW|&JZ%>diw+ z&uS`$0%HNEXu{em2^13tus8?x<(gE1>6n=5zpb375045fEDDC11j7=8pM~IMb<;+b z+Rav@9qFU{8{fXxK<18i;PD09RG6#)?&0mZBC6Tje>3+|IKX#z*Wh1vfj!UeGH-17 zeDRwwxgKHK!ErtsVX7)poxTi?7;&sTYt?HVz3!}uUysMStQw21{7{n@U{6iBZDihf zB7#NrMOxd|biA+o)4h>{IjE@@AGiB!>v{B#V+^(>9Rfz*_knq-S<6lrrPA$N@OLgrH(VD4q#;JpZor@{qll& zlJ{}Pgi!Pv6#QI^bA;u;$Qzafh&ij(`@kHeUQbAul5@T&$Z{w6dclNW)D36r^CVj8 zgXkeF=h_N%j4i>SCN7dX94?NCR@8~o?%gRs4chIAu?V^efSsWq$9gs3 zVC829!h)t`?6RXPeWp@;wPhcoE)*k&Q3yMG)R_|;juWoMl^82QAHp+@_6@ylzpCXR zvFjdr6A;~X7puc5d+80HbIgT{I4yrtcu8ja>Gm^C-V}fbwD5JJQS^AVH91f2&hSnkrSAGC-*Pz~N5A#Kc@q5>^1ha?lWF$9&tVJK3PRjskP|uBf!?ld2_|TUx@paHF)9je!8ole zX$nBx>L-zN?59u?#b14XSOj#%qudIFk!%E__~OCcz*x6uxjkS{Z^`>TsQ@it0-nCk z3WOtWgl9Pl`abiyqwYNJ!L_9jx$qJU>3K#t7z~hlVkzzcCOmNr`muV#(qMvW_s$lc zuoMghw}vAFzjDU?M2VZYA%g>2iEOckbXmZ7%^=?*e!WF>7VedgM?${s z5l#0FOz=ogc*5%D6^VFdAinYeFT0{7cF;q)<)9$Gl7Axu@uIx3#@Wv?Kq$F2Iq(NuE z@k8+Mi$u$&5~=aCuVWkS|9+8t@}~oUZ)M*-(9*^l{GEd0{AA7BEKHa9QfaUWw5 zy)GQ>(mx?Yps*f!pR%vsdY)RhZ-F0vXX~G`--9z+!HQ61qzWDCv9uRZgNXyco_#}6 zjeH`rjcB$eGoe%>GLaVO@5wDl4n_;@H;NBKfm5AoI4=LNn)K(_w4sU4$aj0KO{%Y1 zb*zhn?Mz3qfos#jk0EvkB9tb@e4HtFehuI3wmdmVMSZA9JuIh-R4OOMxQ#(429znw zdV^2SIovK*s)`oDZ zK9Q3HCv26sTHt?>Q&itu#!$~r@8}@B`V%?b%Gm0*h9GUxwDck(MM$T-6tcN8+X0IC3_e?ye4}(8Q>b9Al;gH` z%nH;-bt}WP)F#o`?_l7~O7SOhoUeJ$y#&*v@9w_v14ZBo8g&0E^KtDt!ed!F0y@(? z#}Rzhb^_6w1jzx{q_1Pom15TQyC|syX8Kxfzx*37B(6yterh1ETo=mZPx(bx*1$Z87i(!HIpgO5Ie12w2uUKn!s_m7c`Hk)X7;%Fyz$gK~?nnjKU)+uU z)`HppFLUzFSb_cM;Vl2hoTRf|rXJ@`pUipsGL8I?Ib(AmUsKgmS&8ufGUtOVK;)H` zsS|yYAaLX_b2?&bcK=`I>|P$ity44<{~zX5RsDyYfIuGuvHzHp6L!P5y=v(nb9xY_ zrtQk_&vuYgk|L|9hx4~!`a!qWJ9-hgYvTQhx} z&Q-SN_U%|aocUZ*;^2r2wJ=~Ku2{VdMA1+^&@{S#m>5-HMKEps#1+7hRV)jZ(c=v8 zMxm#4e0m5YCro0IgC%ocQIIG>El87^5PFTvF?ywV!_LV%c?FTn;40ie#{F)D+1wym z<`}_A8_q|i1b86Gz${bupQr-En>jtsD4iSxUEE~JzJII#3!Qv)sXE+n!|up+tpQOwus~8-E8JyPS^%A!V>zxVlHEMNt63><{Bq+t;T{StT&Qbab~Qsd zEAHSbV+w_R3;MjL9#)g{_7ghEKcTa`#UUQ`FLeISLH-XqbF%a*ta*<*>kUWdKml82 zbAqg;Lzt4;LHoKEk&Fz`i1hD4FAe7o5%*Xg3Kkf#w15bPKN|T*dcNMq-MYDZ9 zwLkY}@}gHNc=!QBJXC|k+wL2E4M&L8_KfG#Ra3uOg}N-)W`Q-hnH3ZYdzC!R7>JI+*^ARXD?GU;NTDMleoQOr zx}XiywHdhl%3mzDX_oCFxgBo|UAVKf5Y*QMH4|R< zN}tfF@7Ep#bv0NorEuefB?GtXkUJvVftxE{WrV|-CuH?jJVn0Y^MYDdDTv^Nq5iuk zP={7_FRSF&wVv&oFQkV8P~FFCcqhfK^ygbll6%5G=v*`JTVvPa z?bqjw1?ahaLgy1n%@(L`C#KT_<0o`Z6{nDI4;i{xxte_RG`2ZxV{Z@&G9i3ICjxh@ za&rY8dEW|Xz#$5QX88e3I&4LQE6(b8;+3nUqY;69kmEkDoJd<3tEUi1PTv}z#aqGZ zrs`Xmtr5Kc1m@|FNr1Q_kXv51Ufp&Fy3Yk5@Aa2E`5E`3qI8C;3sZXoFA5`{v>oN< zC2x{TN}Uwu?~J<(je{-cdeJ}ra8?@~x_Aibk`*PywhfE$Z?(3xm1hKL8xKn+1rIED!N=jfHt-l*=Pr#-@j zTZg?b?+l2$c^zc0N@0ti^!fB7L`vrxi=gx`eL`Ief6^x;q49t88GoGpVDU+x@p~qJ z=@XRD;=ng(9jN68Kt_jLYQ}or7iYVU%(O1+t%l_HMV^A3l-;LeRx;gDh1}bRRCi*m zf0RACa#kcv){ABi(p>&fhP$XNVZqp!Nf}IFOpE5AC!}`A21nP@ z^Zn)Ds-a%+tN{MAamD`+KmYmM{i9FrrB4SK9$sk3|FV$&B^w2>K!0|47J#M)aLQ+< z&jq1^mctB{*eCUjKZ1aMb0)(MyZR%1At!47Q?4|R^^bhcrSw3X76)v4PmIOB&#IsM zQ+s!JCnw! zTTCP<(?Z6cx@_YO&Fzg9*z2FQoy+azD_vx1ZSoZjWAsNRYEz$Xa}yluep72QR%CDY=xrUZ=~Rk$zimt!4lM})w6 z<`u}6t2N<=$=-NBELP~FZH&3-2a|M$Oc?2YcSQdI5A2siUVr3Sw$R0m-=miYe>AA` zm9OKQzJ5i6LCCbrm7w1Y0@Q*HMnId3h=3*~vmBNe$+h59&+m44i?-3U20tC@=LlTo zkff6dzye!B;+?{cX!55rqE0U#yw+<>+trCDk`D`llndbrH@3yy%(5%?DB&9=f$O~J zmy*#oqUC)VjE9*ljG7olVK-nrW zv!ri26R>Uq?-Ae5jcxL=EwjnNqnI5s6>ZLoa(cyabZuGz(&rR?CE=zt zI8t+}LHwN)!zmW`%fxYs$yUa?xZ&r8+YeLm8}`i(U~DT~9-JhAGgtC>_%1dCuR+<= zYR8B9Iyj_MK@qt-=+o6!qFxG27rsj7Cs+3aw3=;5J+-hXAY=D55Jr8Qg`+*&sgP_t zS-sd2mtxazI{C~8u+Vu*-Ci(B>n#mj(i&mns7z7INtYF`$k>Ce2XsjKVVCHgVFs=yo~bBi^?`b<3pzo)nO?!2J9$O?;mFFn#9wd(LH+ z>r4n*ET?vnt=cpWtzrm_REZpf~?y??Zf;P zvC^}3OWu8OCVjrQbk%kie^FzIlxqk>^yi@ORocL>g5mx3=?(L!&Yz*~-SUUPP1Bx~ zpENEw?~o_74cjAn?ygSlgI@ImX_S7Y82#qDF{FOqz_r0&FlvU9ey{#4N-g@|t`~pp zLT&#l)vY_C&=>zwCR=C4q1FFOp8RyWQc44?Az-InZhTr_q)9^m{4d+`&$s`+z-gV7 zhaUcK@aJX!2IHi?D?*?DQ@`IKVfa(m5$Mx&Ha`6+O_iYw{+VF3LTf?a{`Xs-H^TeR zIpXiwv_327{~4U53*GkL;LnF(`OiD!^D?D0CNXH7)(b1>|Ex&UK6`R~wsR4HW=!i^ z`1G2{6@Z3HtG0ng1c3HKldMs7g6PIznuExLN-+@=NA^e1E4WjRB}`rN@Zv)ApBw4; ztgbH+(9obWiY**OsMjxP*fcNYKK5LxuCFcqxDsq!wQb0%6RQ%+wQx6ozk1)g`rQlg zd^-R``og6;=|PO7ind=#B~&1^YHlZV7uw_)U)yfeNKgk33rNE@8q_9c8U|iaNgzj| zx2YuypX9wej0+T@N2H` zcg$B`pF8Y2DXT%k_D=7R0eh5pSzsaAP48Qc4cGV@k={`&kTY{tn4+pKCz=t!TZSuK zgS{CX*AZtO2q0EO3~Kylf0{Phj&WCwN7}sj?YQjm$l5v4WX0U!2mWiDSx6fJ;*fmO zt>44uMjDn_8^&b2Z!*nLv zoE8fF3*fcQ9j%J&}jHYVUIV2!>|UN$7Jo8yMU%t7}aUEB3G~Xw%27#BFlLQO!k!2;aEc)Y6QRV58P5EySh=Ej>E6N+Muu zdh9Pt)|G(5#XYrI$33og{bndZ6HP7Ry%5C#aY4f%0woT%CqmN`} z1kgbzBGH#MGE!xbZHtsa+%Tm#(TTx2V2*17Q?*9ZKT<^7CbqMIr&kk;qmU$9kGZR& zacMmTebWD;Vd^i(i9l~^JAXv^yA3YKGil?M14hk^dbo*`xyPNv7L>N z6F*I2W22R#+4u^JQ29pLHwMr4_k~0+L8MN@dQs_sbUek)GmNiFKRb;;sG>{hPqKn1 ziKhoG*NOs0mhZkU~c1GXO^HjHC<$b>&V`jQ-k+%cMV0`k~XJa*J$ojof?h-qh6Ny~UX^GOoZd4QivHzYlA zpO_n`-o}y`ulu|mS*Qpwh8(E7h*PgCC_bA;)I0f+OEc7V#tAnvq|@` zdynKThKJIiL3P2{s+#u&0u!`{CX(XRzNtVfb@|q2nUDCCtaf^ zNJX@4VlKxFv;9vzUZyG+6%@#^wm8|{6fWm)m67M$&y2DjPt)J8wmn~JT-j;TGuyTg zTq{6kIsyKa()#jtoIOviUO1>GjxOYw_QFr6@9)_JF(T}m6Ho5RBaX0vTKBf zXO&zC7$${NvP_?`q<3D}xG9SNL1 z=slXat!S+q4L0pa-^^*9@BU`k{+b#q^DwP>8_xa!r~Y`%ZBNX^)|VN-u!%KC&k_DO zLItrO_j{hJNJo7lCgbVm10R)Txy$Sd=N2JTc*W3*2!>5)+4#hkt=O4@>)=-)l2XzY z^vDr8TGZEtJcYZ#V(qWAnA-7s1XihHHiPvaRr)w$X*EN;c5s#s=6C2cP6*Vr& z4R_SO%E{w6NQ^1>%d^RC{Y0at5JWwk^^a+styeok|z0#z;ahMrKpodE`Oa;&Uo|iId)-YiH@IYk&K!RMtYj zXrSRsR*Jm=yXPRhw;kTD*pF$5LrOx7*&9W2S+e$RAnp>Qt0PI3uhSGC7%;*`H>)Hp zQ=ra-2}nLu1Ta$KRZ}X&C!*(Xf%}$=Kohm!GuYa{;KuYsgQFhaT1tJtQL+jJEBHPvU@NNR)Zg)-aq}v+-L%RVM=dAZB{Y8)UN1-uXR@PYz7PRl> z0BpFE&c2}=lOk!nXk1$rkX$4%fG*30c{AJ#!qKC1{PhlM<1irZHK|L33p(}*We!ty z*IqS%H!#j9YKC&N;qIBL{ki@1Z7wnh%E9RzwEL(oVr35wR6|A!c^+02_Ajffaf=1C!2TAe?_q&AyIzbG z8bsLNiLEX?>8_6kWf=$QIkzCn2l4HH8oaYZ>knNDk{q$=!O{*dn~JuZ3L=<_G_dY< zsNa3ZJYd!gr<9AKlyt45AKAHME8x67_NZ$4p!LATq&so)8>Z7DC@ou^Jx7jOZQ~WW z(+Yod_!;&k!4IjK2{`Nv&G-TUQlD!a^cod^i%+M&;Cab%@`_zU*O|!JfBZ$_$AJUQ z(o>de`y&X6B~SgsvD|@jwL$l*T;kRvO-puPXKmhPM2&U3r9Njz{KwtSPk~BA=rNnP z!2^!O*VcXmA9kBi0tb%23>-%c5a14-itoncugGw2$a0=hz5;0E;5X1DN`SRZnU9-@gfoaw4O}prFUVMtlj6NZCh0h+!dA z;e6X?oqE`02dx<;y?QXYk5uZaH^l2aOoSyk9M_V0VNh+_`*Lr7t2+(xzh^hB`9Zt0 zhxOCB4V!P&K+&Lu!6ga&CGGMvf{uKX4v8)196p3xe^?;Jb5Fm_GP;yiY0Ofcx!2EBxO~o-`2780l~RUBV7lb^p6p0C1Ugj?2;01d_owm>*j7>M5)l;lj2Y^J)7Zexcta{5?pz)szPjpsC z!W36zeH?)7$IqB`tv|lX>xSKF>z*wpI$P+6M#zdoafc)+D*t9xIBA3A9-v^YneL*- z$WWnDE?|;hJqzLD<(AOLuU>S{x^NDh87Q2F%PZzqHZw(NR9(x+M(iDT~)R-Zi^sl*2*nRLrnp~d^>N(SOfEN3V`t#t*s;osv<+> zg+BSUI3+-uV*C)b_pPyD#=-zGmoiJW=cg(vAtT)^JevJPNKUKiG+EBA50Ej`=~IkT z9g5|d$4{s7l23tM2Cx{xkb}9t9-f&0328FX9CC0Iqf zFuFjf)`bOv>@n6OCF=>*G@Ns`73^*?Fe_(oin9Xcu@Qy@k3t4OB0wpA@HQP3w_ip#r+Y-{O0HG@ksgzJ*0m*j@x9pHQTUac9@r zEsPS0PP;$UI&bdUJj2vtbL;iRkx3jK9*5Fh1~ zreK^q7V%Hpp?h^X<3#LAToVNn?n`e%w58;lS5ezB{Y@KM&}9M~7Eo(Jrik+V9+6vf zi%-^i)znpy7Y_l<#=)?qWU^7QS&~O!{$t}7xT1}|QB;x+{9)sM#QbQ&c9WMc@i0L1 zX&Hx$C9k-04Fjl%JDxw$uYIObHlSQ4cXI9tLAjfZ@t{u`vSfF&Aywm1Qp&S{CT?4= z#xzw8DTg%E!9zNV#g&=t$X~=RU=r5G`0shn& z!8R*4yhL>CGvXL=+ug%hidV_03o(tnV+*)QL-oR=($F}HLL}Y0M-f?&eRSk7B=b)x zbGThE1gk=wf8ad#Ly^43T62#mNB2wk1IHOD8tu3;cpqJWF7b1<;8nNWD;ZkcfsL}q zkCDRq{V`QL`ie@2-nb+1+f9sHXMqcy^>26rdX-xV(0)&>akzrD_voP_zA9zEHP5(r6lVBmnxuVYeoGwfb+uj_3*ncC z8!ItyZJ}!`+8U?KDWjDXY06M(0;Mn6iS`;Sz!uw5-e-N&6z98NDYTpzef-`xvirSv zd7osfp{Mxy5bGV0g}!Fl9yGX5(dhU7>q@N%($B3Ph&9G-S{|j3%?k{?1)rIX?LM&k zcqI5n?hM)f4*mAuGbHEhaywyBN)uk(U-X8wrx)KLQDsXjZ%{ zG4?tAAxUihK13)}~l zgLhx5{gKD3rxjaaSxiY(#WTAo3CEmceIjl&t|rM8keDZWd!c8de*TEUn8V&;A*6Xz zd?NEEF~Qd2bMlM!et|5yPy%KSbn;o*_t>EAy;K|M^m*529k25;AiKEn%0F=$eoJAA z+9gC)RQ^sMVWOTZi97eqm5gS?v(cwl->$Fyz~2$5O3t~JF*dK79p!TSDXZ?y6wUdT z$WIFkPs?%Fw;YUa3k9d!6|+}Y%yywveoIl}oD+LJWk1-qJ76_7ECQN;4Mc|&;Y2Oq zw2t)6YB1`^l*`^IZq9x-N`HyniQ$Er5Wh5o7N?llqS61vxP4VL(){v=jZ*@%abG;u zUh{nDrgh;X8kac8Tb0@+k*e%y`dy^p{lEKMj_A{cCu7d)MjBandE&}htg&3$y=Vp_ zAWe$=hW?WRU_N$WzlQ;LCxHJ49QRj2{?E62lRgMe{Ga6OU;R~5PdFTqaseCwbeHiT z{(fo#P6#CW6N#lMFca>>zrtF79-Q#M+FShgzg1RH`3|^H_qhO0|F6A5(`Gr`*uO$u zW#xZW+`xsxzoA5$LaX82|JDA$E&v=&thI1p17dJ35%fpxF7+oIEl8>1Kj;57tH^zW zBW|i|fGhpiMFEdyTm9XBwhAW)sy;%Z0O_y6AvB4#!ukE%0e)S77YIP8hv51na|fK& zzw`doqUx zSyRV2wd=}7D^S|!@9G@7`2EQ%lMxi4vWRu_;Qzj7Cfy9d^O0*_2W_=#ZUjFT#P)vK zK1T1hxn*K@g#yNonfiu55jCT@uFw!|C;hXlMrI$(_vV&nP92MJVzf`!wr=6!LBuSJ z&-!EvW{1EDc%T(X3yGe|uz?;E(S|<5qL&hoWFh|n*<{$-PYk!{sZ}U_bFswNuY`g{ zr-1?XsfK>m7{qEYfH+2pNzw@yR;qyHFx4J1j64g??;7)AeAjLl&2rlwP-ijLt=|I$ zl=5X=YFKIs6S*}!G>F7j23!+HWL?|Ba4q)ljR4caAEC;W)>VkFyw*!4)3&9pGwn1} zb+<^D_-+cxAZZVkwG-kX0HN%WPRu4ptft!D{il^$L8mdc8LU~s%E{3)DnjMjUnI~Y zEf{}2MqW$y<8==p83a-CbUJlXKO3;PG%it4V9FSwoe~S832!di3ZIvQb8?xuT6w zCXW_(mHsUHoG|Fs%)I`~*^c0N;Zp@uSyh$&mi7Tgt_Gl5%)`ScYZXgN>NBhdgW#i} zu&2IbtOS;(oHoUGd^-U2;4~=fhuAgLyd|)oKy?&iPv}ER%5a24x3ytlbT~w2npTpaRszX7d5Y2uGQCA6KQuzA zWpllkw3#zSiV~B*F&Tx-{M|;H1L3XQ*w6R_a)b2-KaHwKzHt~Yc=a>PYUe2`dum{2 zPX4fk0Wn3tM4O%yoze+?=zg)U$CQXbt}Su@@p8cgw`((2hEt37StI&Ycv>VImC85y z94IQw^o%gcUx8Sw@${-edSQ{8iporRK}6|kCbAN{9(cs|`&?X4kgaNEh%GB;N_%7kFqmA7fZ4urut}Ebu0n zl^+Zs0|YE?jJ51N;-Zsx9Ep-q#hY-Y@R8i5I*bk;1HEw4=P6n)WP`>^sD^%G0>YRc zP$%)SOAO=Wrqw1r3e^xV(C|q5=R@QtcEikjLMhCW;%6}ifAdO}%PUoxMk@i~Y%3#* z`cJ;Y?y9j1$4p-AP?eHD7uc}H9P=-T+udO8*0BqRPr9NgJ}YD^&Xd4L+G7yFQwTpqpUI3KSf4Y?bwCTLF#_Gfm;3EJ0C-wW^($} z8l4ehpkuF9QCs)HLaXdOgF`ovhtf~2{BkprY$TbWa|#7HEW{CGfx5y*`MAW=ffG%j zGgTm0+@Pt{rdHPYgGG|hn^oox+>z!@^^G&Fr+O%AI_3sDJ{ zKlz@}mvBl!#$7Z*bFuJ9f_>BtR}EUj0qanzHyfz^D2`5|xvxRiuQ|bWYPq-wzGx02>+*DN~4_|rnqvJ#(wJ%%?tMmZg!SfCbu{$92 z0IJ=^9c7-vFoIEKSM%J>9Zz&a(53H7V6~u3&VdyU1^qMlLZ( z{%W@*P_3Q|5^Wx>{FoRJp&Q;s0_uit zj(@fK7&BN@iQwK?tef;M((^r60BGlvrq}h@y`_n6^?L7fUDP0J6nZ7UjFNd`Hn$+4 z9d*gXS4djdip*@>g2~V3p80lDkQa zPt4J=MWT$DIEcdA&2?v=?s+}4%ri@e)tn24uQ784>9z!TGv=r0o9=Zj?t0{u(X%^L zLX##FKD*Udw;!=`XBg^LogMtquXX%9VP0ta(JwNVt|eHMU6+GN* zxFAwC1170C==rr!i0@su*AQyIxxk}(?VT?eTrz#~KlN)hI*Fd+7Sxa{2#y3M|lzuOo#uzZu zqooP#P#oNRye9F}>Tk%~NZ&*lVexu5^TQ7m1iae!%D=J_o>BfRkGW&y2QsT40M8+d zcA~33az+6jSQY_a3)YnC6R!|xqsxD&1mdkBYGYGKN5UswaBplsdEPGko`tp~fKbD( z?!jgTGW-sZHjzg(vn82;-z8iPV!c|x5(WVEOmHXiAbC-i;;z-IQE;$BR9aAQ?oIq< zRw~l86F1@%GVJwE4u3SCBm~&6&PAo>vFe-DFY}++n7F|oGVVtThxB;moCY_R^*mIc znmuXZw#m)JY>Vh5c2g+sr7nhDh7!bE+_imRF&fh1Ioi8EJv3RfU!9E;%82gKL)igN zu%4au|1eprk~@(iId;w!ueJKJ@cPPIPq)c@yHoS(#SZOZ!y-VAGP+zuz=zxu(Z(7j z!Vn*-QT;8ENGJ4Ad%VI{CB$8OY;&|G+jnjoV(vRWlHcMNChH&sf~io;6Jwh;CqQK% z^~r#x{$K;oF8f;WXbp~@^JhKc0d7KIAOTA*R#h&N)B5Vf9Pgc$ zP9o==F(*TvBuN@LN6Nc=wi1kC!RLItz~$T+;M|zt+~|&NPqJx`(mOT7KR3g_cYbEQ zZ_d&2{``G&l=F_w@%d{Fq`aBP>;vhj_ZM%kG#RfD8^IwH?_?XlXdAywJ)v<<;ciZ1 zOZ*%Q@>tfGb3&9DAJ)Ox0lL8tKr`ffpNPVAPR&bc@-p2k1bDnb5~QAl1`N${?iF#S z>M73JV{GlE)Wfyjcp3qPR zP<%x~r|;gZ^KA2I;pTK+Fuu}aBjsANY9}(|E*m7GZ7Z94t3~bbGNKbk0)T!&41k`nRUY+bu5^;RW=vLm6Y^W9r0_2Q6T%K0^!sM&Lav zIC<3IL~1zcL^^4~zSAKX4~d)TK~4`XJG9rAb9JH^?^kd`b|`{A_^yAG1PMz=5?=DI zYP!HjotdkhAZBFRT0J&h1&C%5RINVNrN(b!lgYO!#o=A=_8{NGp5_(I8WF(_S0@hO zkhOG9R+H=#MRMUp^)HO;k1SqQqt*9391jGB>c7BYXZBOV@W8Mb ze1NQKL2ExC?2t8SX&D~rU$-9+k{Qhc)vs|eHu3YdWWM`#OsvyoqB*-dtNNBB1?^Vp z-N5S8kXFUKrAfsoLQ-c^55%Ll zf%A2+wXred|ELjz{(8oNe{=ByA6;i9G2c=N6{FwLY%?-xK`Ic68q-Q;6+(%{4!lp# zcc3efXk3i=LXIb+m`6`#rb9~k|fv) z2_X(j{u1qvYAuSS8SIL?E*qLi>!!RZFOH*ly+2*@^jU~|EW@TXlG2s2H80@JFv!W- zi4d)PHKm4QbU+~$O9N95Kzf8x;W%hk+<0q!)^#!y8jop#F&8emk6cZ(Fa@TFoH%{d-M_N z7t4;Xa^F2_Z?HSO<B@fV z*YE2;`O%Y{AZYMb3R{F!rX-Tjy>$-D>yjEvj%GhR%w4)H)t%P(6Q++dkIx4E!V42w z$Xb1p>X2y0lmfz4$pUe^>=0kyv%y}Mw&lexc?1OMd4DXVD&YHMZo{?Q+HRVHC0)uF z9C)%C<;_gp8Luo@ZgE_q4F?Ew{lKJ7eM7;3L((g|M_z9q>ZgFKgDMem`8qIpS;fmro&`v;|3~ot(@2BToF> z48Y?g6m(4apbmE??X`Hgjl^@90@Xge7KEzV$Xs9hISZCvGrIhqualNL%e( z*?zCpLX(|%eE22LijH_)rZTC|aH}AFU&xJou8`T`zZbI6(#7*Q7A@s(2a2PaAy9=z;1nUa0k>BWlir#VWvH@^P zcCt|lAub<6GEEyzJ*o|xmr<gUA!3y=OA;2e={nw9-&+6NLN ze>+b;kukCZANdB;c?l=Kvk+2^3UWk3J%RJc5U^hhLB?UBisCH-xT;<-CAnITIMs+AGIuK$XUfB3U1z zr$D^bAgx_4Yp6NUUTz=7yq&V?JVDa0Fvi^;e*b=^6HOa9rj>)O0DQfEt14F&!O-s9 z)XG_K1HK}>@fnrmAe3+FRVX={uHbP&rksgGa$a#Hu7|+%+U?0PAzT~UeVcni&GD*O zoqGzi4;g-IdO#L2UhMqyIQNWFxyc4AaCqVUkH`5xzX*J=UH1Q9)EnmkD1t;T!B)%2 z=U_fL02<)`uR;Z8>D2$#rNFf+2@onZfUKzv0MPwcJc}g;UncqifCHMi09Vz55dcH~ zA??rsivI$DEpO@nRm;Hioe=2rM{odoJb?bc0G~0jdA~1fTYwm+|=;39YG% z5b)1GxCwj^|39170G9vSQh5t5FbY!x9{w$WdzJsfgFwuHpMTqz;JxyHy{ekP_jmu_ zCxV;^0V1Gtd;ofr2tPpV-@@N}ImG~=fQ;|KPF5EJfZzWLp= znE^Z?*9WiyPu)krKfhAYpTcD-F9026Ck`M19=c*KqWx|_mefVbEq_Phl;|FBk%fq@ z`i`mF5HPG;qYJ1&O*j#iY*U(%F8gX>srk`EKC^ei#*}7an{tAP0U%TQrAE46gO6V0 zF}~FALaJ>f#qkZ{ib-9%vniaizH0>TI3SRUW1TnYwyu(tbMV(V)$Gud=881G2m5iWyyXpF)Ytlp@xyvt}aB>xA-21OEE(7XN+Ty0l%u*sN18>eC>7T>yvcJPChwAthX+Y3NSi>^VXBu8WI## zj}&s#Z`tR%cZ}y8Iqq5L@C23JQgB#GA`}gPLoZYkii1?p5cRULBXx%6h@y=(kdm;o zttv5=AzFH1q{Tdbo{m;6idwMzn~oHMF2KOzYNW+s2|UAjjCMvK8{IdFA|)yHJP1cb z@552Jk8r{PBqKc>BK2ahf92IGVp7AD3| z{DJ1%slPPMTx*ZKLfRpt)SdJ-a6#I>>!v_q62UQAGZstgIthDm7<{7IR3tIr8A>I+b{X{P4|lNGt~Xa#@niAO?E`@hsX078=JH89<7l z3K9)K>io=WyEXP0?}w$Wy#5e-p%FPJB5La>QUK+P|9pzIH*xYehd zs$4ge2Y4%8%U$N_+&T9r?DK3UvKvb7ky;&lP%x( zu@#$?mzz&;M66`ymur7)mg^a><6~ORBy&rhFw+2vwd1=JEhF;EL{Y;ur%xU|P*MW~ z*b9#V{Tz$V>9XdY5#|dQz&_Xmx^`OIZ`*1i&yFec84WXZ-FHF}r(6%5YP9PgM^i;` zuKZ>veaOCMlF6`DP()yQ%IFkuv+$qgy-?$s44X>UZoNH;y53BLq{ezL7u)&KG~sn& z&ajK%@R7+5#iVL&;}d@Lk1$8*8h|EZZgzFxQ7aMWPBH=ckh?$M0L>kAdTQok6`!YK+BV5WoXPD|pP#h?~Q>AW7I=bJ(e zJI|_(34g3DCcs|vQT<+M$IOo44Y^2NuCqF3fcAdSFh>)abCA2W%Dk}l?ksGZG9gDk zNRMJXsLw|V;J^e$thT1$I*~mih90QhQn@M*?|J0x=jK^14pa@@+Z(`k*W2Vwps&SqdkVMb70gU0+>k^pSGn0OrEo%Bq42$FFDoR_8bFMbro#Of;`XcC zZ>balsIF@|W`+;5l{U-SCY6r(&VzAQDFY3$Om-Tfb%zUZsqBU@Z1Ku?l-HrvRpw8G z$yR*+&!714fYmxJ@-r89A8)d$N@5uvnA)-g-~=p!tZF+`j_^su4Lex826nwS9>3-j zI?$J0-B7etW1Ypf;fTPB*m7ubLBXSt1vDLy`VnKfyI=7^v;MR~?5wAM+*I^S*mi9{ zN{VBSu=xapoLjkrsb4s5KBxaqem?VKPOvD>6fzD(0*&5 zm3YnN-Wtu-~{gLFfUEdTZ% zg-acJbz$mKtG>Z#aGT5Tg^^_XVd%0<{^bCR>TQ+J?m!|87Pq61b>u<>F^jOSL$EHO zzdYxw5U?Zco4X}n=>vA@G`f0GlQI>zN)4OPJdy^mPh83UtZ(jThL_6~{{-}8Rd;e^ z)rWEu#Y+6ruiZV=FhUyb<)BfGgG3FnTYPr#6%qSOj}jhoW3h+K?8Y8MibXK1o^jM>d~ z1nk{Bqf+L0LkbLcRoYdU7tm6b>b>KRUU9wyv9HlD{fhkSmpN~| zO%=Xl?8q-#oBj9d2`ygGoBJb=@4w^J90OsFI8S1%AGVR)E?Cm>$$sD2o@^5wOy_Qz zkI*Aw;RocC4b2&AoMh-f&lA){s}XSVxc=@>+)QY8mg_Ab4Isy>K?hx^8GfqT+MCRG zdECs|#qm?Ui{h})IKjC+j#x01um3m+HzfQa32r9YMU~bwe~IS^f%;mOKR+*dPL};e zmCX;SOt!^no97|RRIwE4GUqqspRCO0q?Qa8+=LbUKbo-rYXX4{WMek7H*t0Sqj9GG zN8^lgRG|^)ONJ;weVyAT9co5z#@Gg%feZ;fy@~qI$a%(k(ogCPUy$!PHB^Xd!(Hgd zk`-GGzoz114()Va56LX&0hEb{ZzQAg|E+RXD>L-5k;u4ta(Q2H|Gr)1UjOZ~Q{)v- zlpz3U6o{UTPs@SU%^z5lxRHz{KM`B_1J6#rb*4$|Ypp7K^6=D^MJ|cqg3?GAzWWS& znnTS>unrHO@#KkCXSg2!3|Qo>H49?eM!ZE?@>GOdkkhd2v5G`nA`1DWYY`WMZ z?ytyM0a8q_N}sYt?n)oEePQz-k+ZLVMa~3ya_uZA3~e=y<;2YHD>9zJ;Fg}UnQ>Xf zr)H(x)_ByEKirntUv4WnJ%e`83QATnOLL)5VJ!|8JampbMh!f4Vog`DGmFD7##pNJ zC{N60sknm*Dd{h`72&xy7dZ=n6o9&`tl-HUXI)g1rIEnNoYqO%lVAzc%k#ob z4V02U5sw0P-Nl&%iiWbB&Q)hku(!o=l}`+?D@v^(2lZV=@8zc5>eiRyuToto_a41! zG$blF+~IlH|568;cG6Q8jZ_E9ww+$Dy@^ zob(H7>5-R;r>##6U`8Th9Q&B zOQ!*9)#t1-d4VSaK(m#S@|vC79kkZvnwfq?I=-43{Uqs(X`_*&#`p!or!Df>2{Kz$ zBhWOer{5Vvm{(|VwPem1oIyxKer@&lMrUHUcoZE-B_)ix38$719d&-Hv#@bCC$Etml^3IpvNx zh22LCxt1tRl#!zITn$cnETH;+o}rbB$vMv!@p&y#Jkkjk91I8}F&T@3r(Cdn8IY{k zu|oB2^^0SC#}HV*>_j!QkO+)ueFCCL&I+Ej$Z7&QhWGh<-kEttOpgC7>1EmdFZD7l zr(^qq1y@Cq%AW&vyg9RKK7g>=j}HRBE=o3jbyBPdhWoNmpg+6m;d$ry6T~Pil5R+y zCWvfxr`Ims@p1mfTJ;>;1y1w%o&6=W_US`Aog~VD9Q!fN(zRi}P!{5FiC?!JrJW%O0eIcEiiK zPOPbmS}S|ewYNeR-Wk1yU@)4tdk~$4^N9N7x9)1Bc4jx?uTT}0mbVjdnQOh}Xk2Bz z*W!`6cmuI9e}gYPchkC5TD(N9d+SK`n{dL~TOy@BPZmsRDV6TcpQ{?UoL>Z^wBLxc zM%d;*R`7>X+d2ZN*2j-lq7cy_qbZ`mJqhR;oMDkTj5#NCkP|#erYioPSy65E`hj3# zCnujI{+{f4ho8&8kNE)y;dzts;P(zz&3l$8+=++^uM|V2sbE)A977CPn^%(=E2jia zL)5{GR^C`1H#x*yLh$_f#-fU3zCrU)794p`Pt(PxWU$XU@uo>d>Xm+US(DrNQ4LQ}&MhYYAC=QC!{l1L3i&SJ)K~G8%o>FXsU$W5o`SA;?FRG9oz54XK0il~) zp8w1AI6AYYA_O=!5dMFs2B26C04h+hdH4>(**jTuz9QcSJ#ix)My^g9z$R^NsPGY0 zH;Si?W|-<F}^wPoAiDO6dxy{YeQl1BdFfN(n|o@QmO&ZwPC_x~CZY zbPU@q5z&8Af}6q_I=q$dbS-jn11T~Z)TL->+GvWrAJ)e?%lAulu;aS=WFgDs%Yl+H zqA`sO7HzwlzYoarR8Bnx-FsG{M+oqx$iJAz1U67Fm;0--!w%UAw6w*Z%~GN zn^*@yfRFFXyuLO}1SWTNAqf=hd)y)Hq5vv3s86v16aG76tDN~Qm-OwDxhEaZDO_wA zi@WX+g&2qy=x)5YqxtnUu!wU2d!Ui9CSVezDYY^jX3jG{OrRFyvu2&!El!aRwIbU$ z5>^R@nhQwa^y{pOJI{?B2fIWUb48;jHqwYfW<=OiYLS;ChPzxV^2hrG99*Ukn*%Ka ziAIl+tY*hsK=5 zm0o_P@8(HwHo)?;Am4*l#hO9JAX*xRQ1p^1K`37B%7AWUBJn$X&L+_oIQ^L`m`PS7 z$A)-*ldoEk#y*0TNR6-V*G%k;}^jiof_{{wUvxE(XY ztz3khj~5>dXo%b*)Po3Pe^h1xXaqM~w5S^_&~8kc0=pB_*<o z2#VrliU&JivP=;WZ$^}w#VA{R6mIR#Wma`a2Fnu4w9OuQ!kqEOR0dCavqp_^GcBjC zCF>i>KzW3(1~2(8`$>Vu9WN5{B{Ek0Gjw{TAO!+^!!XKE$Sp5T&)*Pc#OTGxN!!u; zN&{{zeLvB@ZaugTnze<8!&)a1bHQvhYzeImV-s5tz=0>l*|}wZP$l~q*br{NoXlOj zy2tH~bd1dv--M@xh}I9vEtQ~UeAqiDtovwS3*}RlUE^Nir!#jW8=L*}^XaNuh_d7M z5t-FmLtWLEFZ&al+T1)hjEF|lvIVzqK?oztXCCMV={EF<*BDf-^=MuimpJS03pky$ ze*kZfud6-46idRm%40fJb>~}`@8Ow#Q9_nh&!JA@pr=V{Limz29*8V%NE&Pdth!2q z2S$HAxG_%j^!cEa0FgGh|N0kcQf zJsr`F%`2`NRYz_MM(N$A6J?Z=VQ$bRK4?qY^?nXORV$qigUVLCsS0~4yoXZJdkqFv zjG_zofhi+56N2salM{yH)iq9SALzN0gat1^aciLq%~PGsXy=DiNB_c(RjSesh(CCD z3mEUF8L_pUgT)dZLBR{KOS#^(ZO^zdspOxx0_|{ei6Bka@7drgSUHc|)Q(&b3u~dm zJOJ5|9kWImGt=ond)Pz(% zeP8sHX{{!$`1=)_sU0la@RU*?BP5oyJ*2ujX8xE8HzTy zB;!65#1!lDPrNofhf(>4*yS9s3kBW4R=B%VzLT%8qq4V53HY?+?)&H^-y~Gs3V+l# z?yTb4RE=fxR{zFZ`|+FcEP^;Q7_9jooY@Xu0Mt1L@xV`XkV>lU$KCF2wngnM%hKsm!0;dFP*c;R)^i*HCVq< zeJ_-1;%=BYUTSl_2UL|d@s zo0MpIN~_cn*%a6JC(Kb+7?{U+pcL3wGY2Y}oI=mxE=`$i&Eib;&>S7-zMXO6ZX;Op z7#rrBhX%4k=CJ+4yc2#HwZ#9yyj#;=l~UJYcaQ{NVkIy6z?gUJ&b598XO%93WkhH&63f|RBVZ)+QU34VUhJ$Gk#I=<) zR=|G7@POa(tvfVq|34Lm4^_)ZDF62~!WsHsivrdVzyXwj0>Gdr;)+)|vAZTBQgS#G zhkVg|p0f29iCh7z7gT&Yt%y6iuY5OQF&xz7W zO`SFg{nb+Y)p3%G{u6ynWR&`^-`+QJ+ms{pD^v%3W=p~PBvb6i^>Jvrft^+`v;*Pv7UsSZs$&J_7cYq6mcaVr$y5R z0Rn+sKM12RZ0EmdS6snH8xLX1SI9f+&kN?YQdNE&RF}u#ef?!D*0;FN6&ystFiWqs z#BxkjjM;pM+DO)mY}pctF`rgx5*CY3NJC2?ftbS6zM)C6w(4+4JIe>)TBgmK>W%oy zYuL+3M8o>odFH)$PFMeXBW$){u?oql1FKUYDFRJDtO)wu?L0FZ%#lG~pFI(c8S?(n zh1b}7MNNaf;uWf<^VkQW(xw#{BZ}wfn`?ixBjqZS%2>4zh0$_{3c2pEK?sOSRmQS= z!jyElS+S4!_->p#(I;Z0Fx(zI#>@Kk%|9#-N2sp#^l<8(nakfDaDOC>cYpP7C_|bA zrlShn;hTIP-M=ra|E15^_Z1)e(7MO8`{vbpw3`_5smHQt8i#E^96zjwI)zTbBUJnL zsq`8jema^8KlKRgQ@-`U$YfyZ<1aZl^*K>60fw80YvSBGuVKXegR?0%29}Kq!3vk# z0WU#TIeL{zo03?UfVk8Jl)@ctnu@m}Pz;8wcOqjhx-K9VDg1`4cFtg|ZNd2S1ri$+ zcDdTbfXt#(rMrK`6hkWAVc`wmwII{I+qov;0nxoY7f-VfM@1t|BBuBAmEg<}aHorANZSPvS=NAASKDM1 zfeXF?M2d#VeKy9M@Zh5s?2X?bUbAba_EO$6R?XM?cH5!MK(lm|7O~wTTUK=heo!&<+H05XbvQZZ0ozg`J=0W9 zpTc4t>DvaTE2#!rxs${`g=ID)Y|c0}>F#!B{ZwgOn+py2X>R=xYwWy`9u_R7aFdan z-X>aYsvVKqV97c}_yK9()7=kcb6;6yJb^DZ#v4gwE1gxpJme1CrwJ!HY9>K}BNPTM z>9UlwIlAl+3+8v-QVaksfNB~=E?H7;;x!3aJ(6+8hP7tgcX;2F{llOwqq{bvneZEr z9@qjt{@_r6Oz6Taoj&-kC0{A;x@fXp3cvXKlb3vN=kWs_vDFw=XFjEC)?q|(N&%%s z5IWzvhv2vEeg5n|HN?pTEM7!|1qgSqum$YhOfQ&8TQ9}IYkCc)VW4_M0&XqDLZDH+ z&@qe3dPniDhz9FHhq7720N=wm`@oQAzD&_(BZAGMiwYy{%dq9=6dksck1 zItPBUvbJ#gexl*?wrA{rAq!^UzeImi;#*({GUG6(JmmQ9=P2NDLCc;iIv65H!Dj5>x5ZR73Q+GwK_XV1Oy?GrGowYH|^P(_m z`C`+pJ*pF7KyQ`o*kJ5?k;R&+x$%@Q?ABDfjO@bOaJjX)Q3SBu8pnlbX&gV*VJ}#p zctp&Ef)J3xfI_FmB|KN7mD@-#mh`$YeJAz(=EMFv6`!nl{)$PH}gNySux)yK4zfaVJ=5ad!z`Ah=T~l;YCjUZgb56X%ChQtHv zv-{Sx<8=9VsgGQVix$m!a7Mb;u*$nqSB`E+3qzKaD+17ONd1|>^-}OVf8`hJGPV)s zThS6IR(#g9za0H&Y;JzZgtLG^^_TIcuYwA(Q#zJGYF?Tc`me6!#Q2H4O4}5?Ty@G( z1hP+31nKSB7$_u48$^G;kqcWV$bOLTbMXdf7lD-2l1Q7K@Idjpkcur zOD&P?CNGAm?vsx=^h@zFX_v<>``gahP=`F`_i)Bc;jt%4%p$kyy0-eq2BM<;+sJpj zFO88FDAgY~*F+G}hKEdPIfNKpyeg8gPgJZOeu#*cw!{eFl~m#V$|YnptF(lc#mdcI zXz&t8C`TnlHTA903Zku3N; zxTXy;#<~T;FJ$-EZ;2QUQLihyQ+Y7CVb3ceu^(+`7_aBk9h?H`Yg&Aif-iiM1ACb? zZ^l-S$-+JI7wmre1tiAZ4Yym;K~|C4L2+&-3%pj}iM7Zs>WoQ*sC`z}5>T5$A ziH}Cu*VD_cDxpl~<2;^n9{GoPv5Ha@nCMXv!+qFCPR8~{#=_&Nj`x+pdy(+JY6Pj< zwZRe=^D~L|g3<4t?-9QIjPI<;#QadFu4eX`)?UQqdj|W&mt5oGiB`||=Hm^>A3!eV zi3Tgq2CB7*u23BGR|3{DzsEpoGjvXtd~rk_qvt^axOh`xeYvB3Uvbhu&))k6i?dsq zB(1eE{jR;=pFKrk-ab$Xxv%h{s_V^iYBO^1#JSpi`G`OGDE!+gh0Y91dCGDBO^1&A z&#yWMV~yk4s7RhKkQEnR+g(hLJp>DoQC8%zyXN zkNDD^1*pN87|fLTC5zh{&RjuD^GpBnt3nnfTalGYL&IzDSj*LyfG~s_#7RZ$653Y| zo@FdWnku>{Ly8o1!>@jrK(l06*y=(E4RO2UhUaO%C*jCWh}4sZQ|@HBpVgLk{1fxL~T6GgjJCGVo*qpFwIJ!s~T)O7@h!BeQn z|K4=B>rZi=dgdp0AtuOnDPGH@$$p?foS8^8c7PB^akOr7=uu+#;>A5%{Y2ZgkI`3>tOmY}1~GT*byfC1IPn__?0+VBnMO}h__peO zrfcs;;%dJRdA!}YmH^=fvB(rrX^b_yt}S>K+ppMDT(dU*>>&`G@@hvZF6ts%Ief#T z(3WDELzqs*X3EOwcxdSpSITlDKT|V6dcW#fnL_d%pJfD{G5utF_saL^zNVXkJr;+3 z)Oy+B%SvV4p#Z%ay4K8LobiN$*Ds7W_}F5|7;wbC|VI3K_MBq=%wDav$Ht;>7c+JrS2wNemraY3$@0fX8l+K zb91E5bD_2n4AbK%1(U8))FT_NGv)@v+&TJ*Id<|_gUN6m$Pyi-l&bp_tVyGYHR(be zG`Blc%jgk{wP4VayN4<{+Zbb?U2SMrA{3K>1&^uAQ&Nma-yUiP9P1=T|vA5^l zE#q9cn!2Se3PQy}G4H%bmr-YyIEEYxHMaTJeI&Igi7?F94d9&DSixR|>!nR{x}zP( z%?br=4?WthsaLzfH$kPwtRGTQ)G3&kAA=Z{6PeJyOuPZHY$SRRf4ljp1vMe&omq_- zBW`o@x9z2?zA+aB@pS(b^-N-AWpy!sxg5WqVBBa>?r2cT zqKK5Vh|;czoVdsb@pVSP?vxV68Ctg`wHrZ!lGM7YE%!2Yy%0ixP1B0(x@Exl=`B~s zvh2DJXtG|8qFzvFcS@eZ%~9|&@HVy^m4}PM&AK*q)JR2AXOx&E0L3A99E0r3yxr_p zd4l!F9S$RSPkUWzC>MBmR&QOs!2`hj&>%jN#P8quVVSBv+(3iaTZt;_iVfHW8JXEpjLHaPRM}HpZV0>Yc_PCxq)4Ltj;=ZO_ z+|@4(tCg2IJkWM#`OP{y?o;4uZk6@UbRp&~_b{k%z{CRHPgSQNLCCIg!Kl63PYCxk z4ws^KQD{{LqoVr#PCr<>8<^*R&3o}}d(exH@P|B|sp194g=U=9AhV|s-bLK!cYB0% zFb-uOEsc2pD8(&oB?}p0?D-SzL1r4%`B<2;07_Lrttxz!I;}|up2*bw{3B!P(QMev z=WRlFP+IR}d&Z~|YCM-`vffbufr*~TnPSSR#=_+-UYaYC0wld82v2T{htBVlh3BnN znarnhtG{6mt9i;x>*2AGMq&`n)}KL8+h-XMYQjkv z*^?*3^$juDqJw7H<0q6#`3ohlf+`j2^4WfQX5psbqaUP6UMQua#;UH+jc0Nd1ZPVZ zb?v$`W=-9Nc7jJIS}egC;}03L_8x)45B^`M^eKbxqhvVf=|yE5sFF15WH@3#-Of0Z zlxHiiyeb+LF_q(Etdj6i95I)|NQ|wr=ehjQ)ChF!D8+J>Zk4V_1tju;7}O^ z)PF=skPq$v^5^2;Co+KK2Q&%@ju!yoS*DVY#0~!YfJO>&^!XpzY$A{h9O@4%qAl

T>C7-1)u(p$l^W9Q!8Sy&YxG$tvJ3R(t}gh0Klx@Xo%p+09Z+Jqd#ElpI)VN zto=s?fvHUXm!RN3@_$V5Aps!(?B`|R0s-S;zSD&sLxTy_wx5~IWVgy z+;>(N&IBE8Qp2i0IbOMVMUkMU>V`dC%(i<+i_I|+n4c9b)!5T!4E-9;2A{DsLO zIzsJ2QD4sHct}*xKBqdsRpU4?w;RV0$r=^8mRyh7gfY`Qv4s|u>*wN6yDyhq%aQJw zChz?VEI=c;wBs!;T~+2RTO80++n93ZT-A@1s3^sR9yvd%hH51!6-MQ^8Emv!Guu<` z2p!Vr{NqQV%7AwoM8G6Y?{8&Y3jGPKxh0(*q&wKEqx`W1v4K*A3=y=c(eu|MU1KV( zirckRVIhXYMBUQUmN z$ATl8hB?Zrt7K)#G%%_!gpvJ^@5kcstDb2x*;GeI8T`~-x+mhFr7Rm z5ER=m;XGH@6YsJ>PxiGhA!l!U*a7jAHY1xSb1~bYaW~Lb^-FVAX>2P!>emTFgS&>r z<5`Q}iP_bqOs5}=f~Z$Ue&&!*vkpIeLiQD&z$}uS(B7E;qu(`9$WOcCDqLAa#WVR0 z8dL#SWMXX0)%=AI0_hhwb`J!7Zp$?)>;Qqww59}&>P#KxdU8?i06S)@E(7-mfA2oJ z#_wdOTW!3zvLwWTdT=JhZ$%QSYNA47Cuhs6hlaWZjVHcwkiGfx$R=h~E12+`IXF{P z^?Ty&d0!cwwtz#k<@dV)6>S+a>Lm>eMYSI-4&Q86G?fSh-h!^ab1QJ8aO4srmJ3ZpmK^k;xaak!m)<(K81RTF}`9qlFiYSE|~vC7mTdoac+= zy$O!=Knt&ri8@55s$@;~zHbH08&?VoT-HW!AFQmG1?~Q5yI5Q!(pj3%onrL6%$MNd zE3W>|#U8IZ(xZ>vTNd-ysFiWcC>jbfic5_=BSPfWD=mZS3=`^z)ALYE978EePoZpoWX4qEho;-$!*F(V?T8+0IS(Sg5!68J0a{-=B@OH3+%Qk`{3ovD3N!iXv+szu zf|9~1*0zu_gm$g<`l5;zqbZ3~td3rx!H%pv_~Y20UFwohpZse|M&wtd@Imhz zlGG^^H2Lv}N8ED*Cr}osQ8a&__LEntI`Xe+wx448(t;gs!kTCP3{*(pxT0z+?ooM~ zq9T&9d=5+?qI!E;uw%=LYBwK{2yc?;6&O9^?>tE)qyX9D9E7UFD~nEhVNu^{=GcaW*!E z9z*xV{s~eAkC2#lgcsN^q%i&~N`VW%zkGgryZnW1#ZZU?96WQVJRJuMixL>%>A$f3 zA;C!iwC7kvp#_9J+?xRiU{pmocF08vz#i}v(L6X|5$zv~%zSiW@QD^&Aw(q)AoLt0 zwjBQr5&$@KRLImv!1S}Xuu%XnIA!2*Mj(Scwwcyuht zr%J#xyUjm)YqF5h2_aL}|8Aj4S7&(c0hr?)fDDPR1tdQ2B;o9WUF8F;YY_8#0O^x& z2&frQ|IC*I(~>>)1_C>|F5vn0VOm~r-#P#Q7N3DJRFn4u2yo}xvedt&#LXhMNH%`P z=u*J<+-(Od^aEHy_#r68Xp}HoU%}Zi%(d?i#(W*Eur0nPaor=c0&e=zkUq@M*m-OF zl92F*IArbUj_#iFu2QJWyy&c7BrWM_Z1^;@sfJ(V(LulpR$!;IwX&4{dedI!Yh;MC zQJuN{%yN`ew0_&1tzy4Gw5XZ!1*(?W4_A*&FmzvnAwd*0i2JjeurGkh85|cGs8zqk zB-4*F;6ZfXDt$Bc$CE;NX!Hz)DVjsM?jqPUV{C+o)u>rEOEXsM=p-)l7Ioz_ccj@e zjw(|EhPy^TEgqP2e0Ie=g28!Znyi4GE5X5z3IXf4x}aB7D6xJd)(8*64inu+PHDw9 zJL0U64egr!3k=Ffrnqyg|K_JV>3^@r)f!0iE4Ac=inO#UNb^Fay1v- zdyrkJOD)MiXyjZ9IOEwpL`V$3?VjuMF+~?G{mRvLrGNhqHx;)a;$6n1; zhlv^^L#;ocv54CxYk$68j~4KL;#@LTMwy~IJoo9^-W^J##NqkOg}|+u$QCEFa)Vp| z){D|>L2<=>WPRJRyb>Fn%~ls4hoqlunYYjiioTPUSlaMszP82MI#KLSi)+-hHHckD+P)=&X1tJ5FE4#*568OJJ=2?J$Z^ zbyTI7uW(-=BO|}~hk*{Da;jNgSK zFU>+pi2!d{p`dc@^9}u^Wo6mc4}T{QG={`;(f@ignQNU<+UcH3_;@m>>$ZSI_iX(Mm ziPhL9JHTv}AdE@3-BGTamBpHHyWaOuh_T7K+yiZi@hzr9G(pFB%6zdgbwKLC&{~l*NWDKc^uq_b(l;bNkst;D=?zaJx z=)t(=?HU(nF6Ujg`S#%VEa2Z+A60ZqutzjLQHDdhw=@Rp?o>{{1W-)f3ls7o4V^z? zJ1&30mii&TpR^GOed!oU$Ba6b>&#qN9JQ*eMw_Md`vsx4@L-sKh(pb82WG~|X zLpKQN&4<`5^eN6#47@q82zfNspj2lOzKD3%Shk-X=G*ypxr>KL8aiaS_^9vf=233) zxW~*llX{cA%wPGA^Q`PP+eF;@>=YBW;1a#05m_i=S)5rc$<>fqQ}TcD(F{@>TD?o) zfLaZtm;7Oj;HM?2l40V$!uEVKk~+c_7pa*+PJ+L~_s?((m6{Y0gn#iu0ygB-|Nqej zfrVb#=U|7a01N5vi0C8`{7HbrQ^5XDD20tj98izGlM%@XkqFdZiJ60w*yamD`OoOkn+AiTUVdza4LaHX zs9h)E_Ems5-lBA;7`XRGmTd|Lo8BWXcYmxTwXi={CAY?DX1AtffcT6L=^a0x8-Kx9 z6YMqqDSqxY?h1M>_!w#o!m=z~jP=T`8fo@vfOl5uSDT#CsRK?fXp|sUW!x>GF;G2^rRLS8VlzbIH zv_nisQ!rf8x2_o{*1E&k2GPPnU$@Vap+*KQTw7T&_>C6fw^NpyRPvx ziaJ$?-I0v#z~{F>ECLHqTMfjx3y-m32cIM4hMd19aSx;c>-XRyvooj^2DIRYH zOMX6oj6UmcKgwRL8Atq(az`UNl$oy4yr5+n1#bO;Ai49SrnE~SMyV%gXIhj`leELn zOD$ZKZk$vv*BWpYx!2~{SHQaf9%)HX>iES7&6zF#eC$Bl*db5vGXl~+`Pe+Jk~67h zBJ_*N9}vJ~ zr@YxkfNN0Rl9Z8v-Ku(y%e*|fY*QGe*axHgEiCKRX#s_u@PpDZw9VH#)PPSLZEH10 z`#Bm=mF4+m#8q5=-E|~uPd~Jf>N33KmtD#2SZ>8I&vP?rjuZKzW7aOP=ui(qaok&i{Am+)=NR34Q(`plK)u3ix#HFFFf;rkjOpy` zxb(H>QRCc{8r zKZxF6!9g3WxJdj3^d1BLgKZByd&62=-EXRuZo&ZH?(_3XSFvt~=0{Yczv6gD;%3fx zhBa@AxO@rF^z`Q16JjjgHVczh{7LGSYSxCrs#^s2{YcG*xAeWfa3u}qR)Mj4Wau;f zW4~)ezcAdtqj0MI8ZYHcCQGWZerv_AM6n0>ZevLM2rIo21tIzK$SA`8st2kWB{NM` zG%7D0{+VLiNVIO4tK9nonvqE{yvz>g1C`L}bixQlHQs}Xc zTLyAtAZk4Apok{Rskws3rzE#m5umk|~`9zTTFs6FUb z2ws1nm#=4P`%IV`Vksv*vrXC4rjQRg;zZh|r$*f2)jSakitfP|gd4S-D!AEnaXHcF zDs?YjJ6GFH0@~w`R+(QLUXIqJzIRrq`9!8Kbo>SPmwwR5#gD48L!Ea^ep*HIM_JazkjKq0A>kha<%uu2AB}(8#hCdQgJR7Pa2^C7V5h2^#~Q({ zp6l?x_AyyAXWo0y}IS0r$V6_%mxOEc*(HTLzrM z!Et~CRsgTzxF9(z00@U-=Q^UD`6Z~^~q_Z0J=adovS=&Z`kwLRWfR~f}kH>d>0tH=NZ@^R=09ueib&0^xFCu8}{N(^H zub+(S4j$y=@_y!{hpjtzy-H`B z>yPw{N*!d2OxWaDwE{Kfj~S`qLKIMl&5v1id>nw7l~t!#y)PSC=<;oRid*`KAwR#D zs>xMTBEurlt`5}RS(xZm&e1<%Q6rJ896~1LG`ZIyF(m73sSXU^i#*}*wsRDRr-gn^ zU@Dzgn77Br;`HL-c;jz?4xy0njF6PoNPq=}~WZ$MZDtQqs8%4+!7@n-Rp%aK;Y4U;sK!LEpjo$* z2L^1Z-t`g%S}IA5VWM-@kRMk&4AWn9(|EkIP-5u`uE3Nfl#F<*sUv#a5ZUupTp;DE zVu-9lB_F6HA|nn=dzIq!D`a$;YZM;zVm6LLMM;x2pDcN()uOU?)NzjCglbxbi>M z7IH3mGfGGn#a66LyN0co5P?@a^0($19%JCKVJKPc~fyt+JS z`DF}pxs(CBUdlS<4xdp~j!BHCxVDH$plL^d%e=ZbaJ_y9RWe)VblP54_})>!x9;A@ z!(ss*M%@^=Y7bh$@JD$_xK74B5!EdE0 z=h8mzE1L^{_TMSYRy#@?W$hNqhjqA>xxAItnuva+TMTz$7JJmC<(u@;wajj`2fy+_ z2YX`D8^+?yMVChJbTxjRY_Aj^EwYZziE7fkGO-)o#ws<3sVzYw2vNonboLdG4P?dkDY&ij$_nN}FiL@P`KyoUp>XHa~sl~bZPslN_l=cp zCi=(w@`Nw(g^%Qh{=WQXU5pVH+Aq`OuY5+WYA1k6R%5AF6!+UZUX*z$Ll=ZMBa{B8 zvpSBTh<&azu5mbflm)BaWCIv_HGuwr}kWjB|^Euiy53IKH-%DBlk-Lefg zjj=XF!pd*NY`q|t_6DhfFhV=7P*8;yADAtU(2UD2otsyz**1G>YFw)0M8jgI-e&_! z@!J<=(^{WT>_A=ojy>QrFd;b{u(IM4!Ii4$)=yyF1*>8xgxn*4*z^jPI~$06AQ#)V zbG|3|XDYVqjm#MXV+p#15x@PPsn`=s5G-^0l;*^TOzi^Zo-?6^KLFTI*~1Pq8D(qZ6*qR_NSp5M21kcpM{qKUD?bFj8MycZf#za9!f>hlA zuAh^m8puFJa0m+eYY56O0M>I__DNQN0VK?H0U|-(J^U+&!0hdwTci-d(}QQZfMVd# z2LLjtRo}rKcLeW`;WwL-3-gT3#MESKPDxV}=SbW<`&cW79>In>d)ly2aoJ{8hmyHT zF79e5dL+MJK8Yv)?e`RZdWCMqsH(pD$I-u!(-?o>=u|%XMRlJpo7B#ROP5AEmIs-B z3i+LM))N91`}45$32uMjwWCIqBLXFw#jyoH$bnzU!_C8G(NlNZYxPIn>6Nna%&#jC za8R#5zrfOFL5ar-AKDrpnb7)9?ecJY@8{;&{1)XvhhuYfuuruI@7|vAG$x7REcn`g zny#OXvPb_PJcUBYr?KM&St-^GqdcCX^t9G==pY8*m-VYh1-|$#*nBE-goHsvIOofCa6kqpG=mmS({R$GuwYYN3}#v*1m-MwQyxJUr_AhIUhYSpO&jWJK!EH zH1)fcWhk(!_`?HL6V5ahB)+`DUaBjcns}SyyhSt=0kxHFiCe2Pv)EpgV5Q2G2t?~} zPylA&qr{YP^@o>3C=(gD0eukHb`e$3z@u7=$66|8Y6{=$)q8CL@A89B9)~ExqZtw$$q`lDr;)`Ehr> zA(op(^DzDrz9Qx_vDeqZYcl~FsmB`q77qI1DzpaLVnR~az3^Wl_y+?-07@!mX=8JL zE?$3-tXc%SYZUPY0AI(t0mO3NE9qL{e!4l$R1O~=@D?GZT7QU{STrdQyt3)u9S$r;K{fh|enp@#xCR z2{LOR6RO%1W{}H+vkJfexm8o>)PA_KK~qTc1Vv+xo*%O5j18(jbbx*^b{eN$dM@)> ze+#C8yn(I(`uj17JW?=g6(C zsay@m4%${~qw5kD`3F!Wuv4|98t>6wYlftvVw1kay2IR4{=ofGd&fU1xN{Kc#Acpb zL3J!qr0wJ`FzjSDWoLSbpj~X|uuO&Xn?9~jAPqfFozJo8T1&}F-sz1u?M_tlmzIQ} z4~(0h=OJ^VRMME2nr-{Rqn#Azzz~(&`?^gfsN03mXUD6oH+~?nN(9)i8Wr?Q%(GdY zwXLl$E&r=-LyZ=~=^RDVkl?4csyL#EE@_M;=BJd38_vXpqA^vSf)@sWS@{p{KZgud zKE1tzPc$nr&Zd7q@<&G3PrU{Q3GqJBU1n zYAT>*UD9hsQ1EhJaQTlPgY;RiDvl0^u@wJh;VI_HpYuHLVG^3;X-hqakdzQ8oXVd? z_+Y$G#1T4QB=JB%_bO(m z0QS2cVX}bMw`3pi^XjyO({P(XR)~6yY$HbgMoAVeP1N2GzFRy3pF2q%Op+kW7Mx9N zz6rGZWIszm3&~1@AekgR53MA~c@n8xvoB{8b&XlCo>EOPfeN;!MYsI9($|U!7owFj>#efzP>f zPil*V4rZbhqxMMd5L~bigcN%54~#y+#k9eAdKqiRTYAI?Ob(*$8%i^VuVthh=vLKr z4i+4Z)8Ro1SlHuWa%3PeQ4#@s@BnOvdGy~q;vq0BkoCMA`wx16XrTfB{0BHdU?73> zU(7HBt1H^XLTC98*CFhvjVF-=qy`%p@@y4C0Ca$4;R63%nuYmPgt+4aQJxVGOgsGC z?g?PP+{r;&iGcrd9l|&a$)DG3VaKQ-Jf9H)J1*_unU?VBRN?OjRO1q8OD zp8ee9g7yDvf&}g+K*xl<)CKlGYiBoKl7VM!fmq=B1|T9>T>`cS@5ThX7X<^L?K1#m zFGqZ8f&?bB1mc7H2+?UEm}bBq&kn*GfHV-8qU`y`VdY{p;6oeW@Dnt|v_+u-&k~`( z2H)5M$DTxm1~3r^F*&206U(H5>#Pb2yFop zfj@#^N_7%g7kpiTAD*nz*=uyzaf<|&@&NWd8Er|!t_15D7DUJsIQ4u1*au7l zVfO)kdcN|7A8_Hh-xg`G#xMmsc&Zi+84Mo`{Pg6+Wg7O4JUO4yM?ryH1q1V*4PX^& zKc8B_UeJIy1z;5jbWuRWXC-VIa&#()&pROK`TCfsurctDI|xZUu<2O_E4q_^ z@>Kul`MW>@ho->35cMP=G01_DPDR{2Ok6mWsqjr|5gqzK%iI0=VbgajwUEnFJh8s| zb5wa`$_0$gVoWQXRtyS_i7sxtZo41H37|jsA;3+*X+d9?%1r1*jS5**kuo{OC&4TWbzRN2R4V@WN z^-$^2OjAcAC4sPQ`u+QoNw@iNlCENQ9%-E&>-CBsCJnPArp)hFU{nsbMEUU*EQXEd zTU_|DRcRb?9o7|Zj6`1Q5oO)};`F1XPc68-GG9%ML={pfN-MHo8)z-6Sbw{Gx06lNVc+`#kYEmx(c#vn1LbE2b$2rd#aCJa?7#?E-?~L)#@CR*Twq&zqaIQ-0tKx ztqben+5G&m@%*v#DS!9FUE7DNn0;5E=+uC-oguz&U{F>N@}SUB>>+>WTqF6C^>9Xp zZovF{Tc5^dY+k$MhDqg`?zhZj9f23Ca9oXf=CO<9YjsKt{~Hk6@z0oF2*Z2Z?|;Pw zxZGiV(*=N$RX;#&!UF+fSUu4)EL*_C_6WpfAK_uGCcGLA%O2%V5*y-ch@^&BvwmoT zoct^M=WCbZ5&NOhbSJm=Ii;q7$A@nJ%-y1zTjBTMUcA7BCDZ=T-0eSQo?vFxS2)k( z4>l$ULApm?Bzky%O_UZ5FB4Bn+WHB@)0z5xv6(3cUAHkCY-m%N#T>^}m0!#l8V->t zby>E0Zl5!ima@7@21MJ1Ap$3HK^(4jn;7QVTR7a0FDK7ixs}E62F~hO#)cIwui&Qa z&(@mv0%p$ggZ}(H$O`V*hm+qVRg09o;TN)G_E!$ulSU2eri)Sa&QZE zq$np&mRMTBuf-x=a!0z7rtv3?0OF3Kl|WQ)%`g3SrJ$)U>P+cU$UASbd-ic=b$=R< zWsd{Be-0nnBX1EVIq_3+h9a+hJJcED@fsSfFnweDMRl_={B%EnyvS;um&*nX-tOqd z_iw72COhTlA!y~aD7y*bGpakn*+Qo1ZuCc%D+hwz5Im;;NJg~s8&_zBAgi%oH%(=IODE(qrQr0HjAuh;}uL$ISw8x^F z@#QKj-P3-rtf*W`wQR;3sqJh_B`N?)Q_ua7maUeEAU_HY-GaU-T`uN)9&D`i@#bDIe1ooAj%KL0yM-zGY+-pLj>wN3TXL}EF z-1w=BDH@4jdY@qSwb(!NsRC$&-}`f0+lM?o6cLt22VG0i>Q5rgx1*zNVo5JSD?t9% zUBWkvIqj$qBgS8N2I53i=;$b3SRq&3LQgRWofqzhl1OO$D*}0Uh~}3Cb4*@Ap|Yuu`nFAX8dH&&-j*8 zZaggV{i2swr&ZOhO3{W17v88Z=*xG5O7=&wy8Jagm>`&ZEefa^p#HNsT*Rw<^>(fljSv6xf@c zT({XWT9j13wcA&Lv#P$s`Jl2uG**1$>xv2JQ2oZHaaYV+5YMG_R2^JHNC(u;wb0m= z9#O^YAl2^+9BRK#$kG(<5pWBZUe^@(y4dOb>b*XhF$(Ku)aLayfN%*E6RLi_@vP)9 zMmod5RIbHO_o?Ichq>BCg0l{&_f4^SveS{;i52>x9-vo`J`3nY)2j7tv zTo6|b?p@T}nrsUMhhfinozZ_sn2|JEmV}x(I@r)ej4U>SW@q+<5J{HK>wJE``V)HI zT`wkZc6RQzY46$FSgcV?vcJ(cwy93>W?`2EmFx^e7J+1Hrc|3Rh6^v7*b2UFn7mgZTAuScU8&H!xl|J(GepnAHy4w zmqTxUc3FCEIO!nbxUCl#fST8C0$(`CNx zwnDlYZDm2XI*5Og_%76}i3-QZxF;hOgF~;12Z_+PBlhQcf!dU(^j0u zn=V4*-EtRrbsK|(y;EB|ct760RNH1Z{yTp0!!5fc)8SiAacTKEzFj&b6_-^$7QJpQ z8xP4thIDJ+gZPS^+;#rmh*Y-s9eZI^=f)t|p*Say?m|aWw<=$6c3_Rpu${SB=A<{e zp1UfPKh|v%y^$IuBlfmis-ys4v|E}L4pnpCXqAVv3N-g1Bz@~w!38`KRggflKtpY$H1a7O>I;@FpT(^}A}_U6r*`6l0hwp5!NiuK#OI;02K`R;iLSJaiEE)WA8&j2fw{rL@u@LZYupN|-(r3D4!>Jb0!z2#N@ zDvV4fnM!3Zi9&&l?MTsYj*JZVN_*9s&w_Fpt&1cMfw@S3W<5v@@2ImeDDdk_rJab3 zT2C`rOHCx>p*LsQ+Lt>%XD#&3%6Gl{_U+&LUO}kWC$T$*7YTl7z7a1f!;~cOy~X#N zzBNy4>F)s+@TcnyPpUyl6yDj}7)cR$8EdpaR z{Uek+$%1z?M*G(?6%H1o1dD%xywO!}w+7s4b}<&BmlBJcS`&Y=81t{}-QL4vfu@FK z?x9h`5wts)Emg9h_e%tl6=UoS8(P89y7#=&_%gz+y;OYO(Z(ROPKJHp8fLVSL2iO( z3S~oUFS3^8zJ$4vx4ky=co_MtR)i@qQ0jGLl?XdpICIgCfZ!*de36Rj%+f!h<#jTJ zZ}EOwx%g5eOaT!cA6pX#Ctjmw1bCUhI4!ujH%_R$C2l#*#R)3p=&@S%rP3D@8tF4XcV;;kD~10R}t3LuKf_UnIql~ziR840~Lzo#fp zjsXypR+v+D1^jVMm#zFXy_C<@G`5`Oe@OgRd7AKr183dG|V`r4zmb^)eX`(^@G6_9%-g1 zBG#$Z;t6d&_`xbsU!P~+7^7Gvs`P`e5@x!APE71dge6qrRc@a~+BP8RI+>4jl9 zlKL_qe9PP(bHe(2(N;3{lXg|Aw~D^lpV$N;1WlJ2r2o4JtFap~d&vv+Nh zx#BC+7h>4i-e1Usm}g}+n6-4QUJu@{|GjZK2g zAyzcMP{RA~UB!r|O~o(m*F%pA{Q>TxDo)h>2nC}|k){{;aKtklHIi)Qodg3i#Ktw7 z*zLH5L6&&Kgk>J;qk9+AHPy`Pgj*}3zkD-*AYI(9Ezfqz2xdHE1U;=DZDa>*bJR(u zhzsY>%pjS@sZiwzr=5@Q43;0$(7yB{l9xKUi%6PHyy@lS`ea*BFG~1L9~+1uMYbi| zt`L!jw+au@RH>dj3~$|%?9mnYU9{zVFxhmOw#>}DSI<(J%>(is8`tbKGth1H^i^0s z2BpP~H+{AV#5(8^=Ar!jJ@MQQ0pc}qEWTJY;M|@bLejex-L>h8cB3||{0W!cw@-4x+_&gMm6G7#iV&LQAq(Zi#Sw)IC z_bcLd9(Aa^v0!9@uY+GKA_n!bQ|XT#e9+c_%&<#yzu-Xec{XA)vp@VF$+#AWqN`jP zSBc39rmRU8_B<6?{f2gIiw~D;U+53Wqsnm~@!Cj=y(8XDvNIeZ&-67D3zu&O`1g}D zI+@V(%n+a-EkledV^+Tz5wSEXzm8s(katy*F9-wUc2A1-VL4@WZBhDX5`6eGTn93> zEmt`8Fw;9ne0+buD5wT2JvzVVJ>UPFX{M__oV=lV&Kv)=aGIbZv1Yr-53d{PulPQp zYYi~Z^mF>*N@xzv>B ze{oji3kLrEytyH4^o!-{OJh`}-pC^;N6k@7vpm(n%A{nHMD5b74@?|fy6JR>*bmWb zKh#40jc)-h(C=47gLYEfk+CC(xP8LU4wpoKd?Ds|j>CTaoA0W$mv?hj$|<-~fIi8r zH^L0}5%^bXUs0oHcJEr-iy`A-@fU-huhM?f#P6+ly{H#?;TskNJh88Ej3SLdy3~e- zEmWxy?q*vZ-yv=4Ko6b4)xBs%q4rZ1h|oDUrP8mudhwTvdZPR^-oNJ3T7 z%h_8K3sU%`f6IL4NIsf&2+5LA^@8zVE@vyHCYoRZovDHrnar+pbzgZlkoYb&AR+MH zcxNNc%f>Y@?tJwf7v_Ahayu>tS&-X+j^i5~-8g0WUF%T_QkFOf9+*i(AF@~Ak8v{l z(f&Astf?_*YIfdjn>S4F0aBU}x6ILE7*+{ls1{CX8@g3LAhY*7Z13OHUEXN5i}?ZX znabH48o9o1)}uE^198zuu!Pgy*kt+XpxU_rV?>^~<^%i4%phK*RL5b^rasz;hos1h zt-hahx5!@KBIo}fTW=i|N6_qlCpawbp5X2t+}+*X-JK2Y?(P;`7biFbcMa|mGz1dl z-H`j-=bqnr5C81cbXQMT*PNYM`unL`dlx^&uaF!$qu2cK#u~gc`z@dE*W+bes>hVR z7^C$E*stS`_f>Ms51b&RHF*tXntp`iRyAf(#Qt>FLsX0WNU%F$K}T<_z_Xd=;=n4o z)2AiTgw`!Bwx#u-X3I+%Z~(qJWSwYbq+0Tm0(z`n+4ycgD?ZtS9xvI(9j1Buhwb8UqRa%zsP_ zzA=-<&ubEry+mx`EY-90pq6)TOel>uB|cBZq9yROz2~y=YVJ3^(z@9dTPD}Mk;FA* zHq#DY_>i7?P_iQL)fGlX&4;E~1h0NZyARZ>;@d%ZZVR7a(wbsWP;SFhJm?n8R;3vp z%OgcnY{F5+u_yDr)CjfQ&h&v`ML@$|?Wnt6XrRlS)RMKN3zk67ZP7&{D~koE;KDtlS`G1`4~xK18NgITMXQjuSNOa&s; z^;i9jvGgA_#o(RPJ>wqEo5^VLt?570YRL_T-_~v>z}y@yIyj#9%ahQMY#W zEj;Xp>5|{cZ)dIJVbs}k+>Y|3?nM=Yi35 z_^G=550=FBdnhdUR=(}W`rI@fFcU}7lVQ{ii-X25VQ93{!TakRU-cE5AA1iXx-}xS zOjdXG*Pd*tYK!yBy*;OlFvX9EwyKa^0+EW=51P<)&bp9dMn6eAhE2DZ+Xh# z4T|M;1>`sD+inwyVtm0`{3wRoKTgF%oa6o=+Ptv#6zx=P$Uh?)`+d?zF%AQo4ok>J zW9nYHhdOR=#YU!GuS5j*-7_w$gzEGT)!w)I*SDy-?R7rng}oZ#_7H~399Q6b#JRbN0?(a4tUCNi5LqC4=DT2iZtH*Quf(eH<8Mv^@iT_BaoIBo9GS) zlD#1w9dhX7AA_ZDx?5PlU$7RwoMFkD8RHOWhBXS#5i6P)qN%u)_pS+{uW+6E|H&WhjL84c5~!BI#w>go8)u38}{h=imYsAbCzL$x?!HBT% zZTlpR)~YotY?*{^(K)oO#ge$lHMXiXFOV2DRwRX?%Dq%ZN|>neNS zB`K$A0^^z5MXLFu@@BDJydk4Ba#bcJLM0>E+E2DvjXFxKs&6T_C*^ec7R{EAk!)F+J8q7Gd`lDLII8GM}RVnVZ&rGgsO zl7owF+xuqeE?VUpcqaLjkm>8Rh}<-^DYs9b6#{F%+Zo6(_Gh_;b5Cn^()JPC!w$n?JLHnU z$N#A>7!Yiy3^bLG1wt+h=tjC~)e;M@Bb*K8r*Owd-Zk0{Yn6|S?Lkm5n&E%<_n2Oe zj!tb0k-l?m(a9G(W~E@X6!Gr+zSxoUd_xFmxxq=94N?d3<76A)9B#pc-QDkC8j!%xa^UZY*J+sz#vd~vfl12y>}84Q zR@3FPTZ6(C${%xs-(@z)eu!rzq@A;O-QaF(fcSTY(9DW1|D;Al!Ny#qtoGSFe`M+Z ziW%)?0j*yrFT+PoTx2atzA`rxpj+FX8!Tqc$%6G1fgT??~^ACRu4BtyOoo1q3gDthGCK*1eJSvZhv&oufSmJF~nLBZ0t(Uo=}~ktOY}(j^MTAh+r1Qf#kq z^bb+-F`M5|rSlC(rr}6p6j;>k^_L01_)qLDD4wH~ms=fRzoNe`4O;R^J#X}_Y+;UK zds>8dtEe)XkO3` zvF#%htEBYMcv{qS9ob z<1e*FoLkSuENK4<+XU~aR;+45p5JDI6o1CwKT#kJU@d)$;|kWGM7xh894$)dg5}03 z9c2g~_2=M8DUwGP#Xa)d*mX)<-KZ6ZYVVy`HVaG|IEW}oCrFmC9v)8wbaBA>U%0{n z`N@Kc_pRiy8|6$15q)**PY5l_D6lzNq&O9b3&yTx6cS)nrY+)^R|MI8wW5l>g##d2 z1WWxQIU>i%PmlJ6;Y8O}wiu%KG36CXi4_!FUGi3GjagUBGi$m_DCOrS6WBPktM}=7 z2#jqcU<%ci5<;F9+`>+4j9bIYQ)qdBR6Pf5>o{98<)0eyMch>{fUuJdr+Hn#CtKX719S z9D1#>3MI_xB*nwMmkmcTpw=ozJhjFRvGcXLS(seoTQU2|&c6DA(XO#VdX79Fa6$t6 z$>3z(EH@tRJqYEMxC9SORnArl(Z{+1?Zm9F9qr7&QWZaOFDx-WJedp$(t3R zsDfH^ zite18QFVM)H|&30@gg1fI}S9w!zicsBlySrGSBw80;7q9s{^p%!KBT zJ~{#8*GW>d{;EOYm<$H$AXB(}PpW-H*KUr6zErwV*u%4&Q_mN7clNpF1CxHS<^9lz*V&G|`o)en3n?>&NBxuvt&e90LS5rXw&a&3&ae&EA~OE++x>v zta`x^SoQAvV6~;fWBMKR_(uzFU_B0@P&D@OqS^mKhr-`K`Ke9fbx`qW5G90E?E=j> ziGI)Fr5-sH9X%!wyGElH0eZP<$m-**&l6JDAk}_SY#>MA_V0H;d6%Tkqo#kMj-TVZ z=4V>yY<{eaG+dk9s{^KRM~z}G{t^=_d-0Nt;+6}oArh&zH)JZz)FiihO^ns}(8Z>` zzC5LstFW~xiM#WTC~1D&pLds zeX4lzeuc1qAqLs`#PVix&n{RcmT>ndgZe8&zF9#}C#14tHJNYxdJWlHf{9~xa_cWj z)zh|7LxL+Yd{Ll4Hq%t|d)b@t(K*SvWe;e1!R$b0mPs~}5>Nl~T5tD)3ul|o^$dtI zX9K`aK{M#53M!`ufM%J?%QnkABX8%MVE^auc`+hR2}rtik@H5BixT<>G_jD93Jd97 zH{r}=^E@2AOGee>s}_?QOLjY@6Z#)hTiLiw^BWv!oc^kC(GLxGqJKT@ezIXl(@pB zWZ4C%JB&6=?mhnSxL^Bb;J+2XPJ{+3DSSQZgUYDe!!^4~Qv6o#W?c4l`KB(U1_M(h zZbRWX-@@;sN52pf%pG~f^r&TJMu780ITnk4La4G9dN7v!Hky!^EwtPeKDgPTd2E!3KPJA(%nFnw0c&18k;`r4 zgCs_d6=rT1QOB7$6@g2>$dI?TeEkru7mZtKFACW>J=p4mDq_YAC_#LP3&>;N*`5bkF5C41x~EU@k&mM;_P`gD*W@Ker1M3CZ6mSlTGruD?mNJbBV z^n)|>dP2>s#*{;D2YCd+fFh?={exd$k(AqjlRx3A^(i~QH&DZ@n>f9SUd=T6ZYNUn zd86lrlV6zknRwIIv23xisg1h+3jh8XJJ5z}2E&WJgxd9dZSoKqtE z{*%Ye1%iA}+UK9BF60Bob*w}l6IbQJ7+j(wJNgomJ1sQNjNuB;a8KEcmmCS9o=BHR zz)!RYmts55xPD&Cd|lDhNaO@DK|o6Gvxbm8Zrpd-$0w0@cjUN8R9w7gR&z51HFEWMz82kPdcXnq_4*q+kTY!-`0;9GHl&KvnEmx-A&|ZHnCU(>l6h=sxY`Nv(=i zhm7a3;?xxiTV7+})q$-Po=gvuAamb$yP$0Bfw+OZa1fu=?LKYatP#4 zp|8dkWA&61T=j9yCPX5B@21GAkCFj;Lb#0N)i{03Z6ON*G;$&13>oEUheV$at$~vn zlBkC$H9STcVZj}9(-620K`%>CM3KfM#zc-r{G(zXN*D?(^;68U7VJCp#U%?$oN2>O z4j3A^q2XDf;luTf@ag!WbQAqpEPAUUi(wTl8pWtoFo#A=9@41=y4}Pu^DSN5++3?E1tHtw`7Q%S z1F5~|AQy~>jcD2X5WNzTE(R80`5~frlx4)@`>wCJLmx3PH5FAN1jJw3b7LOaHz20_ zIlba^1W_En0_4}Ddo&x zlU~ajhtxcB4enu5{V4^@8(}NXg}Y-A;XJ=F;R+6!#XTiW{7F3_hH0s*OcUNC_-)?& zwB!~KUl0)f9zU;q2L_4j89_84w0f%`{wF6FS7ia!<1C(68J@TzsxolODtzdQ;=XuU z4yhM=h|Bar0aMVZ8)%XifIc*B@?ehHyEpei{?7~UQ2t{8)z1vSUN*{)w0dUviQmy_ z2F5_|H_5NJNawrc!+daH27H-eHp@e<-e(?(WG;&&3EtStN*Z@d6YS!^L1AhCMnDr0G=lmmqK-=-6JMJnBL9DCmrK6Vux=fk~t zF4MjG>qgKgL=lH*ALY{vY5yykxR)fiQcSvFCgnNIjVEq(WJ4D4xGs{Uy*EkJ{1&H9 zE>MB_LKPJQwn1nfF*n*;nI+kc@i60;Ymo_~Xr0s#mH^77-h}>uQsor|{E#OJqD#i; zAb?xG+2;YcZJ<2#84oC&GRhTxQr)X1@(==JG9-gLWtN`hNrXN!%ACd7OU(;cHC9^( z1M4NDB08!ihCT_nAXq@2?CB z%Scu&XBb*{4_dc)m!6TE%fQJ&EoT}UX9&O;6(ySB00 z74;nEkEthaEWZ)@ebC7Y!8c|UY$HRhxaYoLNFyZV5LDzKQ)jrGus{8H+|8?#_vL}$ z3=9oG3dDb`ddmOdWI2|bqTN=$MGq`Cln`KHADa$v3}_u+FcX{!*t;}yje3ZMfi>x- zR5%rReMSW4@}vp1CA{;k|8^I2CdWh_7g@CmaA4jw*g(Yqi4WzTL;T7V|1~5=PfL7Q zG%{H4hQAbm#P1b@G+ zgeHPuU*WhW(*8R)4fs8u`O2g)6O(gfa6IOhJDUa2AU+C&w+dU<8-R-S8WX8lybEA_ z4pSWo%6LF2kISD_yLMH3Qm7Q|i19s%l8L?ie%Q@R%X{swdD~;FcE7zq>MLn(h_3x( zp7cf!A>eBy`3*Vx=SXT*#MHe-Bw&%1d3uFLUam!8^~Q04ZF)CN*(!q8}-6kh5K8jdJc)Jbg{=I?D|O!9FWDUAfy zxR2(9(%-nFf=a$6IhJ>R>e%R*i5@DhCDcC_m9{E9T6bxmSRBLb;GGV;U*1QTkDK3* zY3o`anlJ0p%%0-sr;IoAu0pa*TvToc|BeVV@kdCl_TW#%4j(IeDuKyOMg?CW1uw-a zu*p`cQHS-Gmi5+#^%fsD>L+-Q0y7=~eICC)-_a@IC6ive#`KRuX&~cd@Z**mbJKSb zw)Na((sg_0rrZq`;rSh8uFK!_l!`|sRMUr*)i1%kK9A)UT@g1KU8Dwn;%WvM$;*-l z40?W@nVb6;%I&d$AF((a1gXmWTVrKjz@GID+AVQve|D7~UD!W6KGa`}$8tu#Lh)hC zIANshT|05-!7X~BFYM8v_D$BqgT89;Ax-tqXHW8FQO@$zGWzuB9-N+@mJvJ=YI?G5 z*;}Vx9%oibK4n&wS5CZ7^8;bru(yZ)7MC~J7|*(n_*?~gsfwplLLVvlf1S2km!?FZD}sCUtH0-KABsJ$J}HebsCiL!PZ;+oyg$O{b*$c{b!iXZVWpce70Y6~lux$-8%qKL5XaWrS#u zKY+z`-hO)OST7E&$z0>(b6`3$QcEDV)Le>)>{2W#?F zmz%J-+J=*11J-*Sx$pI2xg~1YSi0ikL;8JKSe|NnGeS>O*<+lUGlEY%z==-RAMHnZ z2fX9i;rX4v0^X%l=fgr%FKo~3h$V`w3IO*CcH;4_1ArBt`Ky*RnD#Nl#Y>c-{aI_o zNQ|LFob&Zqv5&e*(tA>t?B?DDg);yqH>9CYGD=^RSO=)+5p>wGa0wgZRvK%aP0_w_ z&@VMWVIdsdQ@}h|K1<#YqlZ7C&F>z(cnq+1U<`~2u=$ydmN3>Zd=DI!#nf=mO9ghW z#+GW8^_83Qe8KcHPXYqI0hQ{F-QKX)8F`#3mEi8CUJv6P$NbEgN;!ox79U`s<+f>gr;2+J) z!p5%DRW3CmkL@MYab+--|2SOF^*mBTp}TwAktpHq4lr80TVhPILLq)ii$WhES$ z$?)J22y70czw_s({JMduUff>37O7UP$OH25FFH~_yG2$M6rfxeq`K#di04(=`VNxd zoVAG&o_=&zf*V}&$pftx!viJREqrDokRUeQ8*P>vloO6(%hrmeJLnSmNP&0qpBQm` zX18CY*fU*yWju=EjrdOOKoW{kC=H6bA)>52|4O_`;zuLVe9 z6G^ah=9mebS9$lG9sO~~rT{v%O%pa2MREs!(hZ{-QGNL_F^$KFw2ql}C}T$yH%w|V z7o4D$=n$Iv*teV(QBF_hP^!05xQ!=6`Fld`TMYZ?Snj9VVMd7&Tzu9&w9qiWgbc}V zo8Re)zt`;P=#3;L?=C5A*P9QkE_|X2%|jU?IiGdz7W-yS!K#MTjSvmAh+4stuqjwK zt7Ky>omyzX5v!LqF-5gSNL8hA`~YWhGHD>zpg0gf#1d%y=!Xqq_EpL~Gn`>3_Dsqs zVl+NEL076VR0tBKW)w0XZ^6syU0R%R!xy8{ zbggV4_UXoqA7huB5?yM*#yfNR@2h}D_#D{Mq-U;OEPRK#Ynd*aFM4Y@a2X}P0+J$LGs|RH$ANW@F3}O*>)Oh&Pm@$Y2jc_hwf5TjQpzpp zPF+t=M)Dr-_oQRIGsF&b_D;CFn1(!G$4Y)8^eUlG<6 zZL)4_wUP3Jgk=+5UNg#dIL1PthU6#Nt-c$Jd3{{VDd>*=J}2fG2EAXW+@aHnE9nus z66{k~nv?gk>z@`y(RlGch7QVo%k69cT3 z++IuA_e4bC>gAXll{=ei9&HuX@Q2CgBsm(R4_Bf@f=R1|E5wLpztai8waJhKXRlSC zV$8`DlaruYfvX_aLkU599om}Nm=Fw)fr$kwcs#U(y72>q0)_Y;oKFEXXvyfwrM3_1 z0Z1 z&B2KfsX(ir=m~`eIEqXrwI#=cYW>;H5NtZEt%JU94b#}wY1gBZH(_yDTEvY%T|_?r zUY0F;9+KQ#n!Oe#>SQQ(eAO@=)sRq~zjSpK75N}vcOvTP*(~UwbwA@xk0WTg{Q3%2 z&!^y&%_hEOyn0RaU`UnKl{cX}qoqOyU!)G*9yQh(YdV^Tmg7HMFCqR-8Tj*@$l{tWP96iEyql7-7lTh3>N-Fvstvn+TzIuP*vgO{9h(xFb9o;)!^U zEYzEVkbWAtEi=u$6aRpb?-2J9C{YMUO;6c^tE8(Syv_mRnOyvX{jMYVikeV7aoX8r zlKR_^{wQU&GUvEG0kun7J+`>pjuGcR?$fauC;TBKYrT}=Qpv(fG%v+MXUzdzgN6M& zAdh14+L2uG32xfhZKEkQ!H|WvM};%g2kubR%kD3HITDJ`+_gJovFYqsxk17{hRG88 z8Mg9_`Df%XVwLM=92Hj|k=fh*f6ON<{@$=InJTa{yKy#5oW7VJcCH`WbIlX3tk}I( zN=Hjsu`Pe-OBOJ5(E^KwuAaa(o`1I#z@`mo6t2l_$Sw@c}dDH*!4GcP`=yuoST zBcIp0b;KXZi%{=scH{FYI1VUt@&)s9O2E+^m7LsJ?Yc8;s!p6@Yt6sH(g}ZGJ!{tf ztIxyipgIa;f57lhX2yfT6)E54;M1mb$FF$od&)gO1VX{D^67L$HC@I{Iw9CC=s;5f|Aa0jYC1t`3nRxDj5gdIaoEjt-O zsF&!Cb&pK|p$w3s?ec7V!OSy73*YZ>r8G5eNv`p>BpxT{A$|CbaJgDxHEpQ+gIW<0ol#n+hvQzj{wsmtT|J!-vNKJ&t#uM4%J=N0)%gaq z0ldTYnn8Fpj3XCTI9Fl1>cEEBc=?rderJx>RWH{yt(o#i?eX(A$6#4UQ^fOa&2+`l z4}itwl^{}HX4rEjiz4+&Zc=vX>&JV9wvnS7yE_@HzLqvdT{@JTgpJ-TtSME?&Zdf| zGpf^XOJ&!wvFf0vb1aS0>kBmQ(?QqJ)}wFs(RHP-wWcrU#+-VNzQA%;vgl(}MYSuU zUbWO&Xz|uiWXC=z?5fG46v>zSu~R2lSFwG4FqJ!>p)6D8CRq82J2rp1$bB(CG3#eY z%A8@m5Gehp>BD4<3q_Jfgpzdfm-7~^s&T!qZYV1x9dfCv;^uYOY|ntv6IEGqF>Uk8 z(;>Axgji9#z%TXsnzWT^YyM&l5gQe0eb0t}ADYqVvUYxf`I$o4|L;Sy@-PBJ`Xw6R z1MmRrwO22h9#WgMq{t=Wy{qs?LK$>nDG2f~D0nEc0)@updb1`BPs>27MdD4+A}w)u z)ji{4+Plgcd+;Csg};{XmZz=bg)duEC-{#9a4qT4+jZ%G+0!%4_v_oW;yW$r_=kjW zKWJ!L1ZAs0K;w2XlUR=J0fam7AsriDrx4 z8GM)v!Y8-CT7mH3!(c%tvuI?5i@vAu^DypBslO%)h$+DEe0TD8&)5uMvg%MEzJEp} zD|C5fM(Aotqa5baKtyv`(I;bPbIFdhSoO@0&~+peQYz>S<%NWY@ILAdH(34_@FkDs3D6URX*zvpH zwraKcd}Y0=KvA#IP%19MmW3M!Zrl-l>0_3iI;?I|9Hz0Km5^{-8g|65B!`Ek+id{nbiivjJ&(e?&D%kQ67YAAM= zKpJjAipcX~0rt=SOC`GyPNb6xFd|K82rO*K%E%5tdOka-AV}dFrV`mUAR4xYM~Q@y zsro0O{dT1xpTv=o8@t&|OJH-%ZKt+4KnFhbJP-AcNq|fa@?byqQAg}lzf7?_EoX78 zJ!f?+s)m|^*H<KPFYcpH&M zJ4_XFqSJgmu&{%$u<)YV!KY#d(u?2Dl(I0-yQ`d9f|kFuNu=ZlW#!NY+fO^FMrYXX zd=60RbGPd*(X-b}fc+T}aqWZU7{S}XL0CTn9nc*`0A-LTLap2ibwG*51^7n4tc)Xq z3W~CJBy($*Kf7|^16n7TT@r=ZpeV9mF8&GU9BP*OSOhIPYj(34+KIJMyer?vRSqxu zG4sx>Ux}Qb&!=Y31=^7^=ZwT83I9l$d7Hdn-%DtSgwKkXv3;OHSvysfZi3P=iFD*? zz)P%8SFKAuhNX0nM^}EJRS5paz`A-Dk0ZRs?vuUrmXaMK6ApothIxo@cM#Ua)je54^(+$}~BDBF#Q zm`}-u1P%4mI0NO-Vv6=Gi>=(8}O>Z|Lc}~OYA&CV@(g~W-&B0H?!``nm(zdaaL#QfY74v&VU|&d{qvEsjk(r3}qFpW-B;H zeHC}0;X#h5#93x-rLrgBhelzAJ+(4am7?CERe_z)^u+SNzr5d4zSj4P_c!P8^G#x? zy35e(jl>y55X9W-q2_9Wr}PEc=Jm_&W_`fGHs?vQf#kVX9c#QCJ3V4$cnxBn{$sa+ z8}ysbc^wQf2oTNSHKzW<9JW>Y;6Gd=q-1s*Py2%D*g%u*A%#_-UH|fB*D;8Lim2*m zL1lRHl9mSb>@SqdV+^%f|6(+}C9Mj>JwtTkSIXx6JEatvd0O4qp;yeVqFr^7r?{Mo z;SKWpalKUzAuW!~n>^(ytZ#dA9GopjK?M;o$Ow{IVq4X7%9>YcYsP33|J4!-%Oe=BAX6;M^s} zkKarj{2`b64SgtTJ%||Vm_F5FM0Y`h@g4RR2W>8K{+f;nnq`z#Iopb(8zsppXCcGN z7z$7iBbe~?+$d{27QICL&qH7y*0V(A}> zs-}2sK%c8CF|sQBu&=mq6WYw9#2gypS#HCQ0Dq%CBZc0ynFz{HE3~tu-FJYAZej2P zY^nr?KrZ`DtoEit7ZbDwX3p7dUIOL6kdzn znwk7fNA8L7g{(wU9_#Ub2H8~F z<>KS@lGpHM@}d_qqXR(DC8cIoLR!8yGFJ(vT7KM-e(=hV=?BS`&WtP+o}77Z{<383 zg7{|y$XPLG{*fQ6Z=H_d*V41!-EsrJe^*qE{3U@o?0n34bI<8rMQuk2 zH~#%@(ABXR5#LTDPk?RMHjdKv_u(3AL8yrT1~qyvGmo+Cr7Z7ibN8Z)ya3Qu%@Y=O zfbYF{hLWzTttkF`0&n|aH^%|C*zs-J>{@H`vdh{roPt5yN3mZVoO@0=_cu8}X$*_- z=AE9;8an|G6@yZ62 zYz}JkFs5XeM;$>hF_GBFH#!n*7Rill`Nnmbp~AFb~{8;Lf>c@1lZ$M!!PL$SR4P`>FGp_#)3(Z z`B1}iP;f@WFe0CQFlbrD>Y3f{;|VJd@7%&Lfek{aCRRU2HJ&Y5P(3E;?}}9R9&Sx+ zAXGnheymIB1t>!m$-LM@?(?v&M|f zk{dQ-p?cT1;zdLzOWhUUBZ~W}qi&8aE)4HFqn;p_v#kxFDG5P&AU@IA4~zMT9qjmG zS+&j;u-1B=ZDGxs+xUf5w%$je8zP|E?BG=2L2CknOB-Uj(WaH4jbDfH%y=$+h1}CU z#x&lkn{TXzseK{d6j&$w`D1X{ZrUrMOdRPGH|D*t8RDO07{gJ$z+3Gkj%q*1DG{>l zu1HOs0%+R?NLza8aeHfevgnNqxA!&XESkJJD+%t1Xl$Hhm+Ee$ihU-~ol0tmEm|*2 z$9!jo34(^=0VcX*8`w?_m_j30Xq@30HV526CPB)&O}5^T9l-sY*s+7yDHlW#`FAIn z5zZC)Q2K)WMP7^=LQ{fO8Uno^TG9j+tKXuqZ6^1Domah0=K?QXuW-aZ5RSZ2p8QCU z&(7H=f4m;wTk?dVl;1j9zTi0Lcrw2-O!Ou{g37N96$lt!vaOmhka3C!KlzT1ePiH| zyb4K9&6Uj?Y6MbfXmDaq&^X<=653K%=c;;Pj_gK0?sDgy)>t6q^TjFZlH5WG zn9lly1?CIJF?H-7Kk6vx!T@;~dhqVBsJe!)ewqn!7{LG?_Uca$H`b=`x*)4~47rS` zbUV{IwubUMouThPMvXhYOW)IYxp;r4!>Kj4q&>O1ApyM5Ao?VRqa3b&jNG8#S|1wa z%;he_$@Y9!8LjzP+m+T`6WJZ@&6Kzd(DT;sJNz#3JoKU!7H25S{=%sZ{o+Ij^k|nB0`kQ5b_y}Y@8nCP z9XcC9!esk|sP4+-3=|p+#8n25srNaZbPl^js#Qu}Rc3#>-}6G?%3#C6V>GYnH_DRTqPowRcidfH++P4#Llw`EmZ3d_u8smiX&b~l=q3O z8gf>i-tS~EoNnCZXa#ptdTqA0c)2NytDeYlf1xK*^^e7md5{xFHwu*@YV+36_uYS3b5cwg)dqh?3L9G6wTe(lU`ZP4o6yguO`9;`i(kw3q(WD*G z#(z%U=^s?rmf7Ymy5GToYp!<8YJV34aaS>{A1icxVC_Za7ebjE$hZameQymxZBg_B zi=vU~{@?djX5c^A%$xWZDjk6q83n{l0_gvz9{yjl4M>O@u=q~~{KntmqX+z>_kiWW z%M3{T*BvZAK6ukJ|A%DrHZl$f zlLLVAPoDh7-;v<~6#sMdhUfwFfe`-Dhu*Z;LL^{_&sG)!TsjXQp!?0;o2Z$HAE5GY zn7>Z`5_gc&i-iCKZ!O+TZ&K)FVSwygGZ5H0_P-8b{Wf`e9U~YTBq9X>{TuqP&-7R( zWB>@H01*DKW6%c`z?XlA|AqB{kwk6(y1nVP!6=}AB5g3tXza}n0$)JGzfa)c;Qk+X zV0C!S+aU<7Q%C%#LVpWvLKOf^S+WG6z9FaHY9{?71ATS@RQ+?s=nk-d>kEc?zVVOX z(=*wSsX^ynfdAnc{eutr0%qQ#@b}_C%YJ}_f7kj(O#+L$KY+@BfSP}{ze9t3f&l+` zME^l2!KHg~AR~boLjl?Un!VwWuEGHeZ+`!)^(Nv33*(U@0gV6kmj0O&88zJ{8qoRH z_H9Z3qgIDYuQ!E*2HC~{{)db81`~b5DKT*&01HgeMDge3vY;Rc%Ucb8kb7)Zu zsQH)UZ?_$o5rCC0)dU#&Z%_(&k%>Uc%>c1~OZq?5DtPdXgqZ#f1OWYQ`L-Yue8^a! z);53;A|wuYR*!>#j`x2*rN4P*nt*@>tqlY4q5dBm!8ib{>;KyWd}~wu>j4fXQToRj z2pCY?Gyn{}`s?Mb$m3sII+Fl0Jg96Akoa#N;M@Rb85$%^I;s#dRJxx4I3*kw0r3CM z`YZz^-X;T%G7)Hd8Nl(6koI;_;6qH1^cFzlU)%rM=63*?|7?FtI{vSB4A94Yfb3hm zKn}+MN8~rpf9bRTnm8RnAc9bS0iOQB20j}j{yPC;d5>85Z))ITVnpdZ65u>}hCqBm zcysVJwQep%lyquj#DD0tw+MhunCV{sF@Y0-DE-Z3Cjw>~tRf@MW4?6uK@Pei zL)7@6)m#Ik$Ntk801Bl>y#AMjZx{Q&C(>K!5#MgYw_6o#CQGLg15@6X7!W<)<`1Ur z{_~xlz>K*3Hr!j1{`COLWU~l%KGWY4;K)#_+^t5NDWjN2px|3`I$dh; ziD>hjQj1bJv!6US!F02D_8tur;rG?FjC47-VNRyVQZ_hPrjy`SZJFHWLgC8w zkqX_k2`F`%#BRI#)X@U-Rj-^Ow{}_rtAUT|oG#v^Jxye3D}=uw&?lX3Hlu0#`Zy7l zgJ6}U`+?DBCSzja>#66PoQUd;WI>Hsi0jK?#xhgZ7eB_%bJA~$3`j8mBlBOJ+K|X@ zG}2Qp90#b?IqMl37zpFV<+s$8N5df16DL1GLc^{yhY_&39}YF0#H7!KhOf*FBD7HS z6*+UpXo@@38Wbpg@e4x2P=7SiZz*wWL{e2d*#w%mXqNBFY&#K@(FT%GEXrS_amrab zR;mF5SQm*76LX9QHh|SazhyH6gjKLdse;kR_9btB^8qHq$0bVDC_3b$<;DjoOSp zIRxgdU^|xY;;hzdT|>&111MzewKSBPS@C|Yd|0#BQg$L22T|OF5^+}3dO;x>4X^hF zw+@H3@ZE(rsEb#5++T_4TMqnAs#G149pH~{VWC=aBBj$P7XHC6m??i%VP9`d)>%u- z+=5e@ym2JYDdu%N4)aB9rm3)Lv}2cI#vCXb^WDLkKDTV`qH?9xX_&3dzJX*4J7doK z8h3G#F|(dz%p#lhOA(-TEdfDe*IOqysZ?WFim_ zdaz3~*K*)-!=#>|UAlWF?7N<4EslaW4WsS%SqxcgVDCzpte4t4x;0a(_KE$Z&q+*_ z(3d+_0!GVTJ*-VkP0?Jg6B&Y91a5GZi8~HXz42TvjJV_?qu4Y1w!-a38)S4HDXdMa z0eQXn3%W0!O-LZjr5HxdCwtBfgCby^l2(zHG;U&GpaNsS?Myr-;DJAh6d zB;(}!LVjPYO{y8`#&DVQ;dXb{&6QM#`H6*qSW`vSN}w?}w;{r1&*lO|sdfvrVG&>1 zrn2{n%Fd{|JHxX_DPKT89c`SZuC%oC((n}%wh7?Io-SLNIH|gw3 zbE2#!H)z~3-~8z1G(K+Fu%nK=6N+amn-cB68n(RpQ>Uvf9bCTRvWn9$mfs{$^EA~E zv?HIl(Q1`g?l&I>!enaKr&R;)gY3M@Q4!aR?BP|fhzNRgozVEPqF(cmF0t;Z4%g8` zcR#FLiMINb;vn7jV6yLwaCS{ICNoX`5l$?oSz&gJ;tWZH= zoi~azM@u{O$#gA9aP5i(C6a}CLmw0HVmDyOt(NsnNmcyq#bSV}E8nJro1T7#=rJ7W z6_FAXT3G!zkkjvrOnBx~m{+O>7T|d#?DbTrbePqMuqZa@xx$XbC^j}HW9=JRu=}Zf z%9jFR-nM&9yJlx5&L&ZyWu^VBQSN(AWJHHNZxW1%*#>7PlD%&@Riw+q-P*UOc~)(1 z6x#xvKgI(c#Fu0*=xH{lhj%ud84>Z>=Z2pFKl+BE1ilU@Y{t>ajnX!WrEXghpr{1> zfweFfrp>&d!S|=|u8$3O;u}?GYH+TO-3vk+!elCuTa&$(BedBAhKPvKFy))=nKj8a zz@$db`h|72-!T)QFg+MLud)-w!%<@KA&2gg+2<&)h{+(tH#%$7*EZNXuzn-+ZjN<@ z;L&p4Y2f694dZDuQ;TcvpvptM-I#7_5QmRr$p+D0NLi?&-MBE6;uhXkBfi=JpyYm9^8um*Zc|wEfMl-ncRBVbIZz z7~vv}HL}i4ced|P+uTsBXJMW=VMDO&B*)JBjlnHXYo;`SZgtO24`-qS!kUZNaSxu5 zNqtlW8nemepna3BJ=t#K>wB_{(ps5TuZGXc#spjqtYpnez#Mt|vQigi0)7flrKwvJ z-Yzdd=vl_vDnesBvR!Kf9WG2-m}m9f+&-iYlM)2gdRwTZoj2!v@?^6TDfSq-Dlg;- zyT^J4wTmayVojH*?Qw&%ty9cWm}#au3oJwKbj5mz3+q&x6|}qXN)*q%fo-XVh^Tn zLUA){f#k2BV^LtRj{LeA3JHz9<8^G#KccKZNHO2cnAlC3@!gELWmY@xnQnlR+$(pj zS+i*p1Nw)lR)4xUw4}v(<<(}f-C7gm@2FR^uGkfs(dRc^KNgH%BiPAWX;WMk#WFc# z^Vf|>+i52tl^4;ZW~LrLCdJl4!HP~hOA}E%0JCBZhnLY#N2;w28arAbcM|sg+|AUW z^+p+1jV#;yLH5Qe5kyj95aS7WY$PQQtoJAH?F=4{`G}INI&O2FT{94D4Ld5=s-jxS zn{`%R+kb;k^CTr?;Z*W9$eH47f(W^v(C))dfmnLAC+H2{60gW6k{x7qMZL$b>^bYxbElXK*@tbWgB|c5n62_S$*Jd+Vig zP9siorjPnoI;L>v=7rs2U(Kyy=l0RV;4WPnwO(OiNNf8v&Kx@yX) z@4u@mP8Jf;z%>RG?#+IEWJorDlSWmIxoA+O;z#;QgT?Erm$BItwk@#HIhFRuxb}^A z@zUrH@l-Zk+}*fLQUzXlWs;HD+P03D3c-vvV5D<;ljJt97P()ytTg(K@`R4Dc{ zxtt;kr)P%Ipq-#%pta#j+M9Qi*>*UjdDFDE4u8mp@Xkvlvkh{mYv+qh$}L8VM~W;u z47nb&lpNz1t&*RWIUn4Gas5`6d`tO_O?_NZH|vAxY%PC({MCqxW&ulV{-xBp+gHoZ zm)9zW$CWrj-{54uQCmwvRrV48LZ<#kQEM@siatH1;A}>pE}~+qvW8Ln)N_E5rJEVM z=U45Kjq@67eT-}U67OJwUFuWEjOtL)`&rq)jk(x=@|}{otmc?1KZ4=qC4TNnBsQG> zOp14B@1C(?y=heE357S$UNG8=4xV)-%`V^_9$1s1RbUq%-wPxu@jz?Ovn~uC=FTG4K z@6d{y0!NwiBcSTc$ecqmqAQ-ofT0o_zZFBwp*}Ji7{Skr)%-dBnO{*PkE?Mn=O@EL z>bUZ+l&pnwoZVq_;RVv4srl-$)vpZ)TaCXBqOQ(iFpIBkvyb@zD;(_g4mRI137;U<&TGEv#Px;TXLS7in!bNRbM)EZTAGzGSAV)MZ5EQpH)d#$h3 zO+f#o_YYWeU*qjWop->jZ}>5%H zznY;s@XEWEB`m>2BdU$YcYPc0{wcv9XFiiq^JZ7{-FepGexcGJe8UCC=K6x#A+B3`TxF`$ zMtRns=#wS8VFQhZCjKduQSYT?5{T&2d>Fyt8zJiJFdqK>VBf>ZxKaHJUG2S zJnH_YS<~iJ{BDW)jJPNCv6zH|i(u>*DJ%lL!~XJOeL|ovM3Ogm z&H5=BeOXv#Pa^$t{zged(?Q8fqrR+lb>lwX#D19=}BHOH(EoRQMUFJ-<`kJyDQwkasBDK_2MAcHL;EDvHc9{y@*0 zJw^CH4th=BCO%K|Hf#52CT>l?DS4FNZ*%JoEd3xD`C^&tj*4OGx4IIv-P=+3rGF-W z{Z^Tr^6ge2Tf?}AnMJMpbG9JP?x|vSQ>~jV64TE*ITXz!M9;Q+L)U=)fx5e-<#v4 z?l^q;x_*1~dfp*dN3vYfcs?I%?%dWo(2tElnQ^EEPpgV?1Zqa8ZYBs>OMyOB3hm_9{Dy?ye^uD3JEV8zE*udSk; z7TkCNv-B>0%Kd`u<{tWkvm0PCEpPYr{^HbYKMRkG#Pn0ag*p9G>j~C(->rTyR5q!P zj(4=^pXRT>z2;vV@Dea2Vn6H5do)4WXKa)Y^Dr$?{B!^s105sHZsl^5yi7u@r4J(1 zGM02`-kzYv}Shu_H;$B3P3^PqOm%L$)Uc~-{4QxMn$wZ|P(Kp&@S!DX!P$%ZKTe{7`O~17!<1raC^AkfcvoA0sCyP(X!hyo| z`49;sf9Y9KvW0@5L)^z-49umkRzm#~CT2`hYF}f={h%I|MzK|%PcW%z2wO25rLpwO zh3$LV4`AF;SGiA-AJa|}UGX$*e&E$)`^s;1ztx4P2{8E4Z#HoaH}?s7(+{_f8xGOM zes*}in#?j{j7UuR!R(1eAJu>7`E8EY9K$&g=BlUHQ4%wK3I|U?v|PW?Dt4n_=Mk3{ zdZc+~c4_1@hX&h#!jL|44k=sk#*Eb5-{{}3CPMionl^l_gmJ5uZV_0 zrXhC5->}hAN0|O&S54vm&G)mLd3{c0s<7ZA#d~}C0=W$u<{HK9XJ-aq=;yNLD3Z%> zs~u3dRI^yz3Qmj-8j~X%_%bSiMIz#O`oSugZFDDzXY7_Y1?lLzyyONjT7;ZgHQuZ=$*Vfoi# zMoV*Xs$C70Uyk)+KV=wZ{<_+Gqw0H`g)aT-)Pkk!AMHn+gO8S7$+a?K%h|jetF#Lm z__&n}%v#9Je+bw2y-uGn(ennY#F_3I1*Cu6VUK5HfT<){SH&roKD{e$#B{fKUH3IC z<&A)Pyw;J+=%?GU+YiqROmbUe1i#L8P=YUN@$q19s$?TfTkU;&y?(I>X0Vi&72y=L zV3b<_PVw&jVm&ec$mnP3=SjXjS(iIP?M3y?d>MFaJMa59uATdoEV0pjdeVI7!Ph>D zw_SL72?fU;Rf0-u6?!9aC&wk9N&A*mMozzWMsz*PtDdlUwRVS5?F{E_ce0w`(?Y>g1Y2i!8#;8&u3E1f=6b zI6$2SmgBf*7RfAo4_wk5`E7pv$W{5~y56qYo;Rxe;8{yd@2WeyM5CU$lW}#`&y&XW z*K@q3zQ^t^>mp_kQmO`vk59`F#~Rn~%`una5f8#<_D?j=^sIa9DEKCtN_|sg%qN6$ z?e`jvG+vi~kq=EeEem#VQ=JWSDCMIyF1P4#BKtPAeq3OsNwV{LvfHRO=bh@?KvAXA zzK+bK_<4(hR3iVdH=23}8Fne8=`G5tDaQOXCZa#(Tr3^8V@*C}L@npnOx+l?+T_PA zAXMLg^%bp7ZLOr-3^C9@tPz3{&3tvJ2_$nTT>c>9r|!iPe8YUo@EY!2%9gjADcha- zv3)(ce!&x~`@Ks7!hvhB?I&>rH5%&~@slsG4dRa#<&77sM6afxXy&aeMs_*nLO+J3 z>j9n{S02Cfw=%EY+AEdkc9ZMX-w80d;+J4j3L{zQsTR1o5nc3>MWf}s#AA_Xv?1{2 zOKe|M_Ky0s72)dUE>J~&!)mr+sKGk;ev!3*!O)eSUt1pyA{s2xk^|!BnDEU>H2gol z`;yW`_9sONTZAVlP_pdhr%2wLDjj=bi-ymypH1Pqjo;$^^^z+fsqA*uwLcY4)rBpE z!X6XA%)c(;Z_QvU@lFm4;+HEmaspuSb<-_gq#i{8$y|UZ6 zF!O0rJ-ptu&tSe3lAN+BZhwSHNo(Qg^{Cwl6E;O-;kkPwoEA{Qzen?&`Z=v8jV5(J z&1c(PvhaLb*^dkLm_rhEvkPpP0uufS?QX!F%`SU*EmhN(g*40^A^+C)NPIchUGH!m z>Y&L5JWOlx!=m;nAY@=61#@2bFuHw*CTM7Z5NPq-MGt4BIZbGPiGMz~(1ZEMZkIIt z4@~s1u>Fs#;U7`LoIQhIL)(Je4qln;1gmB zI~MT6EAa<~rrj&L7tq3=;q!}4dsK8T(1dT`r`vdiw`*Zu3%A6qrP8GO>?&yQ)!1%{ zsUzb5rrj4m-Dy`boRYSwe<1<0T*$w-h(gavP&I4 zL>tt*z=Lc1oNA3;s*0; zLx&f`4?S-YhT9yuFp0`w^jv@8*@9p2RatjV|M{Ks5X0&_M?dfL5j({e92e2^8rKlP zcnkD8mI>*P$XY}~mPik`a{~O(3&|D${S&`wyt&)eC%XHro_j5`quA=!gI0 zi!(YY>*!jicM)oOI>o3vOttO3TyEq)UvN1ci94(uWoRP*-Y)+oeyrfPS!v#zq!*8q zy~7uiDN&~MHjH~3Xc*UJCMS-oUX&E?!))by8XhpFM*EFo)!L^ijmu$lZK=wCRSUyp zBw%v>X)D@pB}b=eb0YZK<{@Du3I0!8l6EFW0v4~JL>0m5NEV#OhhAi%8=WHkH ziy_ntLl2(T6#Nt!hePlqE5+tH;WZ4blNff%uE;wWT5_ALR2!Xz7|TJD;WkZ#PNa0} zovYaFhhC`dHyHV^CVuVA!-xy63$uwLG$Ey1>GZ>hJlPEhE0hZgwMizdC81mFq{Ml1 z;zim1O763UU}q#2w&U@xV7s2&Ax0%E$Un@chERu;ZmZK5!#BwP)dCe`%MGs*!g6BK zlU?$#dbuVA!J$Y`qN>APafM>SdG^Ge&PEKpphLNKMaGaD!z-OS*c3;*B4OQfr(rfv z30v7s*E>CNULWmZg?*DdeVX|tvX!J{cX0=UC-{(3A(HS9yXiLrxyC`WEtY^dSmpa3 z>9A@!aU#0a9IcAM9tDhzU^+#wrk6@M+PmIV?N8;RnIwCA^e||HWMgb{UfN?rFF7Q3 z|KTmG(AD!4Lys|^$X`yI?fXw}>2^m(Cz88Ik||6p%R(3&Cz7DevzMh9-i(wacTegP znHHCY!*XBpU_S`5P_CHhsm9=9oPv?&2Ft!;T3%KOD|tyAc1P|WiTi<&N=0XnWV<$F z97bc1CUNSL{p$ro#`{F6E6ZFM`6vF;?bLGV6K_2PQ`eU3afg2F1wC>)sk^l(C1;hr zYr!aBawx@EuJ51za*A7azK52~YGGLmSK#L!#iPdHCd)--xw*n!JH{P7|EDiu2Ru#V zJ&|NqE6X{!0tb8Ek4z2^<2!hQgNzrA6hbE}=D>xo{Xdje}q ze}ooYm*xp3jtE6g1XvWk{B6V>R^B{^zT|Zq>Qr4in$!2Fi>j1tlX1(2YM}o0_>>lrKHODtD zj`1SXJV|^&)9-P;9gT>FsK}R@A#zpWN(&K@w8b*XsHBACq^;*(-6Q=a zll?-2Y9@3a`@NHsHa2&n0{ZF7lZ>6>c~(SxV;w1^vFfs4Bvm+4$S|Am+OiiVIShuD znGW_l4wQJQG}^I=aJV@p_{P9^j77#uld1=)Oz3(vUph|8U^OoJJB}txjYxHoa|l&x ziO{C8n?xkd6ec|pnIzY9)Sl4H7a1f^Ns>|$5prtc(RN&MALvR`vK$%cUlonJ%U+iq znS>`A=fmD`b)a84xmP;Q;_Zth4YA73q|KNmRWsLG_HCdWa)Hw{a^{Xq&Mt1@F2-l!tAu8y_75j^~ME6686igCk{!S4D#;zHj(Y=uNB)56PYI$5Z*6yw7N%8 zx1`Y@WGzxIjc2(>BXWJTe?vQkr=_D`M|5Az=@rkM&5BcUz?j)4EXq@GA8(-P8?Sfw zZ2zgb$d06j<=!2~km95r>5mqB{35X7{=h*Wlc0>G>nV_d&96{RrTuR7>za{8K@{%7}2npoK(x`LCZr_00s-`$A)SB6w*f@G;^6-g`B0vgtx-(cFW}uunEy-1Op`!xJn^ zG8)u|55*;$ZEX6$hw_qs4RV!r2ckNP`DXhT!9~c3R*pywz;zmkl6q_3hsbvC4&0S? zf@|`B?PwQ2SWn@J>0kB+wiG`D>B97Hc@rD|6&l2@+w$80CYWb`d zGf2%~N`G+8yh&mqC%GYXRA*{w0F`lSTr2)*1H}%(Vf-79tlaTx|G+jUF+Z7a`H)QX zmdrvKE+ap_Ii}rj`K5sjohFO}4yAV2EIwi_wF{!CjMWEmu^sEmDv~F7!;VgOiQ`YXO7mh3^8Bd!$eu4#9hTy0BFRQY%9H zJvpk#p-%r(cDktRk8lp15;oK*rDHEe#F~iI1HYbFY8q=-Z%I`$m@G*7%LU3nt zx#GhEdWu^+?Ias4rmn%bA6+p!ek2oBP08qgn=*oTew{YAzW7gDNzmRK=L=8sqg@ee1{V z!)#gd?HI5l?T2xl#<5pz5U~Afr=$7Dlvlz@p6b5JP_He*paq;odu5+if|2t*^ z9kEnY9SIAZA<@q`L*lZ)kXR6Xx~D&*mGdEK)3hnNfLN@mXmq527z0o)TGLtlg4n;* zn>MI^Pf?l+2WLNXg?hv6{pvX*{PEsRapgiyHWU;br~f|Q3xAI9@6%hgbv^iN7Z1uI z9^peg(M6yJ{m$p~2tM)|Md(*R=|LMo3{3E)F@OiUs1eY>ns4FQ7*0%_58e*2t&=xp zL%mJjf$hr~?W9=+Y;A-|o!Hy!CQHYg{oJa@n@=8dDt)egR%1?H zdNMj$1KY4V$n!fIYTg-0k)Z9bi2qi4kiMVxD?M;0MYW}ALkF~wMx{KYupYS{8mk;t~ESu_!Cg7_SC9y^}}3e`zo=??EqDMe|PGK|Qu z3hXo6I>S+-Y=4&;ezQW zk-t8We4!mxDs9(#@KBH^N1D`#&B%~j5S0|?3USU(!TT3;A)b%sX}_24-cW3jzn|cK zucGa?Ci8RKj%)4m#pSAmzm;XB$F^^G<=kmrM<;H+MOf%DhVka3N4H8X`%WRBH0ea= zk8jLqB0|pud;MW%LoID>x5GotzwFRE|2R66W4Cf=nWGX#9iZ^)9c06a-=cRYmO}IO z=CsWn;a2!ay_Hn5+KE8`K46%o{c%MJUpVWjyO6a_sJmVtZ!C4`_SR38pV~8Mu;Hzc8%(kCF*zE~+rC}dXEoQS=^cl5aK(RIS#37IA6(j4Umddc>7I_8MzF7? z4CBW7XTELoklDnyJTexfvS_8I14pk&(XW3kSdNGxd97X2zDF~OoBEIx$6!} z{)+t9#5Jpd1B`Y8x+jSx(-|N2pQ>}XcSwiE!cy+HG{ zLz*U>Bdfv+cr2;ig zNA>~y0qR!#D*jN9LV4yF8#_}*R`G>192I&kUhf=@2+CI5e&(nu$um8%a;$Yi)wI%@ zo3oNqkG~N{-43$`Ne@L=rayAxQ1kh#$xmBJTPO|L6Le zX=Gqh*kF@GK?dKhANe{pOX^TM`HMT-<{X3F0W^b@bttfTCc4*Jxl~PdS^CNRhR@j} zyu{7tax^O|@g#GaN82Q>@Eab<8lk68h>3Z;RPF4JP&T6}YM648B(<*7*&0r0f4rb? z@n+E{)N^sRBr^VVhu~2dv;F3DDI3jau~HxGq(tcmQ&vMFD=shcGRMehjB6@9c=(H{ z?uKb*$wgmaLOP-k`7GrIqNsq(dnuJxr%Ndt8{s_gJy>0B5YS zZL!PvGt(-!1j+l^N`sBZx?Yv{o2?~OyHc)rywVoVV%u-ypFNXbh;mAHT zVB1ZKfq$YhoiN=zM(o2s`YtSDnUIV{ zG4vgc?YEGcByNUtHjd45Z=+_gitsIf0xeY%~Xbf1%nw zK@-cfm%?Fb)z<`usTAxJrks541%_pYW4y>G5d+lrs!iWue-l0$e8P9<-iI~=9ASlF z=s7!mjHj!3(x$_=lLYQ@l)jS8CDb7o)uJ$9>94+SL|sB~^sSLPj36s1g89Arp-=Eb zL6JL;VqlKdev}C~$y)r1%qd29m|06Q%S>Beb(bawhkX@Q9k!5;U*&U6EW2s((Q_K~ ztLXX_+`Azd$}OE*Ay{0XrE&Y=%06!*#crzXMqcO*np6y_53Bp8I{RYgYLc90U2G~z zYq>cE`r7rBeZ|UQ(OLFpc|MOgnJ8l_g(Ghk7d?SRvkX(~Lr>vP=<@APG&WEblw0e} z<+sF;ofoWM37DBe&#$SF6M*hX-m;9UaZqfrZoat_AI>xO;uJo1PW=nPOS}~@r@4M zFVW($e)u!QTb0R;F5xP23bZbyFQd592h$hvK70Y?EbmB6YLNfL#?_5+(j;avt&MwEpHBEO3biRN0;z(0nb-NpiU*Jg;JzdN#uQ>Nn3wnKB)qz$=#d^z! z$2K4CCx6o5$$mB+_1+1^AoVVeWzmR37=OMear6v_hdZ^W)2i^7;<8_N4WiDfi|ug= zM#y0iy@fK#u7T;aDovqkbx+Ecjx%Wcw?mjzEQS6@O z>mkoFZ>?cPoc?Mb4E>sB>HFc8-KpB}%QX&OScba^eRL_-K)-8*9qz3)C!ZUCq_Wd%;WqnAl>^q24(L2deWLglSn6DOJ*%NQUD<4cC0HA@SFP?Fr5~0+|vAze=W*O7-`Du%y^TPR*|XM_-$d1h2nSV6QsDX-S#@)s0G) z2~P6)mPyupXFPtGCd%w7m);|>O4`3O9dX=&Q((F{w{QuZ!!~TVR`!t*$&#eQnsYJraFsb;~0hFqDPQPZfHo6(u5juOc8npP-3vJmwFWVre)mPJj&?v{kB+)mt zM?1CY+w0z^A|8q>ReJHyX15*hbBC92KfYsr@PTzKWcNvbU^Gp0+8ny@-I4F}C)=ph zi&XO&)jzLb`^~sVIJ^~3wbY*;_#tBZz!>KKW{X-Ni;4AM0ej%&e&a)|h+OiU9iLJs z<9yAOKl05wS=4_d!c3}vy~;#n`vui9dg8lA$7ac%Gl3Vk%)^KN-#2SrLz}dG67=xi zyJnO`cK@t2N+(YAwG~r#FqUT+@Snxt7Ul6Qy>s--8jN0I9^(nq(nv>mY>BfFva*D!zyKRmk4c(kU4ZZw9 zz!dtmwGZHRXXx;IH!WKB9M8Gzhm?#$Eo{$$;o1jPbYnoGB+q((f-Hyn>~RR*k!oD4 zvdwDTP)MXw(r2ZhYudkJOBtf8v*#;`V7iL3u^9rCRY&J~(4ISY>yO+{Qo@-3X)5T-69>&BLm8Ns}Xj_#VJ$k^7~c)n{tew{xLmGoC~8 zLW5nVsd@g?+v0;hecnGfNcx!v{Va-LTVHo*HP2Nn+O`iKb5c%!h*M72|6qW7RQQwX znuqHK?zVN?sy^2o>r^Uz;(Br;x`+kak&Nz2)Y22ldHof9i>@sJ$DSq(7B8-60o3YV z^&RipGH=^*<#9-|-?V&m*q2qNy=oYfUpBZ>97H>+Z*XSdLV2xMmaXO2o8vT+d05O1 z*-r8_o}>*Us<7fa$6n@CsVW2&$}MA2LHX22uO0j8cF9-{Nhy*sy>6Yyw|#!n?^eI; zH**-Tbtdw4NMG}pr>Ka0;j?=S&H<7t4AF6s<^iU!OU^gUKGPl*ND?B{c4vQj7BSaW9?njB{s^^MtkskbfS3A59bCsO(V>v_Q^S_7vG@%8-L zt*OZ(@eE1$n-I|`S~e`h08lX!4tmV000@Qf|IZYgADH$ewP*mM6}qQ(Bm8u*7+A6+%@f9iK6>~@~OI?(Fqa{h}~ z?2ih~Kx3%(% zV}EY`?ZTjn1x+9*c@`%e|agDNele;T09R z;RihhZ4qu~DjAs3$qVq)2cnYZaL`h0TaW|YrKe^zWDB8zmFNyGQpT{{Eo=RvL2BljX24!V072i$H zU~jb%jI6~PSbrc?d{;fEIEX{b(@vT3jOg*u;=YhxvLF4My06cCq;3q{q|d(XYvxSt zn$l~9mE4CuFN&YHwh0pvjDry7CPfB{#)wlx_B(PZjW?8lnekVCsH^k#W*MKSgW% z-N#J0;1T}1Gp12*CdHP7uEw4@yKeR4H*+zW(ecJBs=b*-)Z-+WMxB|TPjKRuLIiFb zt4Jh0%2@S~cHPpJZjeW=z%Fwo>x5P*G}?;M{JMQZL=QuuOv(99Y6R?kbuu9 zyG5?;?9aW)ei&tGiCLvQ;$XJMv`gR`^VX|JIx8*7`mD7YV;evH@&K3kK83({Kd`V`5ClK-kF!J6mtekcyxLD9A*=g z`O4ILO-V`IZ&#)lw|{+081}kY(^bN;-bFM26cxmAdSMY56K)m|RADnX@4L77;2gHk zbmqlzb~oh*s++JpZPo}o?QAc1^T+FP^fWC4n^9l+D|^3MjJ4<2F|6o*T6sX!Sf>1H z19kILOUQhZn>|Zt{dXD zV~|Nk(J93z8hkg79K&sH>d5j-&dzs~jm{#-8tkOo)R&e0>T7%O-2TQQQB&XQQU~+b zJn>A zEMvK4aX~LEKpOkeJq63GU=$+o9Tp&p?gJ66VF3b&3tDVI0&!u44JaTk?t}ugU==pN zgZS4HHlT^P5W)e>5f{-oz-`3EFC4%babbgt9O?Pzf*%j?LO@w~fF0rj6CZF#T=?Mw z_K1sFe82~Bp$h=kh>LdsQVul%;D#89Bmlf{AbTx8S}32?fmy@=IY>?j=paBRLZrw^ zLZr5vM97OKBH#{!hL;#glR^x*B1W)D04KzS4+-FpxY!~=Lgu7Mhq_6TT%u%1f%#-e z8ZvU^NF+I6i(ua%2RslL78HOZ;-Z@Z=`=Sb^5W$`7e6VH-kVba_YlNmRDd7iLW3Hq zw1FBK4>}sa69GljAhn-B7l?TDlPl5GU&I4?;OQbB6SPRv)aa0LET;o*Ap`*QNC6M% zk%3vK2OJQPJ_9lg0}M#-B^d!<1XRWdSX{6(0e%Rzq7K^nRTpYAnUHFKFd_Z7XGXg8 znHd=f<*UFQ1fN<*2VNVvh!0KQ@KwMBA(Wd1NfpO}RD8~YbikVx>A*BAa2G+W!v^>u zB)!YsLCXRKDIrPoY=9~P7VPvJr`8K zAqAumq1YuN*O0%KF(XtFiy#-FrwCw+$dL?h-h0mAj0j+gP>3n9-cg2*f`SXpu)rl* zm7uODAcv6hN)$4@==QQ#_qReR%{HT((+${haxwRHp}76a4~tX5(WYjf%aD>Oa$ zV4)a5h2UTAHh0c}R4+j}aXD5K;DQ)3R{Y`+|5Ek^KSK^GDfHeLsT4qpz&)fO{CVqT zoCR!CL#EWstJ~g*P{T*T5-)T^KHDg0>HNHgOIrY~{Y!H}+CIcQI z#AL$hARffu<*G6WF314#2+7!O9Cq$dX5(E$LD51IU;IyC7A{!?6nKPo1@xB%SP-E} zmxV$@v2p=zL!$^)VHPxaA4pJ8h%8Z1G%iWG4GLZZ%n_=NuMRze7n`2|3X1+EqP#zU zRndS4*8oxkeXXka96v-q`akrJm|)iR3)5)8`*O%xdm#tVqLP8c*MV!`vu$J$RBB$a zk3tz;gNK4*dr4^soYD(neqD@s_As<;@E{j-E)mUxnb!d;gy*R8kmtNqaLpQE2^AVP zXf1`zw})`Zl^R@B0rbHgd4L+hfTsYB`ZB;r6~X5>01^a*a1H-pW~CoWpcf1%D2A65 z60^b;$bn^MXt-cBD;fbJ>k#s26d`%mycam33mO2<^FpuwX;Vk;3g5W;e3&3F?h~S* z7+n%tDhxM5543!UTmUpmkSJZrzorp`yPilW0}ffqT|k*yXe1!f4S)t=0N)Kbr1Y2T zqCTE{TAuWV)Lth=K{2_cwg?=)f!x!jlp)qk^$XTSWq<<_20ZpSvlfVj7b?%%msoc+ z{u2gw&Hn~lP6ZOhrS;c9DsT>3_ZMl%^gEyvlA{XAyKKsPa6tuW%1u>>pTO{fzd#jW zL-;lfAC)ottCa{L6#=QML6DCv9MS-%rI5iGf{$7{fg?8nO>oW$4eQ@@(7p*lsm^~V ziWV`42#=Yl1F_m53&kJ{^)7iF>hYJJ0F+fnt^p6iohLI;aE1OSGuu4jsx?4)FJulN zY#maER8!ph8ypf)UIW==`0aKn%RtL%{ePB|-F>)f#7d_D+cl7?uhSQ_^FZ{y|3gn7 z@*n#25Xf~kO=J$f4bxhcg_yqn57UQ;zf8>FhkxjA|Ck5i^jrT!AMxxjJq@U!g*2+* zX7oH4ME}1vK|c0B^sTXwQ8EC*MZ5I21dT=D|I4(N_#dX%cmx-PM7ikDXjq7ifB|F>Ab?&3#y~)Y4e$G=9z}$K!@L9(=ymP?65xZ-+xjkczY%tb zxxE7ow0#e~T??Os0G}Do*USGiObcpB3g}T##4mXXbRuXaK(BvjF<9co*`fXI4YXff z?wMNp5wtuYHzxr-Lavx^2mePXdN8O$^IwvyHS({0c%UaY0SSU(BMNVv6k^bW7%p!% zcPIX3kVXVTOBaeC$_(hLi@bkD1Z-^u4IGvwAOrh!k#U@X=+Jprk;8a;06l`8M-LiK zTt@>(hR~p$RS!w+1|RXhdKWFTq6%PNWZEeY;4EViFQ( zYJ?OA*Mj!uC-_hwU_w-h?JwSZH=%?LfIPh10e=4pw&?@c;Ksc+fFwqrpn=SvAYq>t z&4ab(QewO{9x|@ZLI+c)YS_-y#t*VaT|m%)aizd zzZm2{Iy7(6mkh;U2fZz!ru^kc3~X>X5LuMwOd(Z;n{bF8j4^^BCNn@3Axg)zbVvvi z^%2^bE>{AJoeTN}J?QbobT8;Vb?Iiv{j$*vlDD^aVcM=20Dun_AR@xM$i9Qx9Ks*} zyuiI$AxM4*X+I)*FgRZQ`vOmK!vMg0BM_e9f=u~MIPP(Dq2J2^x($>LK&HLUEeJ9= zM@A(Ea)odP9eQ`9Cz7=kjvt|bi?#suYZs_bYn?^s{klr@1+y%oKrfE9Fb{Gf?yF32=d#JLnAH90@WyQC5(TMpQ`kR>;M@4j*NM z+J$=n%j>%sS3m)4Y<3F+)0eU3aARuc80lYj!4 zkUfMCkg<9I$Gv&sN*F*77l1G>1bROyyv8EfXW;N}emKkpR*(WDh?T4P1=B_t)Vl}W zD258b!*wz73fR2$}&RZ~+Gy(2mH78?jJY zrbB6Yxj5NCHws8m_#po{WaK<0lBo?%0!W7R--l)as_Osw(^0u#>UBVFvuh5J>gzWz zMi;oD<9VpoVEsFxd~@qn(3e6{7NNAg+#={{z~h5hmW2P(N2g-%sX?mWK(+3&>+V{A z>9IjRP7L;c*IohJHO?J~2@i_b<(mgC-M^N}|GO^IoFJpq3@)IGTntKZ-3eLC{=lIs zqYFsT1E2!6oRJNz{6y#jTxg{(LVJePe`11y^4=Jp;VfXJ5C+x1v(o1biITX55CzpH zK}5p|GoxlchT;(bg;wj55EHQ76QBVr?4S)Y*ahH6q+OW{bYt8PGJ8P?6kSp+Ta;rM= z;DQt}9~nj%%>O1Lc42^?7sONpWiQ{Q*;RzjEIg4XvpSxTLLl@)3RF-rz^9%7^~EGK zt9yk&ku`ww>~i~38~&FbQGl@!_x%W_6}u~U*`TQ?gtYQp(wgw-f{DHb9SgLufeMX| z7cyv8UXT%_PcLw&9uk8Ae#q%)fJ3uU7Z8*r7p()H0^@utSRTd%|cxNQyw=h3U|oVuSsD0K-L1fJ3<@|5;vMkx-_{-a~q=aSy_^%KyXq^d3Nk z@S4?^F60g5Paov<<)&xqEj)e-2&ye{$>|$V=5#?(zMP+P)$rJGAa)*vEmrp-U4eBM zy8h`ku)$0t3=FXBKERD2nuQZJH^Pb7K?Z;1iIh}RRd@|FmxYi$9G9}Hx#e#I0wA&w zAtlWplJcSLKSk+_KQdTHaLBLoBIMHP7|>D7EoANr$Z$F4K)!&`Dv-FO<@@^!tD)Q_ z0Fwfc!EFeDMD6w>gBO6jm1TGUjbeQKk8Z06$j?Nc!Xfz~xNa8EMIKr07vQ6E!$>jk z7Q8_nxmi;(96ddN@~N2w1?B1`i&{o6DynZFl2or<`LGWP5jivwm%INfvwv;5_{e87 z5ZaoB9zr(|!%I+sLNqadYN51%pV%Sdryc~EbY~u}f*E`gge+htItSFmSDdl5~q5M;BO8Ukq=-Mbh?6!*V} zuE%gl@#h632m{y<`hQ7%kF1As;Rwow%WGcq7u*XDFcpSeC?1amg1$i~FohKVm-P1G zUxftV2}F-LDDjYUS3QTqxB`Xoa@$k@9qG3_LQN?A*cU-d$0rx_9ipxMpOB+nxdOiZ z2Hg>qJp@<~w7$c{Ti2ljyO*s0SFR@370?#C(+9DaFlaBDn2##ZBM8tV1n8?|S3vDh zfDRo#0)MCgot^v&SdIzM@%{IH9YUcG5&r$;;_?ROjbs6LLm^|}v|{-Y%c#)DUD=R_ zmv@x0e`s~X0B+{T&@&Gb&yAa}L9%Z^|H(uD{re|#^}-YoqNN2#!vG4za~_DJg_Wz| zNIbxJ>ElTFLnpyn&`E{}3mjyDct`5X@A#TUdVFPNDK zEz72J=uVQL0;(2pQFn>2`Orhz!3KG$_^-+TudV9(DG&s1UL+#+bKftj3oM@tiavMiOpzhtz&5hE9@4`l0s~s1tA7E5J=B{!a8JB zT`L!s7O6RLbA`_a9IQBzoD{5MUb|Tdb8+}if|oQgF$rYeb0q0nb5KppW)=&KAuOdj zIFG)MG{#OqSuPKfOvc+1s!kY#uDdZx+Z!_1Umh>=)?!&>RePr z1bR=P1wBNsQuFw;wAFHq`UZS5HWvn`XDY1}!^iXz^wN$Yq5b5giC;>1KM(ZA_cmkI zdp`0FIo{x%Hc$H_A9x_v;}lXq^(Xugc6h!qfTQkRIqKan@QO;vq$=0hctm3Eqed3D zKx)}*0fyrUb6gB>03{vUz5uHv;_T%fw`wQsZ*;6s;WLHvwP8fAF5B@P3Yp9(&57fW zpH$RoH}GtswEEoIajaku%iFN~?W~OKjiVfyoeQCP*f;@4Na)!>FG;WKpR9`uRJmWd ze8`QPMEIdB?wFO1b?j=Tu{0lP`C07?@iSz2z=DqIL%mniO`Uw%{2em6=u*I+eJwx* zu5r?zGLzW}WlNcU>ARs2?Tg7??pKi_R~CS>W@Si9UvHA|e&L45ZR`n55vA)-krsSe4Uj zFlyhfp>XuEaCDWP^N-Z2H>VP@9Pavt^;>0(WM`IJ`7+2*Xvc;Jm(A%&Vppv>O{h|BwM1?oMLSI+=yoJT1YF}Bv)g$-gTjY##QYeKz> z5gA=w#57i>eOQ4Ym2ekMY1nG+na7H^4p<6%J%T%{_0+SHhLKmD{`(sOwKUHg*pxLgvD80U?de|7r_JuB zWg6hGo<*{g35FIL@jhH@8i>Mk)=N4rVCyT(~W!}s31r~xr1_0 zCV}cbB9NRi->sJU+i?v*6`l(a#v-E3tvhw8QA9^-?jW?{6j=}dCGbmUQ){;B6s%6C zM7Y3*m-g^RVg%N-so*A>Nvk9S?*5z0_}KiHERfy0(EZ3yL6H zHYgqIb?Q4c9epz!3J_2JdFj$vflo$ViG;BR!DZEF@VSi$zafj;WVC0QE?`L6jnnJ5 z9`wdUlPsYuJR8|G=Q|)dduh&Gpwk!j{a$a@y$*Hjb?IcT%8)??B*f zj7p#;r~QaP5%EILhTqGi)NTFqTZ`a60hj~ToSxIxjLOxu(uecD2bEts3n~#yjIQkI zRyih@wdmA%XuJm+t20T0nWdshux z6g1kOhAi5>5d=pdN2}$)p~0$<&TRB78$H|6+cgmY?P%6? z502ZQ4s|V?njR78}CHj7461_G@y)*pEix~)l2n2yz z{l1t?s6Dv^eK&*6lUc%ym{F{`e{%vKroLW$5!$Xt?r2_SL;MxFKtzc)*ji(8)nq^~ zeY|SJFL0J`FoUViGI5E}u=faP zFXKy5Y{%zW<3GEkgPz(2p?~~`^p`1Pv5(9?O?Csc^qtVBWVYUxU8^T+#w`T;={?yp zhONGAZMKR&c=6rM!~f|ht3HsbpK`NSUp8l{9s+;PxnY!412+_ ztu=vyF=xV268B0CMiHpkAbREeY3;;LmV&MjD6BFEt$1ebTQ<#f{t=Kfu4b&Z{3vI` zTmrpt6RdJ_u}x6$7m}p!Pm*8wPk_Jj7Vy#?0V6AXgFIm>(uXgt6cmUY_5iM<2Gvqu z6H}4H-d)~!gR=NpIIEiO>IIq!kuna$HhrJWAnW%*hy&FG{17VF<>{znvMuHKIQ|Uq zxnKcCf-$g6E1cD)B@}nn83YfFBzQb)^_`rsEuYS)a|eSm627ih9|Li~mMqW9XSHM+ zz8|CxH6(Z_OL4X_TOu1~_FHoTuFxCWbyvdBF^2HFu+OsPtUWv%RPd0KQ{k1YX}-Ni zpeii{h_A0=4#+eZw4l-`T7U0?=~M>YTAA?OSzLfkW!AV*rts|Rt7}$6r#N)#sYqqh z#?+|_0}}&#ABf!tQ*AQ(ASBt-mXPF1>Ci#xpM?a<>`WjYMtDQ1w4&*G2%w%_L@y)@ zTekU-)cP=ihIJL7()r(uA7E7v1o#Zyw{KIn5qHo`KOFO7W zr?y%vsx9enhL4v;#rnr52mHHzK_D(Q&dTM;6#84`zMlrc7m|^&R8rlBnDDEzxCU~! z=pB)IIno63WQn6KRlR9HXV?+I$4(+R z-@~fPP9KqF(*pw4OcGrYfnq0YMQE$!{s^~2Shw_5l>d7Mp$_M4i;kl2?b#->PK;Ks z+}g2gRwe(7>GBHZcGdlz7YSZiSPJ3ukAX_^GSP~l2xRkVgUz(T*Xb9)?=!)LZ(*3y z%YFh?TqU}mA7|rSwz09N_)*SQNd6DL^%V_nrwUStj7n_uuQFc$e4{()iRx!6G*&am z^E5%f)Tem4X2*(um7^QBBEN?PMt3Zp!KJg>U7X)g_Nj$M9F^VAFc1luRN1(xP1n5QqK+jG|C+*L=eYFER&w#tBGvUj(0)NL{8}S+t zS3c%tQqgSS_k?GtV-)Z~;6r)0vY_d<^g^`_h}uJNoz77Ord2XgKBnMd+wjr@=O&Q^W<#r*Y>n2mD)G76y4|pyUNRGop?KGVvx~t=C_V zQl??e^6q?FC-76UZERS_)3A5WT~H>Ya!IaLv)bPb?i&PkqZIMGdzvJ1Vvh>sUiMkY zVCic{v(;Ig7NPPpi9qx4I~=5QDLeb+!)&Xthi7F-wl1*u4`mZXveh~qt2QB_+X zaY~)WzWcDP_Pep%+ZR$kYku8I;79##4CLFrJ7XWMH`x9c>0RvXRbwNfT!o$fU0Nu0 zj@8k}&?XobYO6@nG?6Ix;41I6XGlbUc)U=coB9y zi$yprz#=XgD|1ohG$qU1X z?7t0OtZo90IUw+RGh6&bI$V>pCIgp-a5Kf)mbru<&tDSbs7ua1o#2OosRGyUr=X7K zsD0SI%W`U;8W|Cl0UOg!^auqt@HkQJ%LetdHG3Kvc^d}$@}vN5yDj}G@ofDGbwH&6 z0*+LuG&v_w+ikbSn^!qf7vH&WFP;P*&FKRaeB%YeAH&tyc;D^IUcm79DC`FRE~t*a zBOP=h{;=$QiCUvs%U#G8rjRz?1!%}sW^vD0pC#Tc4MA!>C0lpzwRJA*K=0jI9=<^x zT5<1hcMlCgH>sg9+wl;Q-us%Zj@N1&ev9CKf0*DN%;5o^!-gHQHCw6v;IqHSpD@oW zjLRTJYhWdRN>PpXL4MqQfs}C6wgy{pUxL;WDEw~|h;tT?TtglJr2kh1 zl^5!X)#sJ}Tc}$o8c1F6lj@j+;$xGNl6AZX#)eMh4pG$UgYrQdDw><8_#q@|Z^3rH zrUAH*6CgdWK|fQe+v~I3ZU;bW8HQOU_0-y|)B8uV2&(!R^qSe3K-M%Ser(231S(mE zN8hb?hpVym_Yr+*4l1Uw5m(}2$*)hZBbpO2C8{S2l3b}%TbBMr#>rRnI{%%D+%?g? z{0`{v0fZXOjKy-#AiNmzJqZ$A9je>e@xbJ!SWTdw!6uL&)1Df|vMRM^Li?kz!cxqG zYBKE>D)0+lk(MuvUR?G{hZ{Bu13sYP((eq`epGgI0 zhdPb@4FlN)GfmR(fLx5%{##)o0%E7fb(WAx_uWxkc3kj>W;~^L^A=eG{Pw` z5^(A(2-td{iGN*ArE(3QsL#NfUb#JY+D z;8dN$KI>o!tR^2}RUAuL?bwtzvOH^=b;W4^pQztV7N`rm*~xb-X`&2#wJzf}Zgp*RHrliU_pF9F#WN&W**sm5$coE#USm zMb|}djiJ2PA!;4ETC{$6i!+C0T{_ZbnY)%Xwa~misuSo^3`+wJv07;U9|3dUp=WOa zT=8DU*S1Q>7v{jcwAUW5n0c28)0*W^g1B3Pr6oOH|Lx`jhxkcf-ZFPmIcrcypZ9WQ z^5H!m=qIr_3oSqZCc$hyOJrrqFD$seiTc&xn+JScQ{VkGdmr*zbNHNk+^qIyftq&R z4i9GLV=+Z%mAPqxK0v|FSpq)dgUriwsWo}GXg&Qw25>R8UdEADVr#m_gY!<#>R0Co zcrU{$L0zhEI?VCuZV!%mu<6%f^sw&>OrDX7@h<%$DBD?R;*igou~y$vXT+<~NkK5;nVqfKJs{)}Pc1O$`%Vk^R9nr!Vl6e1rV=ax zx>_JWIX95=%Ps?YN$rk8T7Zw1|p88+1XS!SMDhaj=EB`-2-kjo^8g1^k9J zZhJCq4Hzo{G_}Z#!>DXK7j`&Oj@cA~ue&YaIhC|}+zysYrn}Ipejir#af-Fv?@3fr z#DF3h%hUgusEUVozn=c${%#DM3$~Z)Dgv)B5vX&oz-&Y9j=>+&=xNB2I$YQ-2z5BLWO+E?}vd&Gv0gL7%&ee^m ziVkM@rX@Z1g-Lec-?Fk994@Pg3ra}7s{}t*mEd^7Pq&azD_{M1dr)gMo2!#~bCnLb zvqkIjPC9R9uh(3-DGJy3z0P*(VTz|-qSG|J7Q#tw)1%XHU(uRsudA|rgigGr&PUO? z_Sgs4S(*-`_`shdamt$vnmGTm(9Lqn5lr8YFr)C}r6xmlLFESVfF8(~OPpI9Be=R8M2<)Q)@_k(nVGz?tyxk9DaISD>{%K}nPk;C| zAbhhW)imQLgXl!cD-5ezq%P&CJ=u0Ao!L6+p*^@xX+%_dvK1~m7hdh~(e@ZJ;2bUH zX-7ewpeIBV{s^wGqaz5MYAguMan!_V$*t77q6xM3U|H@u`EDjDb8PCK2MghF_Ba%! zmKwuKWnC+bbfBiX!V-!5gz+8bwU!MJH3G8+o z$+L@MwmS)e=FKQMHXQ$-z}$_luv;AP!xj8jICtryg|IXi`2hEqdPyrB5eeH73F_AT z(1C;+&k456^}k6c6GwocngnhRC9D9pzcO;;nHErrUp+vcKe;lLN*HN^i+#rRUIg+*@POynRRjp zvvYHG?D*AGY@+zuvlNYg`)SK7p^VB7eOlQif;U^w#WIRa|#L9Zv4w z?J^Sz(~e?CrGx)c7EujlNcwc(ck+;0-@bUwn;7Kd>!;uct{^$XIn@SZf4xpaVu28g zP_UdB*`_*+9;-8m_wPuX2v2C^wpvOUJ^`kp$HrVGA9u_4b7AK^*x5&+^?ohRpH0;H zGP`u#V?f&6+V<+eM&R7RH%P&~kX}YyW2d&u?eieIE2Ch&j@^pVs;~qv8S_chyl$h8 zt)HQ*&JN@J2p`N4Z!|B<(6KQ~^uGMO4sV`@X3JBXNikQ}b&k%jY?y9QkLBAWZ;yF8 zTv+2IXBS>GkIZ7}KAP7@8^|+v@3s6BInM!_W5I3q`I+~K;&%S+tDD~RH2*bi1DZPd}=o+fEvaSO3X%7WjjX#jhBXb$UOR@2}P1mZ{TkSxO2>6hNHn zia0%v3vq%2WI5U<02E^K%>83-fL4=BQdo0c!hgrpx>GvVw60c}-4Bq(v|E0YmE?Sd z_^K@Do@Ty*npkm8`)hIbc3`~2SFO&!J|i+rTA=14y!qF?gJxp<+kTW`78P*2MTm<4 z$n)Rn($Bj>-(k>KB|GK<=^M)_W;=emzd11ILM%0w?p@>*U0J74trFW(O+GMz${PS79nx>h|Zox2gre+UIX2n@9D%1 zGy7|3fxJhXnndlfY<}tpf0#$N#E^1Fp4EEY8rddna(Q1I{j#isEh|O`KKhO!t8cxc zD&4ibvwOO+^}!gmxF9WrqkiMCx8p>Fj|QhzC(&^z#0WJ#NM^OmbBm{Kf{p21Z%qte z*{5TqKRrNzZsI89xZ`(jO@IIya3r+~_#Cwpp|)wH zcM-SWP=w|Y6~9&jRN$`ZSk?~I8a(9V=-weh3aSO9;MM}kD@LzpRdGUyt5Tsw=DzQs z!VP>?e&3@iBYs7VP{3^cQEs-KBvPx}3lJZX=1b+O+b0Ylr_KUo)dIKYjx2rSU@Cz^ zy5gop&7CF!8@4}8tHx#P6%J4>RCvT|LAd6|#p*tGdhIE&a0sGP6)U}`K=t_)W=JfN z>HZy28PivQFbRv9fRoxkx#2|8@Z-$Ush^oZNn7QtwK)Q$KItz=6-LN)zxL+pX9*aW z&TtG>Ag3>xU!+!#E7KzqeSaM!`eHQfSce3?BY&NN%i_Ib+>Pl_>&i!J-9ouoO2w`= zsO&|37>UH5nT(>PV>R4e%xi_G1F^E<@5a->4k65AqXfT{tqAL-4RHMwf%X#!dobLt zGsa>{HN8~fQ3s&&Q%US9tWzC1hs9YO^V|&$&mf@G0~*bf+0J@eAj_zu)!?)XK)?cb zbk>7E7bWSPm`;=KG%P9nvjHHo1n#S*>FzUyD3_+_otbT4iGO_F;lHQ7lLaI=M^zB?4Q4yr`_r(9346LWXLV7d%tY08V`_9yB z>?$q<<6|@bn~|3`0P7CEYI!pzh4gR0Rew|uwi~{fa)A%4QD5fQ4)xLc$5LtR`mz>I zqt@S-l^@3)18l9tjhQq~?+K|n&I{9E{IUp6{iO8S)H~ldXMcqTZJ>cFk@XtE3bAP@ z8}e-pKq??rfNnI9<<`H{I%d6SeYR4sUgAXdT(G8Tr%llM1-@bUmVGQYif#yWXEv{) zTrUrfFR3{ea=nFI>L6QZ2>iqT$Qg7gD1WH_Z}b-b!N8x2*ioyOd=?o6A8MP9fQ^GL z+{7IlLEr^j1tkO#Uhn=6n~Q0Ckk|O75@fbaLfV)qkYEOp?pxZG{5~9<9Bj&SYPVCM z=4}G2geb{sWE7}4;+|znKIu`Kc=KjiNWIYMaNvz_N;TI1{840#p_zII{)C5n&ZZBI zOUQF>;ajuJc=#(jTabo5w6g8|k%85HDDHG)8MsE^F9W z3$IAOXgL%O6;n^?ncXjX50=yw-iziw+BvtbkC0g`Ffpq#^g6@NG}h{KtiaU{%YA|M z4kMvrtvydz?#w3-`Kn_K>_g1@#(=xiB?47uDKV(&sC5TgD@I+`i@V$Qok0}E)DXZ< z#LD^dCR!^ldR!)$4_D%DOtF0cs+n6};*;Y*XXXb9!>w=zX8%fG zSzHZAk@tD4XDh#gS?GwEznP8|D(tp1kXc-q3-qKuB7&BSjvmMzRCHwQ)Udgchnn#&Ec zLW0$*&tVZPC|;||8C|cu+F~!PQwf$*HzogWC?!jYFxcYq9jVN=c+jzrk~|*8Yi^uQ zM)MgXCgXJ9EF@F48f_8BaT~CnEhLE{E#Mddo!P7wni%|hc^TKnSE*3pIrduA>i&z) z26m>E!Iw4cCs)b=%fqr4!0&ovnpcOl+E4>a>1PNKxD>b!O{2y{VT&VSYWYnC%TWe4 zVxYl~<8l}H&2n7+6Qs6>sJ!8WW}msK&J_v6@9KJTi<|%8gt~i_ zam~OwpRMR@`l;ROyuj2j3`h5ty)dm-R&VOkz zu;SLTI*nO7Ig`*k16`GJ`)k1i_*MA&k+UDt2JHWOBS7D`(ZmCU?UgfA7C`hOh_3EJ zgugXODjw?iv;_gz64BbDt=xj0Lakjtm^kWKPFq?1T>+@#;tEFQ*cyqgYCB9GloQ&u zLvv5uZ;WP7lOgyoVu(kL*@SSZqC_CAmmk5keKhTg0X;UVdJ?p*gt%8%K3RAHoHHBH zUaMz0(}p$efRgc0do9@V691o?;S)y;H@}YpzopS9w8Hi$w4$cHQ*|%vu^mxpW}T!n G0`~vNWhGny diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 2221a64a..4425a60f 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -179,7 +179,7 @@ jfrog - central + skyflow-jfrog prekarilabs.jfrog.io-releases https://prekarilabs.jfrog.io/artifactory/skyflow-java diff --git a/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java b/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java index cceec8b8..d2c92a4c 100644 --- a/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java +++ b/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java @@ -60,9 +60,6 @@ public enum ErrorMessage { MissingIndexInBulkTokenizeRecord("%s0 Validation error. Index in BulkTokenizeRequestRecord is null. Specify an index for every record."), DuplicateIndexInBulkTokenizeRecord("%s0 Validation error. Duplicate index in BulkTokenizeRequestRecord. Specify a unique index for every record."), // Detect (flowvault only) - ReidentifyFileRequestNull("%s0 Validation error. ReidentifyFile request cannot be null."), - InvalidDataSourceInReidentifyFile("%s0 Validation error. Invalid dataSource in reidentify file request. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL."), - InvalidValueInReidentifyFile("%s0 Validation error. Invalid value in reidentify file request. Specify the non-empty base64 content, skyflow id or presigned URL of the file."), ; private final String message; diff --git a/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java b/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java index 3f86640d..573eb349 100644 --- a/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java +++ b/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java @@ -2,38 +2,15 @@ import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.detect.DeidentifyFileRequest; -import com.skyflow.detect.DeidentifyFileResponse; -import com.skyflow.detect.GetRunRequest; -import com.skyflow.detect.ReidentifyFileRequest; -import com.skyflow.detect.ReidentifyFileResponse; -import com.skyflow.detect.internal.DeidentifyFileFlow; -import com.skyflow.detect.internal.DetectRequestMapper; -import com.skyflow.detect.internal.DetectValidations; -import com.skyflow.detect.internal.ReidentifyFileMapper; -import com.skyflow.detect.internal.ReidentifyFileValidations; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.core.ApiClientException; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; -import com.skyflow.logs.ErrorLogs; -import com.skyflow.logs.InfoLogs; -import com.skyflow.utils.BaseConstants; import com.skyflow.utils.Utils; -import com.skyflow.utils.logger.LogUtil; /** * Skyflow Detect operations for a flowvault vault, returned by {@code Skyflow.detect()} and * {@code Skyflow.detect(vaultId)}. The shared Detect V2 methods are inherited from - * {@link BaseDetectController}; this class adds the flowvault-only {@link #deidentifyFile} and - * {@link #reidentifyFile} and - * supplies the flowvault URL rules, SDK metrics and the vault-level timeout and retry overrides - * from {@link VaultConfig}. + * {@link BaseDetectController} and shared with the skyvault SDK; this class only supplies the + * flowvault URL rules, SDK metrics and the vault-level timeout and retry overrides from + * {@link VaultConfig}. */ public final class DetectController extends BaseDetectController { private static final int DEFAULT_TIMEOUT_SECONDS = 60; @@ -85,95 +62,6 @@ protected Long effectiveMaxRetryDelayMillis() { DEFAULT_MAX_RETRY_DELAY_MILLIS); } - // ------------------------------------------------------------------ - // Flowvault-only Detect V2 operations - // ------------------------------------------------------------------ - - /** - * Detects and de-identifies sensitive data in a file. The API is asynchronous: by default this - * submits the run and returns its id for use with {@link #getRun}. With - * {@link DeidentifyFileRequest#getPollOptions() pollOptions} the SDK polls the run with exponential - * backoff and returns the completed run, or the run id with a non-terminal status if the budget - * runs out. On success, a request built from a local file has its outputs written to disk. - * - * @param request the file (base64, skyflow id, presigned URL, or a local file) plus a stored or inline configuration - * @return run id, and the run's status, outputs and metrics when polled - * @throws SkyflowException on validation failure, credential failure, an API error or an output write failure - */ - public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_TRIGGERED.getLog()); - LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_FILE_REQUEST.getLog()); - DetectValidations.validateDeidentifyFileRequest(request); - String token = resolveToken(); - DeidentifyFileRequestV2 apiRequest = DetectRequestMapper.toDeidentifyFileRequest(request, getVaultConfig().getVaultId()); - String runId; - try { - DeidentifyFileResponseV2 apiResponse = filesClient().deidentifyFileV2(apiRequest, requestOptions(token)); - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); - runId = apiResponse.getRunId().orElse(null); - } catch (ApiClientApiException e) { - LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), responseBody(e.body())); - } catch (ApiClientException e) { - LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e); - } - DeidentifyFileResponse response = DeidentifyFileFlow.complete(request, runId, - id -> getRun(GetRunRequest.builder().runId(id).build())); - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_SUCCESS.getLog()); - return response; - } - - /** - * Replaces tokens in a file with their original values or a redacted rendering. Synchronous: - * the re-identified file is returned in the response rather than through a run id. - * - * @param request the file (base64, skyflow id or presigned URL) plus optional per-group redaction rules - * @return status, output files and metrics - * @throws SkyflowException on validation failure, credential failure or an API error - */ - public ReidentifyFileResponse reidentifyFile(ReidentifyFileRequest request) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_TRIGGERED.getLog()); - LogUtil.printInfoLog(InfoLogs.VALIDATE_REIDENTIFY_FILE_REQUEST.getLog()); - ReidentifyFileValidations.validateReidentifyFileRequest(request); - String token = resolveToken(); - ReidentifyFileRequestV2 apiRequest = ReidentifyFileMapper.toApiRequest(request, getVaultConfig().getVaultId()); - try { - ReidentifyFileResponseV2 apiResponse = filesClient().reidentifyFileV2(apiRequest, requestOptions(token)); - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); - ReidentifyFileResponse response = ReidentifyFileMapper.toResponse(apiResponse); - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_SUCCESS.getLog()); - return response; - } catch (ApiClientApiException e) { - LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), responseBody(e.body())); - } catch (ApiClientException e) { - LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e); - } - } - - private RequestOptions requestOptions(String token) { - return RequestOptions.builder() - .addHeader("Authorization", "Bearer " + token) - .addHeader(BaseConstants.SDK_METRICS_HEADER_KEY, getSdkMetrics()) - .build(); - } - - private static String responseBody(Object body) { - if (body == null) { - return null; - } - if (body instanceof String) { - return (String) body; - } - try { - return ObjectMappers.JSON_MAPPER.writeValueAsString(body); - } catch (Exception ex) { - return body.toString(); - } - } - private static T firstNonNull(T vaultLevel, T clientLevel, T defaultValue) { if (vaultLevel != null) { return vaultLevel; diff --git a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index f21fe9f3..0af983c8 100644 --- a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -28,7 +28,6 @@ import com.skyflow.detect.ReidentifyStringResponse; import com.skyflow.enums.Env; import com.skyflow.errors.BaseErrorMessage; -import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; import okhttp3.mockwebserver.MockResponse; @@ -159,10 +158,10 @@ public void reidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowEx ReidentifyFileRequest.builder().value("Zm9v").build(), ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value(" ").build(), }; - ErrorMessage[] expected = { - ErrorMessage.ReidentifyFileRequestNull, - ErrorMessage.InvalidDataSourceInReidentifyFile, - ErrorMessage.InvalidValueInReidentifyFile, + BaseErrorMessage[] expected = { + BaseErrorMessage.ReidentifyFileRequestNull, + BaseErrorMessage.InvalidDataSourceInReidentifyFile, + BaseErrorMessage.InvalidValueInReidentifyFile, }; for (int i = 0; i < bad.length; i++) { try { diff --git a/skyvault/README.md b/skyvault/README.md index e996553a..b5302dd5 100644 --- a/skyvault/README.md +++ b/skyvault/README.md @@ -44,12 +44,12 @@ The Skyflow Java SDK is designed to help with integrating Skyflow into a Java ba - [Upload File](#upload-file) - [Detect](#detect) - - [Deidentify Text](#deidentify-text) - - [Reidentify Text](#reidentify-text) - - [Deidentify File](#deidentify-file) - - [Get Run](#get-run) - - [Detect response types](#detect-response-types) - - [Detect enums](#detect-enums) + - [Deidentify string](#deidentify-string) + - [Deidentify file](#deidentify-file) + - [Reidentify string](#reidentify-string) + - [Reidentify file](#reidentify-file) + - [Get run](#get-run) + - [Check guardrails](#check-guardrails) - [Connections](#connections) - [ConnectionController](#connectioncontroller) - [Invoke a connection](#invoke-a-connection) @@ -1664,754 +1664,277 @@ Sample response: ``` # Detect -Skyflow Detect enables you to deidentify and reidentify sensitive data in text and files, supporting advanced privacy-preserving workflows. -`DetectController` is the class returned by `skyflowClient.detect()` and `skyflowClient.detect(vaultId)`. +Skyflow Detect finds and de-identifies sensitive data in free text, then re-identifies it on demand. The skyvault SDK exposes the Detect V2 API through `DetectController`, returned by `skyflowClient.detect()` and `skyflowClient.detect(vaultId)`. Every request is scoped to that vault, and the controller honours the same credentials, timeouts and retries as `vault()`. -```java -// Uses the default (first configured) vault -DetectController detect = skyflowClient.detect(); - -// Uses a specific vault by ID -DetectController detect = skyflowClient.detect(""); -``` +Detect configurations are created in Studio or through the management API. The SDK does not create, update or delete them. -**Methods:** +| Method | Request | Response | Description | +|--------|---------|----------|-------------| +| `deidentifyString(DeidentifyStringRequest)` | `com.skyflow.detect.DeidentifyStringRequest` | `com.skyflow.detect.DeidentifyStringResponse` | Detect and replace sensitive data in a string | +| `deidentifyFile(DeidentifyFileRequest)` | `com.skyflow.detect.DeidentifyFileRequest` | `com.skyflow.detect.DeidentifyFileResponse` | Submit a file for de-identification, optionally polling the run to completion | +| `reidentifyString(ReidentifyStringRequest)` | `com.skyflow.detect.ReidentifyStringRequest` | `com.skyflow.detect.ReidentifyStringResponse` | Replace tokens in a string with their original or redacted values | +| `reidentifyFile(ReidentifyFileRequest)` | `com.skyflow.detect.ReidentifyFileRequest` | `com.skyflow.detect.ReidentifyFileResponse` | Replace tokens in a file with their original or redacted values | +| `getRun(GetRunRequest)` | `com.skyflow.detect.GetRunRequest` | `com.skyflow.detect.GetRunResponse` | Retrieve the status and outputs of a Detect file run | +| `checkGuardrails(CheckGuardrailsRequest)` | `com.skyflow.detect.CheckGuardrailsRequest` | `com.skyflow.detect.CheckGuardrailsResponse` | Screen text for toxicity and denied topics | -| Method | Parameters | Returns | Description | -|--------|-----------|---------|-------------| -| `deidentifyText(DeidentifyTextRequest)` | [`DeidentifyTextRequest`](../docs/api_reference.md#deidentifytextrequest) | [`DeidentifyTextResponse`](../docs/api_reference.md#deidentifytextresponse) | Deidentify sensitive entities in text | -| `reidentifyText(ReidentifyTextRequest)` | [`ReidentifyTextRequest`](../docs/api_reference.md#reidentifytextrequest) | [`ReidentifyTextResponse`](../docs/api_reference.md#reidentifytextresponse) | Restore original values from a deidentified text | -| `deidentifyFile(DeidentifyFileRequest)` | [`DeidentifyFileRequest`](../docs/api_reference.md#deidentifyfilerequest) | [`DeidentifyFileResponse`](../docs/api_reference.md#deidentifyfileresponse) | Deidentify sensitive data in a file | -| `getDetectRun(GetDetectRunRequest)` | [`GetDetectRunRequest`](../docs/api_reference.md#getdetectrunrequest) | [`DeidentifyFileResponse`](../docs/api_reference.md#deidentifyfileresponse) | Poll for the result of an async file deidentification | +> Detect V2 is in beta. -## Deidentify Text -To deidentify text, use the `deidentifyText` method. [`DeidentifyTextRequest`](../docs/api_reference.md#deidentifytextrequest) accepts the text to deidentify along with optional entity types, regex lists, token format, and transformations. Returns a [`DeidentifyTextResponse`](../docs/api_reference.md#deidentifytextresponse). +## Deidentify string -### Construct an deidentify text request +`DeidentifyStringRequest` takes the text plus, optionally, `configurationId` (a stored Detect configuration) and/or `configuration` (an inline `DetectConfiguration`). Both are optional on the API and are sent exactly as supplied. The SDK fills the vault id from the controller. ```java -import com.skyflow.enums.DetectEntities; -import com.skyflow.vault.detect.DateTransformation; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.TokenFormat; -import com.skyflow.vault.detect.Transformations; -import com.skyflow.vault.detect.DeidentifyTextResponse; - -import java.util.ArrayList; -import java.util.List; - -/** - * This example demonstrate to build deidentify text request. - */ -public class DeidentifyTextSchema { - - public static void main(String[] args) { - - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Configure the options for deidentify text - - // Replace with the entity you want to detect - List detectEntitiesList = new ArrayList<>(); - detectEntitiesList.add(DetectEntities.SSN); - - // Replace with the entity you want to detect with vault token - List vaultTokenList = new ArrayList<>(); - vaultTokenList.add(DetectEntities.CREDIT_CARD); - - // Replace with the entity you want to detect with entity only - List entityOnlyList = new ArrayList<>(); - entityOnlyList.add(DetectEntities.SSN); - - // Replace with the entity you want to detect with entity unique counter - List entityUniqueCounterList = new ArrayList<>(); - entityUniqueCounterList.add(DetectEntities.SSN); - - // Replace with the regex patterns you want to allow during deidentification - List allowRegexList = new ArrayList<>(); - allowRegexList.add(""); - - // Replace with the regex patterns you want to restrict during deidentification - List restrictRegexList = new ArrayList<>(); - restrictRegexList.add("YOUR_RESTRICT_REGEX_LIST"); - - // Configure Token Format - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) - .entityOnly(entityOnlyList) - .entityUniqueCounter(entityUniqueCounterList) - .build(); - - // Configure Transformation - List detectEntitiesTransformationList = new ArrayList<>(); - detectEntitiesTransformationList.add(DetectEntities.DOB); // Replace with the entity you want to transform - - DateTransformation dateTransformation = new DateTransformation(20, 5, detectEntitiesTransformationList); - Transformations transformations = new Transformations(dateTransformation); - - // Step 3: Create a deidentify text request for the vault - DeidentifyTextRequest deidentifyTextRequest = DeidentifyTextRequest.builder() - .text("") // Replace with the text you want to deidentify - .entities(detectEntitiesList) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); +import com.skyflow.detect.*; + +// Stored configuration +DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text("My name is John Doe, and my email is johndoe@acme.com.") + .configurationId("") + .build()); + +System.out.println(response.getProcessedText()); +// My name is [NAME_1], and my email is [EMAIL_ADDRESS_1]. + +// Inline configuration +DetectConfiguration configuration = DetectConfiguration.builder() + .detect(Detect.builder() + .entities(Arrays.asList( + Entity.builder() + .entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination(".") // skyvault: table.column that stores the value + .build(), + Entity.builder() + .entityType(EntityType.ALL) + .deidentificationType(DeidentificationType.ENTITY_UNIQUE_COUNTER) + .build())) + .skip(Collections.singletonList("Skyflow")) + .returnEntities(ReturnEntitiesType.EXCLUDE_SENSITIVE_DATA) + .build()) + .build(); - // Step 4: Use the Skyflow client to perform the deidentifyText operation - // Replace with your actual vault ID - DeidentifyTextResponse deidentifyTextResponse = skyflowClient.detect("").deidentifyText(deidentifyTextRequest); +response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text("My name is John Doe, and my email is johndoe@acme.com.") + .configuration(configuration) + .build()); - // Step 5: Print the response - System.out.println("Deidentify text Response: " + deidentifyTextResponse); - } +for (DetectedEntity entity : response.getEntities()) { + System.out.println(entity.getEntityType() + " " + entity.getToken() + + " [" + entity.getLocation().getStartIndex() + "," + entity.getLocation().getEndIndex() + "]"); } - +System.out.println(response.getMetrics().getWordCount()); ``` -## An [example](https://github.com/skyflowapi/skyflow-java/blob/main/samples/src/main/java/com/example/detect/DeidentifyTextExample.java) of deidentify text: -```java -import java.util.ArrayList; -import java.util.List; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DateTransformation; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.DeidentifyTextResponse; -import com.skyflow.vault.detect.TokenFormat; -import com.skyflow.vault.detect.Transformations; - -/** - * Skyflow Deidentify Text Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify text data - * across multiple vaults. It includes: - * 1. Setting up credentials and vault configurations. - * 2. Creating a Skyflow client with multiple vaults. - * 3. Performing deidentify of text with various options. - * 4. Handling responses and errors. - */ - -public class DeidentifyTextExample { - public static void main(String[] args) throws SkyflowException { - - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Configuring the different options for deidentify - - // Replace with the entity you want to detect - List detectEntitiesList = new ArrayList<>(); - detectEntitiesList.add(DetectEntities.SSN); - detectEntitiesList.add(DetectEntities.CREDIT_CARD); - - // Replace with the entity you want to detect with vault token - List vaultTokenList = new ArrayList<>(); - vaultTokenList.add(DetectEntities.SSN); - vaultTokenList.add(DetectEntities.CREDIT_CARD); - - // Configure Token Format - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) - .build(); - - // Configure Transformation for deidentified entities - List detectEntitiesTransformationList = new ArrayList<>(); - detectEntitiesTransformationList.add(DetectEntities.DOB); // Replace with the entity you want to transform +`DeidentifyStringResponse` carries `getProcessedText()`, `getEntities()` (a `List` with token, entity type, location and confidence scores; never `null`) and `getMetrics()`. - DateTransformation dateTransformation = new DateTransformation(20, 5, detectEntitiesTransformationList); - Transformations transformations = new Transformations(dateTransformation); - - // Step 3: invoking Deidentify text on the vault - try { - // Create a deidentify text request for the vault - DeidentifyTextRequest deidentifyTextRequest = DeidentifyTextRequest.builder() - .text("My SSN is 123-45-6789 and my card is 4111 1111 1111 1111.") // Replace with your deidentify text - .entities(detectEntitiesList) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); - // Replace `9f27764a10f7946fe56b3258e117` with the actual vault id - DeidentifyTextResponse deidentifyTextResponse = skyflowClient.detect("9f27764a10f7946fe56b3258e117").deidentifyText(deidentifyTextRequest); - - System.out.println("Deidentify text Response: " + deidentifyTextResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify: "); - e.printStackTrace(); // Print the exception for debugging purposes - } - } -} -``` - -Sample Response: -```json -{ - "processedText": "My SSN is [SSN_IWdexZe] and my card is [CREDIT_CARD_rUzMjdQ].", - "entities": [ - { - "token": "SSN_IWdexZe", - "value": "123-45-6789", - "textIndex": { - "start": 10, - "end": 21 - }, - "processedIndex": { - "start": 10, - "end": 23 - }, - "entity": "SSN", - "scores": { - "SSN": 0.9384 - } - }, - { - "token": "CREDIT_CARD_rUzMjdQ", - "value": "4111 1111 1111 1111", - "textIndex": { - "start": 37, - "end": 56 - }, - "processedIndex": { - "start": 39, - "end": 60 - }, - "entity": "CREDIT_CARD", - "scores": { - "CREDIT_CARD": 0.9051 - } - } - ], - "wordCount": 9, - "charCount": 57 -} -``` - -## Reidentify Text -To reidentify text, use the `reidentifyText` method. [`ReidentifyTextRequest`](../docs/api_reference.md#reidentifytextrequest) accepts the redacted/deidentified text and optional entity lists controlling which entities to reveal, mask, or keep redacted. Returns a [`ReidentifyTextResponse`](../docs/api_reference.md#reidentifytextresponse). - -### Construct an reidentify text request - -```java -import com.skyflow.enums.DetectEntities; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.ReidentifyTextResponse; - -import java.util.ArrayList; -import java.util.List; - -/** - * This example demonstrates how to build a reidentify text request. - */ -public class ReidentifyTextSchema { - public static void main(String[] args) { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Configuring the different options for reidentify - List maskedEntity = new ArrayList<>(); - maskedEntity.add(DetectEntities.CREDIT_CARD); // Replace with the entity you want to mask - - List plainTextEntity = new ArrayList<>(); - plainTextEntity.add(DetectEntities.SSN); // Replace with the entity you want to keep in plain text - - // List redactedEntity = new ArrayList<>(); - // redactedEntity.add(DetectEntities.SSN); // Replace with the entity you want to redact +## Deidentify file +File de-identification is asynchronous on the API: the submit call returns a run id and the result is retrieved from the run. `deidentifyFile` exposes both modes. - // Step 3: Create a reidentify text request with the configured entities - ReidentifyTextRequest reidentifyTextRequest = ReidentifyTextRequest.builder() - .text("My SSN is [SSN_IWdexZe] and my card is [CREDIT_CARD_rUzMjdQ].") // Replace with your deidentify text - .maskedEntities(maskedEntity) -// .redactedEntities(redactedEntity) - .plainTextEntities(plainTextEntity) - .build(); +- **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). +- **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. - // Step 4: Invoke reidentify text on the vault - ReidentifyTextResponse reidentifyTextResponse = skyflowClient.detect("").reidentifyText(reidentifyTextRequest); - System.out.println("Reidentify text Response: " + reidentifyTextResponse); - } -} -``` - -## An [example](https://github.com/skyflowapi/skyflow-java/blob/main/samples/src/main/java/com/example/detect/ReidentifyTextExample.java) of Reidentify text +The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. Either `configurationId` or an inline `configuration` is passed through as given. ```java -import com.skyflow.enums.DetectEntities; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.ReidentifyTextResponse; - -import java.util.ArrayList; -import java.util.List; - -/** - * Skyflow Reidentify Text Example - *

- * This example demonstrates how to use the Skyflow SDK to reidentify text data - * across multiple vaults. It includes: - * 1. Setting up credentials and vault configurations. - * 2. Creating a Skyflow client with multiple vaults. - * 3. Performing reidentify of text with various options. - * 4. Handling responses and errors. - */ - -public class ReidentifyTextExample { - public static void main(String[] args) throws SkyflowException { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Configuring the different options for reidentify - List maskedEntity = new ArrayList<>(); - maskedEntity.add(DetectEntities.CREDIT_CARD); // Replace with the entity you want to mask - - List plainTextEntity = new ArrayList<>(); - plainTextEntity.add(DetectEntities.SSN); // Replace with the entity you want to keep in plain text - - try { - // Step 3: Create a reidentify text request with the configured options - ReidentifyTextRequest reidentifyTextRequest = ReidentifyTextRequest.builder() - .text("My SSN is [SSN_IWdexZe] and my card is [CREDIT_CARD_rUzMjdQ].") // Replace with your deidentify text - .maskedEntities(maskedEntity) - .plainTextEntities(plainTextEntity) - .build(); - - // Step 4: Invoke Reidentify text on the vault - // Replace `9f27764a10f7946fe56b3258e117` with the actual vault id - ReidentifyTextResponse reidentifyTextResponse = skyflowClient.detect("9f27764a10f7946fe56b3258e117").reidentifyText(reidentifyTextRequest); - - // Handle the response from the reidentify text request - System.out.println("Reidentify text Response: " + reidentifyTextResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during reidentify : "); - e.printStackTrace(); - } - } +// Submit only +DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") // BASE64 + pdf inferred + .configurationId("") + .build()); +String runId = submitted.getRunId(); + +// Submit and poll +DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(120).build()) + .outputDirectory("/data/processed") // optional + .build()); + +switch (response.getStatus()) { + case SUCCESS: + // For file-based requests the outputs are already on disk: + // /data/processed/processed-patient-notes.pdf the redacted file + // /data/processed/processed-entities-patient-notes.json the detected entities + // response.getOutput() and getMetrics() carry the same data. + break; + case FAILED: + System.err.println(response.getMessage()); + break; + default: // IN_PROGRESS or QUEUED: budget ran out, resume with getRun(runId) + break; } ``` -Sample Response: +Outputs are written only when polling reached `SUCCESS`, the request was built from a local file, and the run delivered them as base64. A request built from a `SKYFLOW_ID` or `PRESIGNED_URL` has no local name to derive from, and presigned-URL outputs are not fetched, so in those cases read `getOutput()` and write the files yourself. Files are named `processed-.`, with the entities output as `processed-entities-.json` (and `processed-object-entities-.json` for object entities); `outputDirectory` is created if missing and defaults to the working directory. Polling blocks the calling thread. -```json -{ - "processedText":"My SSN is 123-45-6789 and my card is XXXXX1111." -} -``` - -## Deidentify file -To deidentify files, use the `deidentifyFile` method. [`DeidentifyFileRequest`](../docs/api_reference.md#deidentifyfilerequest) accepts a [`FileInput`](../docs/api_reference.md#fileinput) and optional parameters controlling entity detection, masking, output format, and async wait time. Supports images, PDFs, audio, documents, spreadsheets, and presentations. Returns a [`DeidentifyFileResponse`](../docs/api_reference.md#deidentifyfileresponse). - -### AudioBleep - -[`AudioBleep`](../docs/api_reference.md#audiobleep) controls how detected sensitive audio segments are replaced with a bleep tone. Used in `DeidentifyFileRequest.builder().bleep(audioBleep)` for audio files. - -```java -import com.skyflow.vault.detect.AudioBleep; +### Polling from a worker thread -AudioBleep audioBleep = AudioBleep.builder() - .frequency(1000D) // bleep tone frequency in Hz - .gain(0.5D) // bleep tone gain (volume level) - .startPadding(0.2D) // silence padding before the bleep (seconds) - .stopPadding(0.2D) // silence padding after the bleep (seconds) - .build(); -``` +With `pollOptions` set, `deidentifyFile` polls on the thread that called it: each lookup is a synchronous `getRun` followed by a sleep, until the run is terminal or the budget runs out. No other thread, lock or connection is held while it waits, so other SDK calls are unaffected, but the calling thread is. If that thread is your main thread, a request thread or an event loop, run the call elsewhere. -### Construct an deidentify file request +**Run the blocking call on a thread you own.** Simplest when you process a few files at a time. The SDK still enforces the budget and writes outputs to disk; your thread is parked for the whole poll. ```java -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; - -import java.io.File; - -/** - * This example demonstrates how to build a deidentify file request. - */ - -public class DeidentifyFileSchema { - - public static void main(String[] args) { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Create a deidentify file request with all options - - // Create file object - File file = new File(""); // Replace with the path to the file you want to deidentify - - // Create file input using the file object - FileInput fileInput = FileInput.builder() - .file(file) - // .filePath("") // Alternatively, you can use .filePath() - .build(); - - // Output configuration - String outputDirectory = ""; // Replace with the desired output directory to save the deidentified file - - // Entities to detect - // List detectEntities = new ArrayList<>(); - // detectEntities.add(DetectEntities.IP_ADDRESS); // Replace with the entities you want to detect - - // Image-specific options - // Boolean outputProcessedImage = true; // Include processed image in output - // Boolean outputOcrText = true; // Include OCR text in output - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; // Masking method for images - - // PDF-specific options - // Integer pixelDensity = 15; // Pixel density for PDF processing - // Integer maxResolution = 2000; // Max resolution for PDF - - // Audio-specific options - // Boolean outputProcessedAudio = true; // Include processed audio - // DetectOutputTranscriptions outputTanscription = DetectOutputTranscriptions.PLAINTEXT_TRANSCRIPTION; // Transcription type - - // Audio bleep configuration - // AudioBleep audioBleep = AudioBleep.builder() - // .frequency(5D) // Pitch in Hz - // .startPadding(7D) // Padding at start (seconds) - // .stopPadding(8D) // Padding at end (seconds) - // .build(); - - Integer waitTime = 20; // Max wait time for response (max 64 seconds) - - DeidentifyFileRequest deidentifyFileRequest = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(waitTime) - .entities(detectEntities) - .outputDirectory(outputDirectory) - .maskingMethod(maskingMethod) - // .outputProcessedImage(outputProcessedImage) - // .outputOcrText(outputOcrText) - // .pixelDensity(pixelDensity) - // .maxResolution(maxResolution) - // .outputProcessedAudio(outputProcessedAudio) - // .outputTranscription(outputTanscription) - // .bleep(audioBleep) - .build(); - - - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect("").deidentifyFile(deidentifyFileRequest); - System.out.println("Deidentify file response: " + deidentifyFileResponse.toString()); +ExecutorService pool = Executors.newFixedThreadPool(4); // or Executors.newVirtualThreadPerTaskExecutor() on JDK 21+ + +pool.execute(() -> { + try { + DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(120).build()) + .outputDirectory("/data/processed") + .build()); + handle(response); // SUCCESS, FAILED, UNKNOWN, or IN_PROGRESS/QUEUED if the budget ran out + } catch (SkyflowException e) { + handleError(e); // catch inside the task; an uncaught exception only ends this thread } -} +}); ``` -## An [example](https://github.com/skyflowapi/skyflow-java/blob/main/samples/src/main/java/com/example/detect/DeidentifyFileExample.java) of Deidentify file +Use `pool.submit(...)` instead of `execute` if you want a `Future` to cancel with: interrupting the thread wakes the sleep and the SDK returns the last run it saw. Bound the pool, since every in-flight run parks one thread. + +**Submit only, then poll `getRun` on a scheduler.** Best for services and anything concurrent. No thread is held between lookups, so one scheduler thread serves any number of runs. You control the backoff and budget, and you write the outputs yourself since the SDK only writes them when it polls. ```java -import java.io.File; +ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; +String runId = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .build()) // no pollOptions: returns the run id immediately + .getRunId(); -/** - * Skyflow Deidentify File Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify file - * It has all available options for deidentifying files. - * Supported file types: images (jpg, png, etc.), pdf, audio (mp3, wav), documents, spreadsheets, presentations, structured text. - * It includes: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a deidentify file request with all options - * 4. Call deidentifyFile to deidentify file. - * 5. Handle response and errors - */ -public class DeidentifyFileExample { +scheduler.schedule(new Runnable() { + long delaySeconds = 1; - public static void main(String[] args) throws SkyflowException { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. + @Override + public void run() { try { - // Step 2: Create a deidentify file request with all options - - - // Create file object - File file = new File("sensitive-folder/personal-info.txt"); // Replace with the path to the file you want to deidentify - - // Create file input using the file object - FileInput fileInput = FileInput.builder() - .file(file) - // .filePath("") // Alternatively, you can use .filePath() - .build(); - - // Output configuration - String outputDirectory = "deidentified-file/"; // Replace with the desired output directory to save the deidentified file - - // Entities to detect - // List detectEntities = new ArrayList<>(); - // detectEntities.add(DetectEntities.IP_ADDRESS); // Replace with the entities you want to detect - - // Image-specific options - // Boolean outputProcessedImage = true; // Include processed image in output - // Boolean outputOcrText = true; // Include OCR text in output - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; // Masking method for images - - Integer waitTime = 20; // Max wait time for response (max 64 seconds) - - DeidentifyFileRequest deidentifyFileRequest = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(waitTime) - .outputDirectory(outputDirectory) - .maskingMethod(maskingMethod) - .build(); - - // Step 3: Invoking deidentifyFile - // Replace `9f27764a10f7946fe56b3258e117` with the actual vault id - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect("9f27764a10f7946fe56b3258e117").deidentifyFile(deidentifyFileRequest); - System.out.println("Deidentify file response: " + deidentifyFileResponse.toString()); + GetRunResponse run = skyflowClient.detect().getRun(GetRunRequest.builder().runId(runId).build()); + switch (run.getStatus()) { + case SUCCESS: case FAILED: case UNKNOWN: + handle(run); + return; + default: // QUEUED, IN_PROGRESS + scheduler.schedule(this, delaySeconds, TimeUnit.SECONDS); + delaySeconds = Math.min(delaySeconds * 2, 32); + } } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify file: "); - e.printStackTrace(); + handleError(e); } } -} - -``` - -Sample response: - -```json -{ - "file": { - "name": "deidentified.txt", - "size": 33, - "type": "", - "lastModified": 1751355183039 - }, - "fileBase64": "bXkgY2FyZCBudW1iZXIgaXMgW0NSRURJVF", - "type": "redacted_file", - "extension": "txt", - "wordCount": 11, - "charCount": 61, - "sizeInKb": 0, - "entities": [ - { - "file": "bmFtZTogW05BTUVfMV0gCm==", - "type": "entities", - "extension": "json" - } - ], - "runId": "undefined", - "status": "success" -} - +}, 0, TimeUnit.SECONDS); ``` -**Supported file types:** -- Documents: `doc`, `docx`, `pdf` -- PDFs: `pdf` -- Images: `bmp`, `jpeg`, `jpg`, `png`, `tif`, `tiff` -- Structured text: `json`, `xml` -- Spreadsheets: `csv`, `xls`, `xlsx` -- Presentations: `ppt`, `pptx` -- Audio: `mp3`, `wav` +Either way the main thread only pays for the submit round trip. Avoid `new Thread(...)` per file or `CompletableFuture.runAsync` on the common pool for anything that runs at scale: the first has no bound on threads, and the second blocks a shared pool sized for CPU work. -**Note:** -- Transformations cannot be applied to Documents, Images, or PDFs file formats. +## Reidentify string -- The `waitTime` option must be ≤ 64 seconds; otherwise, an error is thrown. - -- If the API takes more than 64 seconds to process the file, it will return only the run ID in the response. - -Sample response (when the API takes more than 64 seconds): -```json -{ - "file": null, - "fileBase64": null, - "type": null, - "extension": null, - "wordCount": null, - "charCount": null, - "sizeInKb": null, - "durationInSeconds": null, - "pageCount": null, - "slideCount": null, - "entities": null, - "runId": "1273a8c6-c498-4293-a9d6-389864cd3a44", - "status": "IN_PROGRESS", - "errors": null -} -``` - -## Get run: -To retrieve the results of a previously started file deidentification operation, use the `getDetectRun` method. [`GetDetectRunRequest`](../docs/api_reference.md#getdetectrunrequest) accepts the `runId` returned from a prior `deidentifyFile` call. Returns a [`DeidentifyFileResponse`](../docs/api_reference.md#deidentifyfileresponse). - -### Construct an get run request +`ReidentifyStringRequest` takes the tokenized text and an optional list of `RedactionLevel` rules. For skyvault vaults each rule names an `entityName` and the `redactionType` to apply to it: `PLAIN_TEXT` reveals the original value, `MASKED` masks it, `REDACTED` keeps the token, `DEFAULT` applies the vault's default. Without rules every token is replaced by its original value. ```java -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.GetDetectRunRequest; - -/** - * Skyflow Get Detect Run Example - */ - -public class GetDetectRunSchema { - - public static void main(String[] args) { - try { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Create a get detect run request - GetDetectRunRequest getDetectRunRequest = GetDetectRunRequest.builder() - .runId("") // Replace with the runId from deidentifyFile call - .build(); - - // Step 3: Call getDetectRun to poll for file processing results - // Replace with your actual vault ID - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect("").getDetectRun(getDetectRunRequest); - System.out.println("Get Detect Run Response: " + deidentifyFileResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during get detect run: "); - e.printStackTrace(); - } - } -} +ReidentifyStringResponse response = skyflowClient.detect().reidentifyString( + ReidentifyStringRequest.builder() + .text("My name is [NAME_1] and my email is [EMAIL_ADDRESS_1].") + .redactionLevel(Arrays.asList( + RedactionLevel.builder() + .entityName(EntityType.NAME) + .redactionType(RedactionType.PLAIN_TEXT) + .build(), + RedactionLevel.builder() + .entityName(EntityType.EMAIL_ADDRESS) + .redactionType(RedactionType.MASKED) + .build())) + .build()); +System.out.println(response.getProcessedText()); +// My name is John Doe and my email is j*******@acme.com. ``` -## An [example](https://github.com/skyflowapi/skyflow-java/blob/main/samples/src/main/java/com/example/detect/GetDetectRunExample.java) of get run -```java -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.GetDetectRunRequest; +A `RedactionLevel` is expected to name one source (`entityName`) and one replacement (`redactionType`). Every field is optional on the API, so the SDK passes the list through as given and the server enforces the combination rules. The `tokenGroupName` and `redactionPattern` fields apply to flowvault vaults only. -/** - * Skyflow Get Detect Run Example - *

- * This example demonstrates how to: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a get detect run request - * 4. Call getDetectRun to poll for file processing results - * 5. Handle response and errors - */ -public class GetDetectRunExample { - public static void main(String[] args) throws SkyflowException { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - try { +## Reidentify file - // Step 2: Create a get detect run request - GetDetectRunRequest getDetectRunRequest = GetDetectRunRequest.builder() - .runId("e0038196-4a20-422b-bad7-e0477117f9bb") // Replace with the runId from deidentifyFile call - .build(); +`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. Re-identification supports text-based formats such as TXT, CSV, JSON, JSONL, XML, DOCX, XLSX and PPTX. - // Step 3: Call getDetectRun to poll for file processing results - // Replace `9f27764a10f7946fe56b3258e117` with the actual vault id - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect("9f27764a10f7946fe56b3258e117").getDetectRun(getDetectRunRequest); - System.out.println("Get Detect Run Response: " + deidentifyFileResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during get detect run: "); - e.printStackTrace(); - } - } -} -``` - -Sample Response: - -```json -{ - "file": "bmFtZTogW05BTET0JfMV0K", - "type": "redacted_file", - "extension": "txt", - "wordCount": 11, - "charCount": 61, - "sizeInKb": 0.0, - "entities": [ - { - "file": "gW05BTUVfMV0gCmNhcmQ0K", - "type": "entities", - "extension": "json" +```java +byte[] content = Files.readAllBytes(Paths.get("tokenized.txt")); + +ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( + ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64) + .value(Base64.getEncoder().encodeToString(content)) + .dataFormat(FileDataFormat.TXT) + .redactionLevel(Collections.singletonList( + RedactionLevel.builder() + .entityName(EntityType.NAME) + .redactionType(RedactionType.PLAIN_TEXT) + .build())) + .build()); + +if (response.getStatus() == DetectRunStatus.SUCCESS) { + for (FileOutput output : response.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per response.getOutputType() + byte[] processed = Base64.getDecoder().decode(output.getProcessedFile()); } - ], - "runId": "e0038196-4a20-422b-bad7-e0477117f9bb", - "status": "success" } - ``` -## Detect response types +`ReidentifyFileResponse` carries `getStatus()`, `getOutputType()`, `getOutput()` (never `null`) and `getMetrics()`. -The Detect API returns structured objects for detected entities. See the API Reference for full attribute lists: [`EntityInfo`](../docs/api_reference.md#entityinfo), [`TextIndex`](../docs/api_reference.md#textindex), [`FileEntityInfo`](../docs/api_reference.md#fileentityinfo), [`FileInfo`](../docs/api_reference.md#fileinfo). +## Get run -### EntityInfo and TextIndex - -[`EntityInfo`](../docs/api_reference.md#entityinfo) appears in `DeidentifyTextResponse.getEntities()`. Each entry includes the detected entity type, original value, replacement token, character positions ([`TextIndex`](../docs/api_reference.md#textindex)), and confidence scores. +File de-identification is asynchronous: the submit call returns a run id, and `getRun` retrieves the run's status and, once it has succeeded, its outputs. `GetRunResponse.getOutput()` is empty and `getOutputType()` and `getMetrics()` are `null` until the run completes. ```java -DeidentifyTextResponse response = skyflowClient.detect("").deidentifyText(request); - -for (EntityInfo entity : response.getEntities()) { - System.out.println("Entity : " + entity.getEntity()); - System.out.println("Value : " + entity.getValue()); - System.out.println("Token : " + entity.getToken()); - System.out.println("Start : " + entity.getTextIndex().getStart()); - System.out.println("End : " + entity.getTextIndex().getEnd()); - System.out.println("Score : " + entity.getScores().get(entity.getEntity())); +GetRunResponse run = skyflowClient.detect().getRun( + GetRunRequest.builder().runId("").build()); + +switch (run.getStatus()) { + case SUCCESS: + for (FileOutput output : run.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per run.getOutputType() + // output.getProcessedFileType() is e.g. REDACTED_FILE or ENTITIES + // output.getProcessedFileExtension() is a FileDataFormat such as PDF + } + break; + case FAILED: + System.err.println(run.getMessage()); + break; + default: // QUEUED, IN_PROGRESS, UNKNOWN + // poll again later } ``` -### FileEntityInfo and FileInfo - -[`FileEntityInfo`](../docs/api_reference.md#fileentityinfo) appears in `DeidentifyFileResponse.getEntities()`. [`FileInfo`](../docs/api_reference.md#fileinfo) is returned by `DeidentifyFileResponse.getFile()` and contains file metadata. - -## Detect enums - -See the API Reference for full value descriptions: [`TokenType`](../docs/api_reference.md#tokentype), [`DeidentifyFileStatus`](../docs/api_reference.md#deidentifyfilestatus), [`DetectOutputTranscriptions`](../docs/api_reference.md#detectoutputtranscriptions), [`MaskingMethod`](../docs/api_reference.md#maskingmethod), [`DetectEntities`](../docs/api_reference.md#detectentities). +## Check guardrails -### TokenType - -[`TokenType`](../docs/api_reference.md#tokentype) controls how detected entities are tokenized. Used in `TokenFormat.builder()`. - -```java -import com.skyflow.enums.TokenType; - -TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) // uses VAULT_TOKEN - .entityOnly(entityOnlyList) // uses ENTITY_ONLY - .entityUniqueCounter(entityUniqueCounterList) // uses ENTITY_UNIQUE_COUNTER - .build(); -``` - -### DeidentifyFileStatus - -[`DeidentifyFileStatus`](../docs/api_reference.md#deidentifyfilestatus) is returned in `DeidentifyFileResponse.getStatus()` to indicate async processing state. +`checkGuardrails` screens text for toxicity and for a list of denied topics, which makes it a natural pre-LLM check. Each check runs only when requested: `getToxic()` is `null` unless `checkToxicity(true)` was set, and `getDeniedTopic()` is `null` unless `denyTopics` was supplied. `getValidation()` is `FAILED` if any requested check triggered. ```java -import com.skyflow.enums.DeidentifyFileStatus; - -DeidentifyFileResponse response = skyflowClient.detect("").getDetectRun(request); -if (DeidentifyFileStatus.SUCCESS.value().equals(response.getStatus())) { - // safe to read response.getFile() -} else if (DeidentifyFileStatus.IN_PROGRESS.value().equals(response.getStatus())) { - // poll again using the runId +CheckGuardrailsResponse response = skyflowClient.detect().checkGuardrails( + CheckGuardrailsRequest.builder() + .text(userPrompt) + .checkToxicity(true) + .denyTopics(Arrays.asList("politics", "medical advice")) + .build()); + +if (response.getValidation() == GuardrailsValidation.FAILED) { + throw new IllegalArgumentException("blocked: toxic=" + response.getToxic() + " deniedTopic=" + response.getDeniedTopic()); } ``` -### DetectOutputTranscriptions +All Detect methods throw `SkyflowException` as described in [Error Handling](#error-handling). Client-side validation fails before any network call. -[`DetectOutputTranscriptions`](../docs/api_reference.md#detectoutputtranscriptions) controls the transcription format for audio file deidentification. - -```java -import com.skyflow.enums.DetectOutputTranscriptions; - -DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .outputTranscription(DetectOutputTranscriptions.TRANSCRIPTION) - .build(); -``` +See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [DeidentifyFileSample.java](samples/src/main/java/com/example/detect/DeidentifyFileSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java), [ReidentifyFileSample.java](samples/src/main/java/com/example/detect/ReidentifyFileSample.java), [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). # Connections diff --git a/skyvault/api-report/skyflow-java.baseline.jar b/skyvault/api-report/skyflow-java.baseline.jar index 6ba58495ffdcbf1a11e1c18ca922e4bc6fa4c446..da729c8793f74d796093dbc51159c28932ad6b0b 100644 GIT binary patch delta 604404 zcmZ5|cRZEv|GzWrbB?`2$X50qi6na@dqrea_NE*wo8-iuvWp6ljAKVu$WHbqNmh}q z-+j*M{eFLb-#>bs&UIhc>v~17Wyf8Im2-EW}hHLL&*o_wwhIqC!IUEJ0PA zbl~kCk{QU^1to_lLn$iClztK1!QV2zb z#AQi>EyW720XKS(G?=w`%8C&++rR$kr(_50EFg?Pa}ScT!dE?5F(EsTST7(1$y8)vGCVG*m3I;1t!s_w{ zV4(jaAfy#xHy8sLx3Lv&0^qY)_ zC1DYeOE4*bgA{bxKpT<@K(#`tD%L!25C%bZDfuzE6&!&304P1z?;W8Tr#sFoEWq>t zD61%VhOkP!f_BU(DqyY|MN%;oT0`iMa|-}!$%Oe5`4PAJioB>7gdv7E@rt4_5wX2^ zyWll%HedlZg<&X6LEHka6%z_IteA)o{U4Q85GZ*}8k|dkuw5hzfP$bX z0k#MjMTPex4uYkQbaD1h4O$|j3Y>=Wz zF&|$}<2${2ReEB@Rih)XZQoI<|hI0hr|9GApP@V)s_+8^L?m58q034ND%n7`n z1bsWyv`er+UX&be@w656Z7PJtoKTjEkl9_l z0ytY@W{;RF8dp*X{wW8O8S~e*RDjI`6r$qok2u1!`OD;lfDPMzOlZN|9E^7Q3Y*`0 z_(^ajtzz~_l`vzjBbW_0en7|p&bu%qaDf+v#0Ekj&4jLEg;y|!x523i1oT@RlmD zIH#_GE3Bn>vp0^*GCjIZsSt4KCX@(psV ztrg@YAt>-^B_;r(515GL7%ECKz`+hes2uoOi1*^$ZzMUOeF;W|jk1S4AdJM-Agr2a$i8d7Q%?C2^pTYjAIS61& z7_4ni{O!`R^fv_!ZBJ!!H0~gHU>Gbu*-hpw_>Z`zL70fchQK z{7vnUaeU+g_=nG6I;MhR_2!lPD6b$1tRg zFcUtk?S3PLUdD_;2u*mr`zI2qf#E4gKVDJXQgCvxpd3CzS9}%rRN}`IBdp;9q=C@> zZ_gP0TQIj)BN)1MYAOA0+h@Fbobl*qv70c0zb8e4*Z9uX`;01q+- zfKaxmp@i7OD+H!3BS3wCL}6KJp%aAu_#&Ci3KBr-W6A|pHbfXYPf+_`FZ@#_kw7df9Ep7= z4n0qp7awOJ(ZYmnlVZ=yK!g4(Um$O0#BRz$#s0!*ATgLgy!1G7!h!|K=pBLtd_aTb zhzcvD22I3U1qYn~2q_346azyLY)_{J9U>@20}3LrFJV3CK7L_%29UDCjJ45+^5c8q z1BDZYI*T2>2JQJzD!4%8zYLuYI5C6n;U(Zh7Nl;}fV>64nOG3_9SN#~^-vG^21nue zF9mka4oV=vSkPN+gsjAK1l&FZNErn4zL^*-gRdN*-FVsH@GF4F7!nE0@R1?0!;a91 zzZM585(ftitVpgbt2HeR&oi`Jq z#8@UD=*7Ql2R*6M0|wC?8Hx=1!XLUqFg31Z;>a}?jN1Enp;(ps&>(_Y@c^+A2KD$y zh7?dXjU)y@q$k1VL_xO+Wy7Wz#NHG})EVq-BGdri7Yl~{D?%dS^P*XZAIq5w{hP5k zOa{v?8&M&-2 zof-u9pn<=+gHr(KPAuroNrFLevT{eDFA1{#q9&dc;Q0dr`*0G9AUwnuWa=&?J$7ae zN=#_Omj=)&X8}|^SU;7%La!4Z;KLbYj^xGRn7-Z~E@dI!% zf_nxW)1k-!C7k^>;ffBhaeA6WWZcx$D)z2zgsIDcgAhIIk3ev zFk?bLd^qE3kKt`HtUevgj9^eaF#zF^8axvq$F4KOWC%L_wa{6tCp#<{F99DPU;-)- z2I7M^C5siHW(8xckO%gi5c0To;Ozw%p;F*@H|8zKBf$+?5Iw|M z%fZ*ge=P<)Jd2{ks;a{{2pZsdB;GuwS78B!Hry^1%yzPWdFu+^^nZ&0Iq-HG#Hr_6 zpoMWX9~bc;4lw|>oM7!5(uNJ;d*ee{EE$5p&g#JaV%C~0u9E-VqGGkL!7K>Y#8E_W zhfNL?aG@Bmzl~s`g!YsYMf@HG>uC&oNH8_t|6n#T0>XD;D6F|9>=$9-cpuDJ@?%qP zz$o#3v7o^j2zB`172)V0Kzs*=FPZ>e7>=7_!JW|G0|5L+1y^DWyh#mXSg5<6jO)iHi&bHsmwxGoc+1Y~ZOC{_KMXTRH~2OvocVH2}eY39B>#dq~)~ z;qbnC5!OX;6D~<`nO6M`c1-Xkm`(riNd&kVr2$MgVV!teaBji$@c+R@C=ezHX9PlJ zPza!G3r2=sHKI48Ki#+>g?NLARP7{wWS6P#;%P=kPR&3|@7Ez7GW5whIz4-%{G~?w zkE7qvAjBIAOBWNN_dmJQRz6;TVI+^OkFikiC|c@Yo*7;VT~X}0=(E3=)A=4M7oKx@ zt3{NHlRFj_Jy>F4s9k)gr!GjN%O}#RsMjaHU8gz~EiGJXy@>7hHNP=}t@h)>`9VeA^pyzgN90adqrTZ%0~b-60Om3cG#jhEYON zXCPmczONP;dDApvzNojo;F;1L$$f`yU8bNawGRCqF}Ryg8Y|+FQ|RS4W>?|&5vh9g zpClkZZll$$UNvz(=cs21RvMvjjgIW!(w<809!t3I=<=Xg-u>E-;4=+$mZXjdvNvbV z&YOrZ`XyEJA|!T9cUL|SQB0H1bJi(rpKDECeb;!?a^j+iSi0vE`+(=IlDG8u2dJal z3z)q!=8M|jsB&q2)Lam_Wh~5C`^bUW_0eD;=3{Fnnwt8#1bw2o??mCzqX?EeO%j7i z4ss&%QHdBi_0MY`R9G&=OJ%;6-sB6&x1jZ4B;S#g=v!cuS2G;0(;t5*on{ne+x#LC z5a-S8a|(J?k}SPCk_q%&HN9e%G3fOAu!s1km3fFshm?~*W>2A?ZEvXe%O1379~kQXnsWaX%_K?=d_QZ%>t`bUdV9Vpj%qkrt6M_b=8oKHc!l}T2koUPWqpXHs3 zF0l2BMZM}6N)wsjxMLzo|I)FC%HVvVCPT%9JJpD4Wqg8;Q|XXv$eKv3vz`tAt>ST$ zi4a$X=~or&AJWpN%(^_2#j-cm>2z~S8PmPLd#3G+?GCMWM1Que%WT^>J2>OFJme%R z_jZ{f8lCg!A;&L&Zt0Evg?dH4bgyzYx*o6cOzIx3XovMkqt`D!y-QnWlDbB6f0yEU zgk)7G%W$PmbpfNO*I`C)+6Mtiw(%JQh#Yh>7N?!0?!ANco; zKR8P$cQWlrUT+^roRnG-pwvgwX!%+6P86yKZHk~jXP=fx|FH4C|MYrNW}i+gWnryl zXmFPF4f@871LZnCY!j=;sY3DhVC@R|W&LbffzFCLOQG#lW|yfIo_W^W3+rDZqBfaP z9_N*4L+zNyEYmtD%vcs5AM2lyjgY!CWT;&q`$VC|Gvl}Ng`v2sIvV*HfI8XIf%UZA{p6af6SKkkNWTK5Qu~Z!s%z zCP!=@)3M!Kqd^H%#~v$2r#{N#XXfkDdBjac!(?>$i<+C2d2jJ*Dm+BSbAoi@hk^Z&ugD+m0d8^y!^w2F4#_#WpagS(m7g$lqDt#zjqF7h< zZK`-LE;M*wmPDw)hulJxBof8wda>ogBW3igSH+p=iun{5^=$vAsk}oBT09Tk=b)_~ z=AI|PZ&{jBA_LhPcWyWYOSZVzei#=HQKwZsdw%PIdYE*7gu1`_e3zp=&zV>fj&PH5 z8~t~Vk%}wd-57HcpPemDG%4G6{ARn|B@o!o-|87}@I#lLeE6YNGBG8uXavWjPaSS0 z^E&(-p=X}o-;a;~bH`q2D$Zm3V(68f8@P)ven;KUSYjd~POATN@daEP0cj)W33zzG ziG-72n|^~pi?95+b0A=j0ZxpaJ%n*V@ogZW{B4sufnmt;ZFmxBs1B#V9+AMe30OD) z15pDf6blOdOc)E^S&0L2QYdPy95wte`2!(I959dtS%xPYf(Cm`1FynQ4#NBeEI9X% zf3Xd`B9aEFHZwEamC%Mej3?-g8;@;dfyWYfTpqX&v(tjp0|_!9#Ytm@QxM<}WKjg& z0cr_23dmUnpKfr#t?=v_JXQc_V1Xk6Gg*+HWbnf~3DXcLD+8Pqu$Bi;vqHavrvi;2 z91?7VmkBC{0;q-IXU|^0tO75(Ed7D^US_W89RcAN=PDs@3`=%e-BXE^tpQzOxFWh| zug2Z`juraJBty_cE~Pu>(XyS?L#eDb->v`=vGD@N(UU>-FY4PPg@M-s%u*_!DKZc0e=B@ZZ9gs5bBN|%m=1+VaZQAM^acq^!oJ6UxE~Ma65ynYTWPi&Qo9f<=94>A8h5k}Ro8Y`y81n!Ld0E?DzsfqTkc&dm8@E%)I0 zZ1b6?{k3f^DT7bnD5d2Um~lvEmI>ZMjwURK3<)`HlbZ;L(ld)x+G)EB?LRKcFI3!= zJ63^S5sRT#8+}^t=2f;}$nxOJ=r9^V_5HfUGdIMF))B8!0-eu}1M{8b5QkkORYM2I z9}y`dcIG#$jJnC4vsQGutlIm0d?FR2t<4^+&m^nz2JnXz%J8)2qh`ze3>wDyqECYt zB7Z9W9Iq(vGrD_AmqhAmCF*ia`VQT|b+gEK=b6)4Z~fsGF6z>$g&LUOyd*A+)@ceC z4#{7=*ZQGl_wuqWR-O1dJ#y3{EjDv}(MkO?X4+2Er8fqHjK=sMNse+WyZN8k`jGcZ zC%h^f{Sl90N{Ie6XxKxqt0i4`mhtW+cc85;%}lb5r^DRlYIf3w*iV|eQVOB74#LsG zMx$pI=wLR%&)jlL-vtw(E4GbV6;U+V!(XsuXUxOJi;;d1{W7tfso z#{Q6MHSve(`lY7|UA86^nN|y?E%ff^?o768%bzsmyP7^`Kv(yM{q&u7{N*0~?CaC{ zu9@qA@b{v`E*rBNir>tof6njGAAj;(-g$1^+hVVK{p`dy*Sl)gP2YEzKOGgLi7kgG zeH;1)_@N_`$}bP@rygH*P)v&ZeE#j{eH{T0&yCgdzGeDs=VXGSLg%Q}UUvb^L8>d4 z&0qZCiduaSNF5ERYXo~f${y0GiS7whQG88Ar(;fXY+;AVydN$aR}oWLV8i98rEuB7 zGjw_X7@9?;f6GPoZD^X~H5Ze~6|^g_xT4W}wV=?u)?-Y``_b?h>?UgO{8AY>E`Lzw zvEVpc6~^uwrFTp^R(6wS+@+G+9?i?fl2*R0W*w5SM3J;8Ra(fGEJobWp-blB74TDf zqiVj3lH)RM=lv>(_7>+&`on97!LNyfK2dQWk1I6sz0*fHzzj4Mueu&YJ8{`bL@89> z{)kxDbWohNOO`kp|K(8F+@41#;=f=uL@G`!azAGCWSdm!d3lZ#ulJh966f)_4C2X_ zi|FM;h98SWk$>=SG6Y@7+suU%5xu7PzXctvshVgj4_Z~`i?GTI^ujh(ro~?<&2vR4 zO))}x7?R1#I$=KM9ltO^T??nKjk`%6r@S1W+ep!2m%8_brD$3s=j{Xf?g2huKP``L za$JHasmVWJUeMx^FmFB=IlUe2FShUdHJD>P+wjARrLWr!_*0{%w`-;J+Ok(IgM~ht zurT_eZ;;edR4MrEei;%=(LR^eLMwqdzj7QgnU`LAzb*2VoP%bs)YxcKyp6IwJ-isv z!%?C(f4*nFi0NmxSjsKUh8d6bmtCTxcuw*z zAXlLj&1Bf>$e{I@xujP2itH+R7uXoJFcEs7P z%P9b#%FlhR>xoo>*BI>e=gPLf8~-M#9^1q_Rj_~YGOgETm8QyFhLRojuGFA*>(l78 zJ>Fl@K|WCTj5V75%MZlw4xrOMhQ(-dk7^!kJ6u-ERq7C+bqc%^823{xVrvU9xUCn+^>^V`|Iov_FED=OrR7kQ7G&Xap1%#9YlUH8`4S6;evs-v&( zZX(+%6Tx!C^DD2g=x`)tb7t?m$;j*dbpMT)n){%`)qsRnlDQQ|)kc5o&tJ`(**FuVKBmk8L!7 zzwGHRr*kWlt8H&H#wC26o$p;5&S1`9Uqahega{~{ZE-hdi52iDCjP$ju5wkE|0-Xp zrQnU+25ALbbzN!NsxfXuw>K8N4XK$@=(lEen@{gVI{8O$s2j!z-Ezpe0{czLESWCv z8uY@UpO15-h9ik&MtGYDMfUmbzV>ek`S-F}jITVVE5#JtbG10H8Od2HoRf=nQtz`5 zzpkj^*!q1VtY%NMQot|-YWTcXH`>V7^u8jW7uy@?ql|mT@ZU_y>8TI3+6J#i+zUbX zdHc{as>L^Ay4zv9pPK#SP?_iGoP=)O5*TQD5a+k}Ium2m#CP~3G&u8Fg_7R3Yn+IZ zrsDNdS-V0fcyi^&TixX$7Nxs$C0Ato$TO$nN_4*X$fJI~=E$f%ZW(FbbW3voY4v*Z zQ6T*aY_Qyf;y?vjZ&*9e7WA-S;+?e3P_WP?W4kq0g6(kB7wRg)Br> z*&~@HJXIISc`{6_dQ)7D9`{*7J1sHKum%CXYma}f<+qV#(~r3+p4R+S-IR>}NqZHU zsHK$T6@LH0&#*c6J9(ncFZmgwoFYVdzR+sBko9X?w;Z`dR$g;0vXq%Pho+ zp-{}t?&^mQlkmt%A%`Um(nAdqWf>vQS7gSnaq`5k)1jzwifPjv>$t>29wwzp?3epn zJnz1%RdqhLmCeCC>5NcWj{0dmcN&6*r?mg9Q!#Vh6>{W`xbv#0qjM`U{2`^1q1{Sp zIu|Tw%J8?w{eJ&K6XbqnoAZ_hpWapCZ@S@2B0|%|MOW8dJ9m7}Ry5pMEK~-j?$(B^ z=~DS6GSrreeS|Jtv~*K{uju;vdWU~WLTxR1533~qQ08lcx=;OH!xbZPnI&7!=)38K zSK>OuO24gD+4Ps(K3-9jUrONFM7K;`+@y1iIk2YS3!ll-8VfY`^-w-jBiX1IqZRU6 z!Q$htYjc(K^QMfa1q))@!<(O5@`oELe09{I$UE4Wp6W{&(V|F?*3F3UTaB6KZzidj zXl5hS<1D`qeVuB1F-~i{X*uDyMTwraPU!7-PxD@`_~KV}3tO@Td4?no;<;O_F_-qI z^+ElWuL@EP@9wM@ts3?Uj`$XRt-M_aSJ3{_#oG4j*)O9ni`622tW7z_a?G!lM|Ufl zoSmYD(H&WzzRX8AZ!e(2w=dRjh3ujZBijPDrWK|>11m-_9bt6h9P$E-dAd2e=U1dHk*pYWZ~Q9+Y-od6jK->98}nbv~bHICoXI@XcMFAwOrIJ^h9^lqL{# z2nP%^S(fB}GSOc=Bv8hL$YNVSwyhaF8!r(uxmr_;IM$kTxu$|_;2o%J6iBe={M31c zB`0?7SH5lIpRr;y4=J*H$tMy@=zg!Bx@}6fUs}(X_l@V@2V=JcKmGp2c0$SU1J+p1 zz+Aph>-Yopy|g4Zlzgv!run`bc1uLrcdR}#(oDcl;E7y$6nA+?JTF_4w6O?RFh;w3 zo4C5u1?rN&p!P%Bfdl2^3n#yF!1-|g0=v9{S(E1L>}I*9C{bA5OBM3z>*%-Lz6KDX z(Tl_dm-pzOXg7R3Ei#6+ly$#XIS30YGqe(J>NaiB+q&Ue#=}|riuiF){f^`1dLCH# z0I#XfJ>jMAlg33;vFD@dxzEdqfBM7ihOK494p>C*-?%o+c%wt@X@ShG{L9bA4ANBi zM{>Se9dLR3MBmFC;d=(F3SwM9?<+K^4yPK;e%`l5uv0qG_W^PhtP8WTXByZ@%-^fW z$=RaH3+0~gyTt!N)~`D4kemcx@te7_DKQhmbiaqW>Cr>0H^1{^PL;cBc5nAX-Jku; zmVS`k_`)ns$p4{39#O4^EJo2VWy);pcFlfFW%1qJsF|}i#=R2RM*5BRu=u5wJz}{tef9 z7x(&jVkJeHI1K9itV#^#Njh3%ru^yG?jrQlYEww##Q_SX_>D_%umr(I_sZ)WoR7xrYiUNb8MGq#w<|nbwT`VlRu;OA|jeXy8i>@;FDUmcodLD9HbhR01ggcic<(OrIJn~-EnkJFHEUSM*P5-pObTain0&9 zWhtjF=@GNtM-h>|etj#OEqJr|?R?bo9}PsvsRQ(&u*v=2xt5$F^R^^0_muer>ZUd` z3ismuGqYkp(6@7?9A+-WUFo<8&+k|X>=PGO$j$ctH9Xrpcs~W`qL=+y_clhN(4xpR z^?aJI{MPYJb)^{{(WUQWV?VKirE8K;xz&pbk+)wx?sKymqiAv-JJDPf+<#<$^xaA; zc*f~)kZNd;VIVyAct6kNN@#gaz~NZ#eCBgMqM!+l_$YMl8k@!4%f3VR@7&uLF~2v- zF0ehQ_$_I+vo0Z^{1hc~`V~s)JFTf=r)U$v8Kp|`mJT-d;GD%`HmgewNlh`WFU2{t zRKsQ)Ep2v@@OK7tG8c8q%G1d2u9nzyhCYnQkLG9fB^l5gorce<`TkD*B`|)|cY4L> z%pTjQVEgyS=$n4p;yJ0-EMkJ>soX-!weacX)6)G-!_e2H8~#a)?$jfbbEJ8L3D@14 z8{b!lVcc4tZIi6uCib{XY)}meS+4qcb(Tmuvd7UYV@4yf&s$EysI@5&>EN57#5?-f z6ltK5I#Y*@cINIMu8Z#a@`V4{&EydAR*1aRvAM^=Wpq5%sOK@nHnZ?ZYTBR&esyF1 z!WL;?z#K#*=`?&4S~DQv*rt{$74w>z+cYY{F9S`OdK`ERNLapt=Jur zD>a*2uydgw($RR5t8d@t6$ze$%^?176odCC_~f9$dK$vV{yR#-oqz#lir||8PmJJ= ze~-rgIeWs!nZil_UjO`ij)p&v>al{$5FX6#lY{rNyKojj!5&U{c^vm52%*U?4o(ID z|Fq*-G`=goea9Yt4xdvG^@wEvTocypCOnbw4g+}MbpgnYfztwLWfUV;!5iL6iSLZ( z=->lZU`m&qFdtb0Tm#rb!nl))+|e^9uqfRq)PvIR^gs(&^6$sSFlWjPRx`7M$nr8=T;+9$q_Ez#sw6gng9= z4<=XxFCH8r2qZ>;ujo8Vh1(JCs&FH)oX_COgsRJ@5K(c zTnex22Wf8Wk0VU9-P-vme!_aZ*0u!JMyeWr2b)dDuwx&m|8y7Ffjmez%ZvJX`-w_1 zQN|Eaq~buhXfLAmQVYNGR-T&NUa6x_xnZVY_I7r0NdHNePya!dPr#p_IkTszX8Yq@ z7NmKs~5SO}U=jjmi!7LvX${>tT==bQLxms>7rljsZ6wgY@$(`)82odHj)S7+M? zp8R+k$CWHYJo8MMi%~)-f0^Y-qagy}rrkwwetT?I=d&SIowuLsfGi(N?LGqu4=CUKd}*ndfsT zhRyaPX4FPv2}19xoJQ+KXNw5UHP=1mZ<{A~K2!PZ7P!ULQeSU^uzwi_p)tYYL?=k!uHnp=cFJ?wjYLr4HK#m0v9gNG$1(S3JUyi0&6Utflj=<$ma0 zRUfsWL$7F&=c8lo=enaGP6p43DwG}&^#i&bYVRYq4{sSwWR=H}Eomp$7f+=fG3ZLL z)t&2qvBB8YA;#;S>Alx6#v|`feMvNT^vMjXK^& zF)+xmMKfN^=_h^weeikl;E$fe<@)!DP70Pz`R68V1zQxgKYwlFgCnvQr*8O6El0iZ zipW7Pk@%5@aC!L#2TROHKVXhbkfwQvK}_#H8|ACp*$m$EXQkZmYSDNBcYLJ$p!c-e)R{@eE?S#NpeQ#Eqv50j?6~X4sgo{-Lt<|NT+`?vQz? z9cmP?%kbT5f#Pmo24(fx>WL=~9yZ@eQ^&i*M$k(Pwd_!tA*3d;%C(_SFI8zY8D@o4lO!$ zo*hB!=|rE*Ek7#t3#9pBuJ085nSQD!&*>>uTw_}qjn!0?6o->_O8|59ta5_!J*xie zTh{LBGg{s9f4WT4jb7(o)V?llyxOfd5{bG0;)NW|*OyZfW!BM;mlO3of38P|Xbwv`qA5}I0a`eIp_-(C~6;E1hMUgtV8FgClM zj3n@EPQJ5ZZ(J|cB8^INzW2$nlzU-;hGjvP#`0HF%YB40>xAoFbA@#ibwHs)SE*2E6}>&{`u;2sM%pG8As>!;2A zAJH9)^R8obJbRdXsY^7ef6moX-+W2zufbDFE76inFJ4E?TEtdt+V#bd<@{@1%|Cpa zYpo`hOQUvD##tE`ABH&h&tEy_R==kkXc=XD#Wu0%#|2|9#8sCuzG%_Q?1}zY6!O*0 z*&mH|sF?@IZ0u#V7LEC)FJu>T{$U@MdoXN-&Te5fx;of8u?kg6)F^o2C+KR^olv5# zS^bcA404DJo*pseJn4L)^ZXKAij$To$E=0EaX*ryHRB*TbEKDqjG>sAY>M{*gp+k5R{k_8WYl{{c; zEG2?}=7VbR27j{OP4gBh9h-9nu@NN1257-pO7%j!Ra#DO*v*%Drz!fxAiV~Ct-vrkVcaeIdhj)RN#;NHQ48b^;P|L5m) z0RHusFnc%?kaz`rsVkuv&PpIdAW|Cx)aocw^c%A^57thaKX0xa@_eN)e*DHfZg{A? z$WZjgU3pP)z4OztY^@u-f<4K67=}@KXVe&J+RmIhM6>55QM2(9} zt|~{4W$pnpO#M$>==YdVvhRHx*Jy8*S0+9t^7!rV?Cj(mDyg`K{d0W!kVt>gY~4k* zIN}L9UJfOu%e?XQYni*qSHia&?N+_}fLKgaNpQfigLW9L}_#}ax zXRu%{CBF3=pMO9V8$6B1E&GUJbX&`(V{P;med2MZ1(1dVnMadClPo#8wBHq2^u=II`LQuc=C!6|J!^ZuZ2xW%7bG@Fg z2D`d2*Th`2GAkCp3A|t-h9RhA#TCX%s5$v+ZVk1(S?+b2O^=61iQvl`Mm7NGe&w5wtCw=lKFn_-c)Py|M>PwPv|?h4@st;3i@*%A{4gwr#pH zf;<|d*U*2lfA^l7wd~4)Bv-F)d>s6p9IyWNlX%G|d_L6|o;A2^Y1`E%yH84ReE)>D z76{phmNU3YbUKXSmNmQAH`to{Blt_jRLN`QgzFSPdxs0ELngR5Qv``O-uM`7n2B|I zE))i08WcI7wKT+fh1*L^mqbX9O;JNA`ouGDBTO?2oL!|>YV$RzX|at(b8%L$>7-sw z*0p(dCNXnR2~RF9jqnc+M)y<4NGVsL?TMEkb9__%_7ZMw6tP$#Br@moc<>yW4b!b2 z`C|OpqBJ`TSH8d%W`xG@a4$=3{H<%o6Hr-8T|1gvH1Gub%J7-hljZCPlju^CTwOcj zJ3?$V2=+Qx#t+&LtiSvGLbpD7aj}B8*Sl(UT*2e0ifHq^;pEW-wZzWXpttkE#b`nD zMf&$2kwqwdK|d#Zdy!@JxF=yT$oYo}2v~2zXtl5Fc7-34dHPVLW{rdAvxVUIvcEz% zXHV6I)GREbQC}~_th830+hc^2s!6PzscU={k{(#5*KvikMQj)S_T8Riw6$34>(VDa zbuY`VP1Bm$hqMUE2OHm}E3NRU86JHXc4!|oMi%ikttI?0NJ zgpcBWDWpy!KNiD_z;0G2{%oI=QLG)+kMQTp4ID-aoD|Jf*-RTa=0|L%KH81w;+pL4 zy59JUYr6f;y$K8Ky@aK^^X#=s0n@6 zUCoY2wsl?nudbIxftKc$4{RR@UajAG?61X~H278rF&m+9W;1TLt@v%oO?0=$&Bg*p zv3m?_H-{O1hNNd62V9t=oq3Gjk(j|qC98hXW14eq5D%boI?)ioGJF+6lHf^2H&g|FW-zxj;|jZ23{e^miKkrUFqr#s_V>GShzn= zW?fA#`7}JqCbK0s@0@&BWRaI%vqwI)JoX0deazRHLgjghzD24)3N$bJ@N946!VRam&B7z;)XTIZ(F2pncPE)w~Z4u zC41zi1*Y!vS#YXgrZ0;piOgF;m!*PPX8FD~T^=S$<*>VwcU4KeaBhTZK%?Iws=_w$ zyt!S*S{wcKf&4i|iqwclXhHK@eN^0N|4^p2Oa0mVDWj%s*2J@P5}JO*voEh{P$JQs zx=^*88~Qs}-nT$Hm|_u0LA(CUQu#Ca>Vp7t;n2 z;-+v8oyE|IoNJj;o_y`Yo9}T*ZSiqR%@RcFTX>|#12qZZhwr!-jlnly)KNmf=V~|; zT39b~_{Ch5%9;wrQi57PZZWXo=6{NRO@t8 zzh0tV^JE2p@4p0iKUT`fVA>>jHiwd5GVm_G7A z))khC0&9I?G3!LrB9EmisTIvkA6EKL>edu<@50Up#@N@0UvDd_;=Lo8oJ4x<1|9OK zKd!Mmj@@bhpwdD~BF4JKn^w9{p;aEeaTpuMd{vM?@o8qP`a{U*LbJ_^=K}dp*Mp^l z&);h#T5K|uTJk^pEc1$Jvj&{ppF+&RAXu?p&qV5SsUhb{h-b3 zwU*apq`L%d+RaRIJ&wkAZ*1?gQ!FHUxyXtovIqPTJ3gxWJc3ExeKDUp8CLN9LYcOK`8@`Z*})raG0&G%57AFB}U+4|2` z&sli^*4Rd(gd}AR&fki`Uo>vy?#X|6KS9PZKH;{r{&Lg8*FLN%^2vN~vW(Lsq93MM zxA3zCHJcOE>&gRXkC5{>x>MMH&jqnw^@Lk9cihP1X;0f67L^_BOw&kU7MMp1=f+Zw zs63)TA9kPa*rTXiLTA!#-{!^GeAC#Wc3CbT9~g~~eY{o5|67{%D3#l$164oPuq&?2 zh3wQ$?fBNUWSLQTLxgU@G(I++thcAbk(h>SG&*u`po4CW`ll_qLw4A(AGyT^x_6Fh z24A=x8=?daevH>eT?nTBDL}u3UT)TlA(v%Wa8RGxr}Of-8xyNvVwbj0_H$t<_q6im zsb%XSCi~F%sA2cgj(+;>lilcD?yAGKUrg1Xf&K1NjW_J_XO7Moq)nX%i{ zm8Np)7{02S&x|r&LOrF+%$Y`ZjSA_bwwv*dV_vldvJ*xwI?rZo74EM(2Kp8XAbhoR zehw^oaEg8!=DUU=gu8m09lc&E9UjZdJkQTad49 ze;wtmXQUmKy)jE&y3jLEO{PlF_KKFwmM@;T$?@Lz4NiUr3A$IdY~FH$K&~ct!BbsK z%CENykEwS~AB=Mf?0sLH60J`*NOu@^_sXz0sN)Wh_6d_?$+LeLEi=`fYZ1yNC8&$$ zt1Jko6Z$PNRiS=c;9lt-@J0Zp(bfF)kZ&qn^p&RT{<)^M0Uu%BYhm11(Y2qzZB3!W zgTdoP?h^-x$VDFE9!ZCN$ezB)*kPu9-%;svCS-T^GQF(kb;I@jckw4@P@KJQD{Pk@ zYhBv9@bbz%?Y`iAN^jZc`Iz}FMt#zrThO+p>CT=d_`|TbPMqQHJFjZ4N1~u+qe!{_ zfhDi!a;{@sX`7zG70%L%7T|mCC%SL;9tm|fyU7WteD3k&Y|MC1j$nZlhHNn~#7MKX zn6do6!Qseqrq|`+N2~8ozRPiSKN|EbQ}Lauw8@c;ASzMXO;nj3mD+I#OSxUAE^hWe!`Sbzt6=R{q-#=tP1U_+Zig1r0NJNSGjn5Z>Qd}77U*#Y5E$Pxmq|RucIr@ zqThyg&=EfNzR&Y*=o_9Z4{4;o*5<3dqBf}#y6XNyEA|x)`>nD2esQFidqlkB1s;CA zN_`yALv~%qRP5PL7&qC;4?QZ6 z`&-Y>oMm7iVXmQ(3}-t_Cx;Hn%qvTto?na1rijd|(l?RRtho_(WZ9@*FOnMU8gwY8ad zFB(L@;0m|65PMG!k!7{#Zc@KfW9<{-O#X5>N|8kNBq*_9ja`{ND&O1`?LYrJb9w7t zjaY9ZxmN^NhL2urwv>|2y)yTXwtYwDL$-#yms0cS6SwTX2q&{-m#ZY5|Eh8w+>>1O z9p%sN_QxqjUfsq=f#2X?pd9{;!n5Zt zj!6AhOxD3(^}TzeZ&&+}jjHfstM|QWbLV(UX%6j&&#aw4zP+3A`^3z-&UWkEcw9uu zP73c^uRGHcvx1J~HzJdn;q<1)UJUOYnfHGP3~il1e)?TfO@zJ%>ym*!4jlJSy16t= zYK2{r_ID&rD%DT@lw=>e8@jcd7o44>F(vHRUGKVUw{*qt=Z*R*a`{%&YYY|12DiGX z3DUPk#nqLD$~4S0*kahBKK#_96H^&{@DRMYS8)F*vb z31Wo|*1H&x#hAl+7=U9mZ~n7bzasSsdBF!(vE_*#8vc)=X9{+8rWt;G9PZzk%`5(8 zU^v_CcHP-4#DMrHm7T%&gn@l}#WR37=In+%Rod?((^$<|m@~D(%qSE0Dyje5VRZAU zrmCrcO9HPnE&q56Mf8_jT7{x#vwHLz!;e49C-T0(rmE`ldTyRVA5C^UGTOs!V1SAH zok@yw?r!_!O}A}|!pWN+U%9I)u6NaD`@DTHK*6h+KznP0dAX3%*|nKH-=jQzJKp+6 zYtA;`8x>IzyXgH=>mKt*YZiwLcOpN%k7<0|6hLiuiqbnE{Vnk4!+Q56udr_-%M`(B z=*5(u9FA#!Ze9sudME_GDD$G~ijvs@M|U^rR@xqo5XS=XGIyq_a>r&`&p!A4_m`bb z9~*e4@7&-#JjXTvhD80#VW^N5**0r%DN%udO`^m}!h9(608+7Vxk7|4Mw_IqZW z4_a@k*{k!Yr2Kdfu!3NAc(va;?TnUJvY8 z%ccu1cDXdro`lzQ(}YL{s(#}vmfR=5)=Tk7l(zi$5pAgUW$1FJAkn<%T5x+^F@u#_ z@a5ckd)8FPtB#xuamEgJ-*k)#N#=g8mDM6`?gdo@b-&!5r)aCeQ^flqLM9{dgCKi8D}K+^VK%$$EqCIf82iOJG6Q8HN0 zpYXqbB?7!*R0iH2!0CWD=HM^D`8B~mwF5q-!!rJcTM*6<4^YI)Sg=drzsHGq^aao- za7r{=JHx4E#oD7U+*T#c)y*kL(;p*A<-)8EZ@f~z(5An$6tv_@;hGz~dq;Z6#VI4f z(Oy>*$^)UL^>h~%j2DVuxF%x$G7Op>NE8Y?<);7Y`>@i|f^}SEQOF}_b$DgX=b+AD zZH+_ufUQ~lxSkwoXxt{%RvtN@xGM7f^g}ngWL;#9cf+%vEb!W14M!}8?2hgR#<9+J zaP;Vep)*q~oj-rG#LbJ}Qq=3aAOb8hxq ze^3@>Sk04r{-3R_5KIeZ;4p_hL~mJ`79ZM7S?>NvZ*^bwHY_rP0EPUQi+B4VePZCc zuJY%rq|6ve+-(PGslA(cSVl{VzUg?5O!>iZri^dBwBs=(*r>MSV$+8$$aDDVf=*b) zNCE|$S+dU8sk}*}`J_tQD zP~L)(T1(N+2TEPiN(`d5w1p_v4U>M3anYZAI?#WDrlBw^@5yBRW)0snON)h zK2{(5BGSusV0CsW@e@G|Krc5p!JUge32|8ylqd>P6p6hX>&8eHA(px272VAPq>I>Y zr57xv11)_O*c!T&W(=Y^SqDjNPnP>8gfQd z5u`t|?%@m|kLeVIFt+^v)HeScvFxkbg8!=R7Vd1-e(gtHAv{X^`+X1DRSFz23h^>jdtf%`=pvI#lL~SWZy;7LgC^GE`9*GAE z^(pnd$o71x1F~T`vQ7CqoE+%-!_rX;2b8KfEOZ(aAG--T4Bz|2L;OE2Jr8k^-%-jv zxv9bvfrljJ*Xq2;a>(v|eN?w#gY=Ge#yZ7-&c%6%{a)JJ%E$SU@}mF;PpcG79-=8z z+2{ih;D0G0%SGY^r`+K6Dy#Cy9@t-V3#9~^-Vz)D6ywaop3i<J`yG*#*hGG{dyFNVYmM^a z;!JmMF1GUn*lM4543B@e^5VU<0Ep@{mB#ZeplGqyn<{VzT-X>oJ*aONe=`%jKSDr& zDh#G&JsF^jhBqOMk^(GfBCsA{y37-ok#s&ZoFM8_!4jY1)@eIi8e1UwpNR z7GwBxYhN>VE7c83cZW(kSy(XN!emm1BC9-8T=yeVhZ{leWZYcxTLZ1yyKinVXH&P~ z^;VkrJ=i_Zpl#>mx;th3cu!%VQsK`8ZQKhAGpqsarcm%;j`P9JwSF5DynE%(VEa4b z!1p@hlceVe$xaSD{sfcFXHWpT!Io&ofHTQR)ofE2`A90_OqoI3qzP<_7=&dB2IjqvM z&)R|ScA$+`SXbWs;Bic zdAn5*Jx%+Mp8l_#zEbp`paDF8)$|pvX@p28)jzBa+Bz&Z7)=e*oh7OcNumMa0hIp? zys|d`40I`=5P&gJ09&u~8zK7nZ=>M^5Q6DIUI`uiOA&>x@fZu>{BMYD0y6bK1DK6X zH~_|f!ts!~8n4QX{!br(4l!W&FQ(HdMhO`Cdq^V$*!lU-tNhjYzh?$H0nA28CcwY- zhLD5*z6x679vk58Khq%X3vU1XWg-mtw;A*GxCT)``TvkWGT?Ph$OjcsgLF9%NCW;> zJb)o@C<7Kn1(1MEWB|K=m*{^#I%G`<8XIK+Gk@2l5psF)Z_CEtSzlxUD2)OtfWE)) zkjPr}cbN%amjerIsQK?3Kqkrj{a0g}7U180#lH)|q6S%rXH7^h&_)M<^!Mz+kb`x= zpR`c$zQ zQj}LuKH*pi=x~2*QMo)a7I}jHN|-a35Az*?f+26d>-@{ch~4T)53pco#2(<}u6_H_ z$h~v``83{w*J*Xiw;iyAH?b$vb5?KZw&Z+ZHovZtW;C1?3cf%4M89F473tfD zXXf5A!;XI!G>o5+W*eY92enqu*;^CSaa~4k$du{pSzT_o3MuyiFT5m;6YjdBvryH2SsoUbd9WjQkBUDU_JX zfkCGBwOsByW~7w`&^=n%znVUaakU$msHU!3n8>}8!FDijvd@}Uy)!ssPB(=?`4VJ# z=erzvf`Gx`)O&)I^#X$d<0JbXr}>D@z?+pPNyxRt+ouT_S`W1RNb?th(pAWqjlus5 zK`n5cJTW*TlmWcy=1a|R6OeecqB7YJ?yGEZZL$*T681AQmFR8E=Nn_Ep2g$g*czZuLF;~y_IX+%Jlth%vx$(@M^ ztR&G|vH`HQ1B65`R@Ca!7#zTG+TD&M@GZ6$$rA!XZ5A;U>BU956=*Ee;t_K(4QzRm zLCpzXW}2*pF!)Z$C~{>Af-49$&e1{|lu!SnP?p5NF8E{r&bw&xn05+KxF%5-8DHJ8 z_KREyZopKH=Wv2`ZqLvJ{ahOEL;>^ysp&jWzg;UK4_1!Ai`Z4X1kF+h5MH(O<%?=A ze_!>^PmEhYQSu(v2OMNivIpmQbedfyAj8Ie3#ku$d}Zi7TiGV-kBHG=VXy2_dF;^& z>br!Pq)$GIqR|`<3Mf^b5Xfnu?{nE@mJ1sQDHbt1%VfXQ%=`SXq*&D2rc5mvFFO>N zOMz-89g;n^7i<=BrZTDK)=)WANOcW0EM=l8{31*S4vhfbRu?qZpTx`x=%Uc17@&HQo;1`F zkM;dmA!}cnjijl0`z4eWf{g}Z`~ha0spT9O>E0Lu>sB@3dy250l{T5N~v&)V3h zW`c2tVs|VGVHLY$GRjguHjYyVUN7aLtLm8cWBZSc->&HvY-0NV94B)6>FPbo>0=pg zb!Yy^yjjp)se>siP=)ZGwiTElcog)r+?uKnA3>qT-~Q!sh}sNk5t?@G-Lgb5Ngl)g zv#64JzE2z!=VWi%>g4w;AZ2#m1T{T#_KaCk)RYw|-0Yp;NHJBam-0kAuQ zP9!2B`uqy>=+4Z!f2`}hGJCTzTH-vOp~80kaO5IBBd?JWbav8;FQP7YDFef@$VK(u zaLQ~llqNa>;omW~6ii_v-&+0{qZ9~4>AjFq7=%y4h)r_QkS#~c)(IQOB(IT+SQ9<@ z%q^3iPp!xaxh*U)UwQ$&^Vs9l5x0#`$dV3X_x|EG70WT**>a#CE#=QR05PLk#^F3R zcoZjFCmA{W^@7XJ&*uK!H4_x5+D@N(Wdc(?)aLp%VvEq4QHwo~1BO`$B73 z!q^%wJWd>&U#7&r!&*QI<3YeF{FhtYHP(=M2d&TnTac8yGEE zzR&%>*qJRL*qJ8IhA-sg6vu*|1_9yjR_yh&osc7>rzbz8^(y z(Ms&^xMnJ5Hv{1B-U=s;282%CDF$L zJ}==n0P0fKl>0)OJFD0zqaCKlL!l+iCaRaLd&sVMCHQ%)nFxIGbQ+vmV)1=RPUh-P z#TRyi*c>m(n>i9cfvm8#?dM~0KsfYPgvxTHS=n1wqBx|rM2x_uxYyl3&Fk*pp35Md zxPB!o2l;jPKl-}+_i%GqWM<(wmiOLfu|h$krQ|%G90wiYb3z~@n&yMC&<4Tv)W{Vi zZwGV&x16ItmW+{I==>&10hmrbzZldAoVqKKgurSTe7t5!!^@ZWRs4E*zeM;ZMYy?n zl_%MSIDjBhm$SRz$}#-iwljX;iLd**%B~@td^54YlKFB|(n+Mb*~?6d1K8}HqzIL6 zT~rUTDk}{ScA~|eeUoOzPpQkmR9K0WUx-B;SWpln`nx*DzI0sV66ZcysHb5NERqrl zPh=v9SPkV&-kJNG74=^mz>{1}%CzY%EOY|U7yqV^=aPqec9K0veFi<$`hQ zQzQ$gg&xhe*e`cKJ>L;i3F{u$qh$ob3j)+7&_koG@^zR(ci6+G_xeS~C~X-lZC_o0 zdYZ*qyWsbXA2ge#M>t+xfNkGPdiV}3kx?ZEl;R|Qb~d(@-*;2wwz4KTh!i9c7hv|g z{tOE<%bdZ6ZqEVd#;XfJ+iS7I){(B^lo@}OQ>9P)cK zqY8N8Iv#nc=282Cjj(7Y7t<%_RUMq`she;RCG+T}zD6eEiDEtk)Ko>&WAJGTHV zx^aO_@L(p{fbiShCg7q$N53ujpke;@UiRcz!>wwM$bq~bDBcYrO5+9OYYuvJ?c`u> zS$?p0eA&{z!&#exyV|rKL0d~U$7ggCR4`^^V1Fj@Qhx%YYi9=)Wp=UbP&sL2_Y3E> zCf!by3&w@~j2dKkZ!Y-}5J&&5r=SL6t@DM|x)F5z<`>^l%G6rz!QXLw(*6jWGx3DD zSeMrpURUq}w9W&55bpZ+6F=?fk<6Cwl-9gLAK3mNyRf zB0&`4!}~34`ImA@k)YkR@$$(imWgkh)6Sb|ehBXvVrxeLo3CDgkD-*>u_;4#i)eMs zT-9W{1*cI&;C!W9-y)JSBC*FI(kfM1bI@R8gwCUJM~t_u?AIr9H&MLhmh75SyC1V( zveEXngr(K)C8b}z^#F&;hj|9dan&;oz?pp5*+zivGAwV%i|mdf4(gvje`7}|%;=qs z5V@=TFS+}7Yex#s)&YPGJ z2iy#J6Q@kQbYMVfo>n-qc$kGb#ts3gGPUvv>&cO3>AbM++0NX;4Z{A{p> zwXy(5ccD-&+|6{=O2jgW(1rbwZQ9V~*nLoZ%5o=Oit<%KAc{!ItiC1e8wR>|Rn*rQ z%D^T-4RKAK7*Nl}N|h>vULahJ1RA$?Vi~JsC7`IdT2Ykr5iJjO=~L z8^IF9LcN=Aw2%ta(`l%Tz!5q0QNBtQwJ&mJ`Ha=VwOqMHLbT}xw1gP?#WDB-6?aCm zzdi#x>&acHrof#aU6UAfKf6fEpq^rnXI1Nb-?wVg@k|a@Ac%z*tXHww?{JLP$mE5x zE;S+ScxT+L%~jy(k8F&K_aOLXzFV$NttLcuJ=VRyv_~D7NI5lS&XJ^bpv&1ih*DM2 z@}t(aGPJ`wNl|+2LcX=&K;!-CoQwFtyFs|+l@WJo_GqX9M)$1l1$d7SzpS{f5Cv=F zCMKlALQ@6!?4)NWHKbVhIvOh}K8qpQ`lyD#owQ%)9>Lv*bExCAZqcMU-xx7kBCv9+ z!Uru#Kbq44f2`9f%MoPZ_>k3k2cQzyCMctBK<>)UUN8$%xNOeKGLAd-yA!QWNouZ9 zr+ul2m7y+PVwyue@%qxkJSI$ge``ogiASx?+-bqMs$}D1&^1r{;DvT4W`p%)v;57s zknKKA5~a8RRb`(y3Z9_Oac&-axN7h!wW?fMA|$>Js1Vf2(mo{L0#sSoxHOW4gK@ZtgIl%R3+hn4 zN>|FuK!R(|RHzlD+JwHTYL6sQE06R-wHm!r)`DEahhssE%C?x@yB~cT67^Y?&}(XW zhi)f2==;p`6D_0_1=#nKH`q&?8|Oa{>gwvI4!Q!1sH|2Z( zWKpW%4hp;#xwOP8(q|S4u=qexth~|PwzUv;2s{iX9{EWORodp9cAAOL``gc+ogA^G z>ke#Uc{ao(!D=g`5NNxIG@?mjpbO6*sl33kl|j?&-itsqwoUkMHc6XPz^3UsN?$wB z&e=@oCD`zKL-jI}o@`qP?A%jT(bjA8xht!cdFvzmp;htCqMRKr>Sjkho~$X0-iXNY_5D zb$qPIrV5nImXef!jysc|cMQ&*c3sFvePBzYvY*X}e*=jW_>akqB?l&@Qor1CN3qCD zMFIjQ$;LEd7fSr@mO896QoV=g5D#5fcARBLj{dzj+E_Iz@6Vy)`pg4TAJjbHxsc7D zIhO&NVm-84AyK?@qqupJ%}lH+Gi23#?(ZF=uCU=cT{WZ=zF z2-mWviTm9*ynP_G}3lXP{PjGm`0reV4< z95d;8)NnI~$CUzRQ0`Nkn4zy);j(lm*WRUYoF*hoA}wBEU><3mfpHc; zaJVDbTjNFeIW}(oUGW7eliP}R03f5R^QYELCByUE*qSVgMNV~J5*gLLfYc598^Md= zz9!MosA>K?(hSvQr(Clo4ukJTq0xX zy<*tdNvq|91I&f`_Jg8bOVD>WJ6lL*|~Mb=DDX5BUebe1F(ZUnAC1- zT2IXzBSjTBDl6~Wq5QGG(Qg@9cfC|}g$3`8z5LZWZ)Wa`I*8T{{+HJM1E%Ujyi}_) z06EZ9TL$SZK1RwLcrs`xS!gA)$R^ei!ND#ItIRMwFol+DsUFx2H>zQAw!x-c%S=G4 z=6eH!nPcVRY+2=OWfb-;w%=*{`}cLrX>Dmkphl^7CYI+oDq6XL7Jrb-Mt*V_x1&)48$vVuv zkU1I+0f!VDf=9_|SkI5i!%!NeOKVg9lrUS09^?d3DlkHhukx3U3w`}9SpWEei7Z8b z`he(dD(PC7jg4-~1!u9wNMQU`B=@OCip!x7pePvIRKp?&#!x?{?5!B8Y2nD02Lrc0 z-Z%3f#gxlVHcxLqyEd8YohOiIQ$~!L^&O#S3)J^<=#Vt`Of(~KR{t)6FiJa4orhCR zNut^N{5hV6pInx{_ETj_*SarKL9VC^GSISxJqkEd`}{X7>Yx;KF@OUYfl+r{Io#oa@=WQ!FTe~{xc?HKOrWa;y&w!O*xcfH9;-~MXo90jjuVntTntg zbh0{r@)X)lfsHF!?H7m%Y0y*?+w2O{Q!X(SgM>2)w{f$8P+=X0)!g>&g5M#aTs(f? z&f1VToO@!UFTs#<1lSX!G!hdlk+F}*!=ActwsC_4FsS()Yw)Zfsf~JcDAmOM4qbjK zO|5(Uo9LThxE;bQ7R|WQVRLs*^>^ZAn!5p#(0mz;_+FO5E6vfwLZm|cpP1AtTC8;a z)pV$a!>n;x$53WC+Lc$k8x< zgr#pe4E5Hz9C&z}AeS!4N4TFJp*q_dj@?kXU=pm4fl9Q0Q#R2N6{K`-82TeH_vAZU z*c?xfqjYrR+zm4zVEl}7n(z~7jqobSnFj`?Gy66O7;3`x#>uOUCA=ZTHh2XN8Afyh zRWv~Bj8mHL$+ZdfNj-D{rZRkm>o)I9I@KJSxMmGU3kXyqfepa=&bxB>(_{~3rZHWU zUtBI~z{&mllD~41eGFd^N-?RaDTBZd^re1_nqmC?^`*gfjdWWSq%LL7VB2!$eFP?N zR$8+Z!q8yuJ(@i2*=GPo)K%#?=y%S(?};J6oOn=H>p#|OK`@0wK1&B z3t=SaD8LuP6OUe<{SDl-_#@b+MQ?){fruBi%@NpxL>zd6cL3oyUGFS zo}T^dxXs7GW6c#qgQxsGQ4%kL6qQ{Y5tL`g6z%dY593TLwU6sThVACD1ZYMAf+)6= zC=^;mY2o|_+S(~o=zIO2yR)G;RKC1xEKqRLT?OLF7jxnxlgARtSCLH0p{X14Acv)c zPv(#eP6jfu$lHXHP^w_4lXy+(n*C+>M3?OdG2F>dsqNO#1mqRRGBRVHqKg&1GQ(8S zo8@FfYzf0~VB z3B`WrV-<70ttvRggT}o;&lxw@O}Q~5lJ!QT$svo7h+E-~kT9iX0dDpA1vT!fG6)p9 zR{%dxw*7duHT!@SGvHoAVw!g&m4~a(-(o{kBqB;UrVBl{P?`UDDAj(`e&u z-SjNsA=j|#dxlN;TB8SLaA8WBkGu31c1_%jNY23@?_307;!W!9HG%I5Mz=~Vz zp3lqY z5~f;duVYq~DlV0D$rv1&q^k#^ZoK307e!{79WU*AG`M8_Ro>-yUWLC}2qR(-M|X}g z*T7z>5cKXm1%EXUbg9#OkMINp+vDPFf?YD;->bO@7%AFI8k=RER%SDoeGdcUX@)xH z{~|fRYe5Hjg6vg7aU)}+uxK#NY5N10EZmzH zGv9JwC+#?;mn*SktbKb>@}cjk0WEWESi)^#cuNgpW^K?x;H5VY+CPBL(ok~8A|6Ro z)|6zAk5E^SB$JEe;kV@_&8XE@ze!kUmQj1>lsix(Z$yVy{6lkGJy8CzIo&UJn^)ZRdoszjwK2b!1XQ69gbx;jMWnxDP=yL%naFvS z`ERgIAD={P9bIJ%%Ya^bAv zg+nqb&{bC~N}XyoIED(s*R>^;@LsqA1d_!`2KwpAQ)xV1jXGI?!is9&qB=LUiUvGu zxFt~r4GhFtxD%rk-^C>ww8*QwE}B`>`z4qsQKPhRmjX$=u< zO{@}cW{->C7E$U=q=4}4-V4`fqgW5`|POONwC1jVvXiam}MAY<~A7uMoU z7zO6;5h((?{MnF~0&c*x!%uFYbn{K(wTT}1#7|ye6mEqjO`>$V$+gHN^XH zgDd&tk69_cVaD@B3}#4fUnfNfq5|{djXtdcGo)sJ=P931D_830du7$DwTQc9CoR7% zOY)}MKT|6tk}Xw(=KH__q#by$(UKm2f-U}-EA5VJ$f5_5A&5QUQQ?6xq2ML4z=-0T8-)M{3k*1Pot+-r7oo?Et{;vOMn`D#iNX_6DAx%(QZ zCLXI~eV#4>%Z0zo$(zI)G|UV;6?QJ`fk{`Z;(rv38D4%Nucnd_8zXkl6|$u&9N2vI z;8f$^y~&6*y4*>>-!J?vvMb*3E>Gy~oUKaNJ(tjVO!)e)jW=O0N$}+c@SOY21}ff< zIk}6o@nD*MAT5D0Wq+qNo`_f^kW~1~mUGMxZP^P_f**`(Pcr8jeA@Y4eR3{cthI5s&pAmFX zh9$Dh8kmJ80u{A=mm|5Qt#D!03%n~-^RF>|5~S~dR@k{~&AX^8xMT0VqgV59Hf^KE zL0$0B{A#50nG%ANcj>f!S}b$njGZdDXz{3LA�!=ad5%?I&O#aoV=9{F*G}n=g^O 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\+Z0IsNGrmSmfL<1*% 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¨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

En!ueI+IAibwvF?g zau57^0i=Xya0_(TvS)M)oVAuCxmD?0^sg4oUpa;nkvET3;#B4$1%W{v$f_amdlT&) zlX0j1*nlt0>4RRDu#BbHAWkO7JqxsJh)CyU!s^_&bEm3)RTQ!bJGSb19Qs~m8UGh$ z@7P}XzHEPY$F@4Q?WAK{9d~Tonz3!$wr$&1haIQGPV%3<*4p~)XIr--~fvI=*%TC z#b^e>)SUe?EFkR+H%<;;lzZ(ggIUY=Q7(vP=d&N|Q&_u0>p5UXDa`5g%{_HPF86{K z)#V1qB`m_+O5LlyUUhdmQ-`sv#CseFQ|P?J5<=iU*sd46$EyIaFMxUOd@g&HTSZiy zumUY>c7Ah6;pyUZ??4cRk4j0u+exVH*ITYl=?!xqU&mjs)g0GOwlS1w9^yIeR^+~D5;V>y9QY8K;i|olRTJkpP~KsPSOuY z!)}sBy{_oub7Z%;is@=4O#eKmg*KII7A)czrr(Kd6WZ?Hv5(gFG+^gNv2;f)9DLV- z^DJ3mrYe;=%K(TKTuIh<@GyB9J5hf>y2llEf&2%?5VSYkHers)8g&J>m?ai3p4B+| z9t=XV$hZzjZEMoUe*o*FSsC*q*xQOIizzKi%?8KivRws{o*Q zX-;0CWis4#e)r$!&HImm94?^?uEEpfIY2mmIDG&@yLsW9I7hxuc$YDxohonzf=)tY@V0tgS`;;tLvRXy*N_p~HxpB3Hdlv0)+L5t+a+|p5QAH9- zLQ-aaL2nXt5#p(OM+u0^7Z|}_zELon1y6#vw8GS48vM@w{)YBiZO(5^@f7=(1Q-lE3ZZ;A?&h^7-ddWJ$c4?l3=O2p%J6E zu<^LhK_ zW3Y$=#T&NQ3^h0g)H%ds$Uo1-oKnr}gL${nOj#8a2AuaEiYCJSDOB{5&B< z40!Y)y*Y)j&=I3Ol|)J}0|bns5Hhao{Obw-9$X03S}9(|=!&|C<;jX+sl-1If3^ zJODHh%pWyfc%xDB+k$X&$UT~p<^d?@(5``S#%7rI8kEskj;iH8pC-f0C+|`pJYYT| z%Tsl?`V~KR)KTFYpy%WHjzMUY<+fa;8m#b3nSN@f?2AxV2q<}4aqy7-BwU0{sfK|N z%a=ORO4ImY)=imBpu=E9oM%t$6vh23;Y5j(jIiJj!cBfY@C)C`n2VR}cv`|A<1h5f ztDlnS2_!6(;HlMU&b#nOlN+qRD`%?|NED&aZcU1?O&Pc;0q`IX>El_qBRSn>lHf+! zTG;VDG0%`x1ysWylUZeA%C5_uopEEoU#i?OEp+f0FjGCS1}8>X;0lYy`)*DfeT{^1 zL{Xf2nBQYs_}msZ_Ps#Jo(lD6IprhG3?v>#us+QKPk#PD8)By;2=pC$7GSF|^h^O3 zFpvCoFHWy&6>w!G%-pLgJ2Y7`iN9PZOi%8Ul4K=2_H>o9!p#Zp4Q^8jZ2|Vl#&xiZ9lL52JA%nCf+iP zXbFJaV$}8EJq2r#Irfs}(i~!6^X!8UMugUo=m>d%-pCG4gsLI!2z7?HMn19ce+^wh z>H!2i(eDE(3nV_iPuhc5L_P#J!h-~a??^W!gE7c}z$fVa7-Ti18j^Rgo03p|;on^Q zC85HDx`gj2H)^3hV!z>TI6`|wf8*_6A%FNjaqYtoG9Z0~x}o04hXTa3L_338gIl9p z{aVA^aBdLxG4@kJ0fLH+-jPzgcM}i5^`9+SdRvxcwg>bu4G0zxg;m82*$F zG$V1UHQ-*K5B5I?OhK6cTI>HaT>o7)jE(-T82=iztD*(vKm?IQ0iU@;$)}OET8E+s zaiGX)BOy>8r<|A&8n=wf7bln0-98~2)82s4|4w>odg5pJ_1yIF$u3|4gttF`oI$R6 zi~Gn`&2fL31`<=fO=+dRbirn1zjzZ&ZoRUjs9ClgfJxht8JI)9Ae=HVsdPbK19V#b z818Y$^e*2TurTD(Z=9^L9&(j6>VK-~tRO(z^GYsH9SVP}oZ&*_B;t90ybEk_XP&ga zC#L-Y4(0v3Jci^BKU#4WPtS~xn|3XAeDAL{JzS7}#u#wo*7_e4_vc@*|9WlwV>w9QDa4m1z0w8j?3uG<>IM1Y8!Bj*4%9_;Ks4sR1NttsXW(M(%NN` z#-4L(QhK@|yLD=+ZaYP5d7iH6N)!6>G*K4 zIx1#m>H=v^{Z-a1&V$c-xX`%7G1lUa;p_u(grGuqcDV3DEGFn#fTnyF+54gUIL>rZ z->-DV(ZlvKGE^0t%}t_ZE#WSr*~=luEj;CQk$_LzOy9#RI%OAf+N_^^pDv$6U7l8kb57LTPG<=?}Vp=Ee@0@ z&=wTOJN*SyeGhrPXt*B{KJkhmGu&PP@=~g1zBsf+6P7S# z$HzfTQ(+}0y2B%ljQbxS9+@|5xSxzpBPBo|LEx=sjGZ>t03ChETf5btK`^fcMT>2Z zbzqk=&=v7q5o<)+?;md9YFk)754DfRCLQlPos;KKR!`scH?rH#$_NjSn-52-&IbLI z70V>cV(#dv7nVD|w6;@nhOg!5>#LA5xv`{`4at-U;a%tsZI4Q zM8C4XHc_py^at&YKc&dm`lyEh7oHZOwNv!sg2N%bT|n25>+keo8L$J!ADh_|#>d;t zX0w~EV|ep)V(qZ%4DAT3$PxY}%7ZHBgF9TPATA6Uv#DW&b;6Nair?ejviz(V&W~}G7 zx!}Y@KVWt6a4?|nd<_S60j{ef_mE9IV`Zw7z$SGg^IZqHcK5|DQ^gn>klHiCla+wT40V__3Im<#j1Q(&ZGdFs4bto72uHgIz$+ zZKDSkOOld>1+7EGg%a8CK-wyDC{Y_a9(UaX!C}5B-xV>Z*59hxf5M=zMWYXw$OvIx z1;7bV)chL!y^xMLH=eXMzl;DGK!hHAC>Apf=ju-++wC`i(mN9 zfF?0yxhjFFxbW4hZ)Nw7p<>x30O1qB7i^_dUF7wC$eCOb9|6+eor$GPWqji1ZffgR zE-5J}w`hDLm|%P~-mo;Xp#2wI^V^aKg*n3m+UA=HtbxlZN_+tg_yJcu5MSbK&0o5N zCRnsk-G!98659vg;}U`q?Ob+FqLY9_gL|*&5A3Gz_FK?7bdc z>Zy;5J!HxG4rEHF579=XUu2g7R(@UgUwEmbryw`xVw9V_>c?Tu4s`hrPZnIrLEbPChk=_glK z_Mx-)&;1T}{Qna)17Ss6%wGD}uig`tCiu>ynAQCa{m+5Zx;@Vt~c zR{PTaB_2g$uRgdi+C@u0G|_4W8SVmbD&v!JAF~TI@9lWa+|da|2nrr0>Ls znVLzBm*a^M8E^-u-{x4@AK!jb^}_K?lo`pZ#X>8;>)@@}2Mn|5bEz_p&BpQJw8c^l zBT3GtdKiX|CXFnTFDS*|@1zW-+V;jV8+VT|WFnrZ&-WB6w8Z;S!e)xUnd(u19Nk@H?&vNN{=U|1cYG!&8*ohkAoF+xkdjDca8|KxZ(s za7SU2r^_D29cZnOxmKSFo_hnEDQ@rn%jd8SS`g3z6iq1pyYxg~^`Fz>pY!3TPwFZ1 zFc4q<{r~WXF8$9R;+qptnfH%+LTO44s7%Qg+(K6n)aebty*EHTh)Uq^1Kyxw?bsSR z4vN(^=UtdOqh|K{Ag}Wxw|GOtZoqh*Ot`bI&N;GXY90|kwff7!u?5;&9QAiqW+%C$ zb6GYYa-n|lldmJAwye35%; z^NJ>p?hSX~LS9{4YMnetri=fwBonibG9`L1HtM(4#8)Mz{;?0+R?1hyU^~WH!M-Zu z@9WijrQR z4TGa(BWXff=k#PGSed80rxzvltt2=6t}W=jJ`s$segPQ72Elf;y{&u7dC2STWb1y) z%s~hHjj8lGm8XqP;c>8#!NaSQubf*ju>E|fH#wx;~c?_7cT&Rsh_AQqN92btptT}rx1=D*`g6lp=?^%8U z6RFQ>H;C6U4m^)09kLly66t(aSKGQf&wy^nORlz!zhf0kY7+&(<~Y~U24|=3*lkl- zUG?3U8!?-Rfn-Y0&Rq1?k-O|8yOo8`AIz>zc~X6~juZ&+YH$s`c)<^_K=d)@mwXEV zy&r<#`q(UQ4gWkaQ89ddaFWN5v=&qf_ba-SKBlnJv>MOABKdf>{`dAVqys=vJrInm z^g42O+>kZs-r`UCz<9rk4&45e<9(gcPQfH)z_w|;VgskDvz2$=p%ZV}>@*xDGkA9f zH)kTqVB%sJsf*En@H{_A+;9pg+RkCGfg}+8-d*XAV?Jt~MN?FD#DD!IjImALSYe8#2IUqK5q9 z8Cc1aYGEWdSZD-5G`zLpjqVHKUeUCMB4WAN_!cS?iZf-x&MhlgUjSkS2$UEjk);^? zv6-nj;?KzU-?)OOsS3$Z>m4thrW}r{7Nb#7qLS!`&P1N&h*XDuo(w|PARgYv9#RJho&)_S~ zti0-l+C}fNO*})qngC%tYZ4c~h(&fT}7P+8AC3y_j)_e>kmFU57~$^|71W1Jd< z?hP=ONWzm}K3+wCIEdO6S4YV)M^+FKYsS@5fW_?D0}-)gx`6NcuPO_sERn)AaD3|s zAaFa@5dkX}sx=*OpOR84cYw42q8YozB6idZZ3ztS)Kf)c# z8DAFNny7g-8v#}!H9O_d&Lu=6Hs4{ByUavSg@ch_N<}lpWU}aolm`yFuQ@SJ#VgG( zu?oLhLK3woN)uq`q6l|E(a$B6pXwG|JS1GS=u!r>M02t_1x@jls0y{$R)bz#2Yngmyb&3 z(Nc@p%oDt+ z1-io=%wDw~zh`j6`Spdv9s^rgJOWD4Hx!l66k~Y#)lSg9ek2UnI%o^dqyVzO9n$%} zvol{K%<$BN6YbRE#>m;%&y(M1W*xh|MDu%kLy#APc3mw#O6`47^d@Ylp$FY!C*1epp2vqIZf?u65nChV21j`11#wL9p@=8l@+~ zK|D_qKhH0p{z_hKFK8By`4c?!Pt?Qz7x9+BSp2``4vGBt{9FYGTSH?<$3G4OTO;HD zXtRoaa=^QHmT0a5vLcfXFV;7D8v~xO8-FII{8)vynu}Sq@#;10UZB5#zc+?iu7ar; zMg9_K;p}#2aldbg7gjZokocvs*nrB7*k}+k<{OH>g09KOqZDyK^U5ja z7w!DWeF>P3S&=d~yqywFI$IpDbU_w*Z?9(WIAU~c_dUVsLQP4C5x_R$T-;Kly6Z(| zfb*bNy6axf$7QP)#eVdn5TqL(MdQUD!EmP0RO8PmQeDq5Mu;d-PdJZ{U2f3hiAQQs z2%Ok1X6;-Mm41Xgltri&*j2h+Su?K#y7}kH^xCWujGqclL>YCk7Zz`S&6k;AFqd?| zb}RU=cKcsBgUFiyYnt)Dn702IHw45-#!3 zc^oJmXL1m9fTF);x={OqsjO;8X7YJfF3d#|e^Rh%ka5r@B0)D-(Dve&bKyOQHe2uH z+#&%$ck*%@s)d0w6z)79TKQ9Xc)JleJZZh9nN%}>!C-#l^Iz5q+sgX;O5n`=4E+7O zs^Aau5aoZW@KW?Yf5rs-cfz5iH2_P<2T1c5mgfA6Nh6BJcD+XSQgtfHLU|KKihi1)u98Em{o%9xErzraG}8^ z(T{VP(b8SS9T9VWrac%|P5sd!*qYN_#+Cgwc~FRNE?s^huW{}wsDA9N%h+^wmxg0A zizixNn4)jW`0;6z&I;Dl9r>g+96FN%qWTz1HABDrH$zuD?gRx>&hJSz zfMO(IX-O8SylD5*%#d~|m0(Q9c%t4JI~*HXD|54SXEM#K6FG325N zBpV)ILu@NE));)Yjq~>tz^dL`LkL($?Fw1WGv;r`!dMu%H4Y||L^^L#DHQdlM6AeI zS}(AOua83~OE!FB#?wm|7ipYAIz83{Q$=*jh{c$WF{?g`u(XjICSH@*`XRVog&A2@})B#$Vnxu4Wgqqyz&&E zO>nl5aNLh|{DJAwEWAk<^%nrTnqBL*yg(rd$JG?e8lCcJXk>zG#E<=9j{@bb+?4h$ z=X5Qwf!LQA#uPBm^)|8ybqpCm){$9_NK8*tw+l=;+=OYgR3GTNt0@x+d>~QsX~ma( zLv9gqIJ}m{3=~N0CYY^zCUCCe?P$({vaHc}u;i&O-}tU~5W^km1=m82!0dzjOaXt~ zNJA89*7&mw!GR9npU_z3o*7DQOwLAe3i}xN8;=-x!ymIyUV>1$u zzt>#LDE5VVpy@%^_AplIg^z7U&G~mYVRBvS2UPMW*(U;XcX(u&0MPbU)l-UM`;;Rn zrMbZ~%SV4l=+?@s$AJK~y%{k7Sx)}swEi#7hQIGf|H>`;_jgNE+M6fp2=Yh|4ar0@ z;sKNaQtCQe>L@dz%(%3HumPbj>V^Oud2IZ>Rn`xd+c61>fP}`=@42#43B@&%8O3y` zmg%gGLIP&<_g%6Jy6gPK0Pk!**{==Uk`!BESQ^iJot~bKEO%*HSz8G^-XBvfpS|F& zp7#W^5T()F6d7tgiJ4F(v$As{DW=5?((}kvzD0=Trkm18Bc%xtD zZ$gU-HF|9REk+z+D&3=B;Q&O(+GIHs(+u7jkt^qsE&jZP3QCVFY}!mw8(m#d^4bNw ziguN?Y@|uw*+rGZfTvqZFm~kJF_foKOb`c=ZMy8V)jiS9{hkD7y~w{bIbGsRi6aJ} zELf7rzW9ZXtwK)X6z~hC-OUL)=C&6PMu=y3u7EEP+=k}GT|rhhPTa?-AX=1zYBdt7 zu5_+6TbMIbX3|3P+lms%gjMLhW)4Bu>e)aRj4XwygQqi#1W}~46TL*Cj2X(bxB`>-`n;GOoIekpTXTAb z7llzOjRquKRXb8duH+f^2g5{1g%^NKA65jbl*BiBJVgBc#-tf}YBx@Tz_+1Ile}-4 zcS+Qap%u_WCNTlK&Xokc^kG!RdOomW_a~Dh3 zv$sT25o9E+r!{6TilGccbrIDr;MZlU=X{656XF|`rWTcpPYLW>h|gu-W4Dy$EFgq- z7|KaC!d$#*B}a0wA83lU^PSiFI0D;tm3t`T1JI(K2{yH@ZLIJv2Rf!c?lFPK z96kddlzJrcP2%l2Jt=$VOgmcnTL`Gf|HDQl2KK z^ud>+3^>+S&eS$9E^70U_YSLdM`Vs`O2X=jfaY1?$vy zb(`lFDoaog^Rj1V@Xhhq?p&@FO%7bKpQw4?D@$O4*I zpRVb%P%3^9lRU(5-p`wwgKF#cF6_!L>XVLQB7Ss2moL@>;;L0Q-cn9s)-Q94DyCdM zaJ4U*Uu$NUG+cI6TnMN;b|RtPrndNFYLvdq&-92{$BK2{UYy_1kGV$_Yvf{gl)F-U!|roy;fE8i;;+Z z#p-ZB*MV3LUZ^u@)=5?ly41luh7ux#FL4qtOSpb_q}RA~xccfAhKuprk`z1{k6(aJ znhy36jJ#UV6SAa6Z`dTU0U{q(dI%z8-Wa@S!blF9D@1nDC#5>&8|xD<_H|v|)r30u zH7Jd$XQle{0PhOp1gfS@6(j)OpkOM!M{i2rgI+T5lZ!f(IIVZLoxF}lmh76U+fWv} zakoEnP7|CCl?+{s7A@%+BAK#)kUJK&FM;_JlaCNd)e}`z-E)C4Ck-zCJ?eBd3}@Ao zMi?Z|twmozjmSy;Vn3JWXNr?vXr;9AgHFY0RNDQ8UTe*gY}9t+LMnj4h(@Puc(9_^PVQC`_j>d>)m@tEnt z;)%Yj5>DCBhN|yXe)87syt|?n{lYI>oR*f}iy_-<1m2nf+oIoBFyd)D3%^1Vo=DzB zK(m~b?qgd3#aoBw79UDGp*^>+bns5?mqR;eI3Is@4cJfw4N2d4pn-2aqW_%F{yg^x z|L1e>-{-TGI5Y^0lO>Od8tPD)X;czgaPT zd-bugYgau}zZW$c%9$BMPkXG3IE`Zsjf7-H$jjB^l0oUld#xFZ@?FBU zE>uaXptF@`^}+2d3(7@-4z2FE?&zlX09nrGFE2H$tWLQMaN&Ro)Ls4i^ZWlG-~HG2 z=kE(v(SP`VPotU*GGL8AQ8mFU*;s@7=>;gRTi`K6VsTIIPD;{szmmK_-Uo%a(9viE z4Zs!r<3IRJi~sn4Z-^+4e>Oa})Bp*nuQ|FOpBO<{0AX1B*eKlTvy+Tkx6P5eW7Fve z-lmm~DX+!5$@=zv(*4)&gm85YQ=o>!G)XP3G~okqQ-;l!5%$3}WzVvAW#)-N7g*2M z`kvLNhvjClM=tc*GWpnEMoRZN-X zA@pn904Jw?Z39NS34~MW?v^QU{X5^hs$q~*$CPNBOq1EC7UKnt2P~VyqnIl%`ZvNb z{LDE!)e){t(-R&m5>W|rqHpc_P%7>fgdX;a17vt9H+;h4=z#`AeS^VYtQeh2@RvWQ z%I<^yF$9almN2YOG3*Gpf|xwBx<`qN zkd!DbZC27ijur0!Zb9B!6C!QRTy;5MofoB%E;fR;}AyJYNQ ztX;P3z_+8GZVV&Qrgj-3=4iUG!!ZUHuul|+v8LFMQsnYg8f-6!yELx&tkc;dxni%v z7>go!SeI9jmwUV<|HcQ&lbte!sBIS0qLGO-*r<=@mCR=)dCY2~2RAmD84j23XM@cc z)pwr9;n)J0`wLid%)5vfiV_%CjFc}9wt{ss`qk^zDzF>_pmJG#bv-ExQ9NbkfXUMa zdP$kDCP<^)%lSaZZ_NE37p@7su4w#7R7CIy+#AsG>sf#oYzEZU6H$safWm*t&CZnz za4I&>cfj|@WisQ=cTS}==3<%yd^bVVB!7kRDE>fS*F~XW;*NuWIy({^nS>tV`JYT&)Mu_5J`T66mHHJ+q=fB%$SC$fadKq%5(QZpF}4?^8m38%VJ>V-{z{UL(y`WqEkjJ!=3U{xps_ApLOm}-}&G6 z0{{1x`=8Uj>W0IDDw;M$w*-@v1Uwi>u!DVHoiNy*9KEar92jl}IXRNY=OINDvStx7 zu3i~_U)|j@`JgZ3!nr{R7cwQ@7oMgs&~IVPTdxuTCQ>7A0=>6e44 znH~^MXbL|J5i}9DK_tu*b!Jt#E{j!I4|A8X$|sPU&lAnRiTosrJ=@W#fhHwZD?f5Z zO?!*>mfw2aXPXO{G8<0tJDCf|GC5k#EB9Vo0K1j@d!`blnzUyAEmv!s_w;jRnVE*4 zLC~gvX|&KPtR?QXiXd{_l_IKy)iod{Ij9_pY7IwTN5Lb)xU^~DUMF+m)CS_7;96%S=s`c@~6Wm?8Ev!OQ zMt?P36LW?|*v<79#-4u)WL`ysnrQGEA>*b2@KCFmwel{!@wr3r=MxQ#R^4vr8)kH- zFU1}#xwL7rU%i4K_?_M^E5dipg0r?cZ|O8=c{ca%O};j*fhi5yk6W8NDGfpUnbj#z zR&bKVQXbnT+hU5D+$Lx}vtUObR0?!|36Iz0uGs^dzBLmVpu#U=EZqBc3G&0^#-h#% zP>`Ctg=|v@3*yQwi*`p|mUi@MIJJ1VAObfVSNrIiveYbhpbC6~J>u7T7h*|KSFN(5)A;WLGVwpEiUV1iVDCmEi)l{v?P#T*guwu0JP?bK0UDzx3 z2lTn)U5G|kXL^b z{&}Pj8$6OciOwu<3QfjAL&LH*tk@sgshWY#J@}qH1DaKV{t+0Dc%Im#hvTzF=DRNN z{QFfaBt3oVQ%lA>SBTb+`Oe0UMP*oDVooYXCKo=ou7YAucW@}{^VggZx+n2 zIBGNX4i-1n6&Qcv9@c!^xadybB&-ik5JHUkWnZat2AgB zl`@!-TVoqIzy{W@bMnw*K8}Kd9;>_M3P7)%R7Xu)<76RP?f=$j{Yr(HZyUoHZhU)a zgg1WFJ&?V5r9hyMNs#^uPo1Xrbb_3Cf+|7+6sm>>nx}{$qW*$Ih&OHpOz);bJPW4^ zr3q9^?~ZPdGK$OO&=J|`jtWdkC1%aA$8x?PKsUwtnQua|Tyw&CMJ_zTcxI2Y1Q3X) z6k9TAbLq@<4g2`1Fo%FHOa;g37LQabR~3j;}yF5FBl(sprQ=DQt2AujzWJw3T{TCJl|cB?8M^* zb3TaOO7L^haFNE08Q_M(@d;9={7h)DR!na?j;HuRi-9A<3qL&`*tVPcO)1l988%bL z+t1PISIs+!^AR|NPk17WQ8E!&0l|s{72Arl&FB$M!)}F zh`~OI0&S#qbCCZ(EAbyumGi%(R6uDVsvwe2v+c_A!18TAAtkXC>^L+?cO!A(a-dzK zS>8I9aP+xS_(fJ*hr!d4e0)6AoZ0W6G0fBSDvEG9>(WI`dUpM`ZsdbZ&pYw2-%ISldljOV_Egs^V@Q({3?Q zQTqu)K=CPMbaJ*xQ z-G)E0HMeTZHT4}sLaAInrJ%!=WA&pey;2aGvf+^0t0`bKW0@pS)HgT}I4@A(ip~%r zpC+J#`5h9d+QXB;<;hHyyWhcik1eE0mnmWOQOcTf0wN`_EU=jLiK_bU?`VnLS!DqpX|SBH4&1vXmOQk0iV334lU*m;wUP-uVNLJcv4ET?Uz;3G_K9 ziOTV&v{m>b*#tS34xUQ4cl;gW_mD#_c#%3nv)Su-9!7h3NeA2k{?R&`Ne1y-8WzgR zTL>1fuP!zR$h<k!(Nznh1@ESU?#M(FIn9DssI8+ zQYtltOYe*zSIBy#6P|&Ei-u06p@`hnd$Cyba(y+ z+DjHqYy`yt%7T9B&ZTrD8mZBclpSI)nhmL=?xOSbBQmSCWqFmpBW*6)l4kkNVG_AM za9o7GP(dkXNEm>U7>G+j4>UP7xRj&ODDlfvRP(YK(k+$ua_22)SrW*%6=BvzyoM7L zB`qNJvp2Hqyl{p>l~@~&81#4B8dqk;_K3|fb+f2ZgH1$NrlIJ3dq`?8+HkK7wh{&( z%1+z(%waebct%hYVT2UuARSWcD#blQ-;c0Ituh~L={>I^bg*+rn7FL29thh1tH&o0 z>8hGzGP`1u0`5l^ZFgmQLZ%7L zvQ8mSLeB2DChWoDBUkZR^cy@oW?p%&UVm;MT>;*I!}h9Ji6IFvMj}8HIWbTEh^n`; z1}ulC-zd}DXJv#>!8-VD@Yqg}w^*%JtF)5U*fsS!f2UiXZ!SA4Lbp+Y+uBc~IW8$L zSKTESK5i|qc(4xE#Z>q1``b)47_Qt7s4fouHENJ&JF5jc^_ zdRWECXT<5w_?&G}#Xy+^B}YVg1R&jm<0BU+QcyVOoG4b@E3R^g*b@=P)l3f8!#eJN z66r4yT3-B+r~6Soc=1EbJ>Taz=o%KT&5fog%>BdS%Oo`z+f+LkihIdDT90uO&Hrn~B`vD&(k6nRp?9!JaMB z5~aJ}xqdm1(&(pD5}ZpxP-C+JP6*hGEVM3(Xhu*jIh%tAtB;5@@xW}Bs&u=7nrz${ z#>)s!@41jt3-rCsMA^tx)ORh&Q^2~u65T%A1nPOPYI))o^Gs>76kqD1^MEQC@;YMy zLPEa5+U6#`dg?%@5bT~P^VxjIH5T+BC5{E|K5?fc8sb)Lz5^?d)N>j092+Zxd{2?NlYw#D5H z?Tz7f>Xv;2hq|uRNR5ne>V%?UaM$VB#o0isczpl1W*kg$W1_(q5za2I_f+5> zk$G4-c=gE%n1LJK&iJ&%Pm#gr>Z>-uCfN3lHHBTLZEz3|}y0NGL4kes0?LvI<0UC7Aab`2aZKRi(b9B#bw`M>Klcw@21xuMaXRqqf9vauTv};M-QS=+f=UXL=A6PjLDagp za}cQo>=l}=C&8eFG6QTs!FuZHb3{Gz-WnVxr;NH&*ejkfDA>;B*GOj$^4Rs)v;rN3 z*KvoVmTqt$@Nml18)BdVp(BJsoaW+kl}(v`$Lb{InxZnXn4>dkxhkSL_T1pHydw6R4iSn>Ll|A{(g7EOe7@E4ff6&8YNs(l zKmgAD*K@NMK*@tffZN!Bi%$){R1a3#_56n+f2k9Ho0N?b&2os@L0yXYeC;9<;UPHG z9yFQni5e4^MURwB`3Anu}5f zRKdVQp@hDn56r&aH?5!n-#!?lkveIr0K>H=Wq-B_9X}fIYK&IZUFJ%_U2s)H>r!6a zhU{v6Gl&M_M(u$c!Jl@9qI#vx32bMM{}Pq`otLSv`hRG+|49!1_kLES_TBZ5hFfl) zl@+ciFdZ975G<>>SK$(?vN=gQkHbt7oPkqTZo!;_#h&?dIpP@(U#aa&E+XGa0N#B1@k&0{0(ELK$O^y;L{*T)Ons|J9p+{gRzOwXrGzl=ZnZEm1`d(4i{Hl=a= zcHG~be>Qw`Kl<|4Uv-y$rXziTruwKl(OndW=2SHMtFuv|MJo6uqmvFZ?Es!ZX!%8(jK@urYy(T$9Vrl&Xx)n8|th7N7y??N!D*& zzLmCZRNA&}+cqmBji|J3+qSdPwoz%b($318&*^^e+vjxmy&qykj6LGx-h2JmT66y9 z;%k(s9KhndY>>psYtgHlMSDl zY&vgEA1!<*nA>c<9cbu{7rrDqKE_!y=H}F_<^k|ZEzAsMgfm!CErgm~&iC_~!<069 znhF~k^Xd6L=N$aTc~?!{ZUH?@Z<_<!jU~e}g54H5lAIdaYizY(E)((sYsEX9skkY-mFt*?fiVz_Y%jkA zSqcPytqVYjQi(uWtdo9;SL4Ll$~8U7V2((+(jfR@p0>dN(JN`UanO-WFwQa=a%De< z=31XpXL&9U-!RjLc!@B_I9=?hPQOBRlcmgjq64p+a(UKIGhUK7Uj@;<_v6@jY%%5j z{l`!X+vawWe(6nJGs}Sfx~LOD;g@ooj}1sCpiMvJV%g%hk+AP(!0FOq8dlG_w#$G! z=;FLlE`kgf^EH8A(qLYfQmRO6>7=T-HkznXGe74SuFTTe!?4n}9K*>tSGhKjBv*(=`|JbWCcB)m!J4=iaAb*Kj61a*R%#wM01a zCLQba7~e`Jk=$OB1-s#eo? zSZ**EtSh+JvjE*B&6JSOCNxm<+5_fXb6GL1He6yCY0e>vT;-+YG#YutN}%YKDB3J= z5nvnUBk}W|c5?JY*e<%wzhXDTP7NNM@I>E+sUUG>ct&^};h-wcs@i(l${QX*JZ^eM zXy)wnn!>mT_B^3{GfJ@b^r~}asgo`>& zVg(aP{uV7W8i4zhH@d69A%6FnXPLoC^XY7YcV|BKMLbnwKfecWBxfzPIxLWQux*{_2lj)S6% z@qex&jJ>pkXC+Zm5-^n33Qs?g9fwl(;p^l8&p@Df$XxH4?Z>Vf1IOvuX3 z7?s{Pr9LJUxVe@XgEf|Yg+SaMt5Rvw922h$>Wl!ppq_T@bsvuw1VW*bUs6WIcp^Dv z{3bb*Y5j)H^@#5%&b(rD!1(2s5aUtXxWrqNFV~Jc*&J1lkSGHp!!5$zXHgo)pUm7i zfFqDRN3U;#Au9RUy*S$ILk~`>3xW?3Dm`QJlVg=*9Gj|{uI|e_q#+>>`UGGvC6MdH znrL5fn#;M*%Y_RpGwD}Ao8y?}?=dX}vn@fqp0C~fYfhqO=hAQdRWZB&vtp*s0ssGC z2>;fIG;2-$^Wy%LU*KRPkSS+RLxne#$(RpO1c|iDCoYDN(N*c4v1YX|m9{Xk00kEm zf`~nS?p_FHFwYw0EHg>A19;{A zG(>WjFGJU%C<33s;&_>8cM$8o1dR>F4>ak05rE3lQj|&gjg?;WqBCuVvOKNL z;d}+orFwH)h3>kT!|J%z>p`4N3BsnDDX&*>4X&VEqlUv>UsXy}B@WEP8@qlZqSSTJ zhN(c6Q7Zy!Mrrb$3|sk0;#{KX0ZS(A)n zmamA>CJ_dKDMHrxEt1i;?CFa0>XHk;}4^Zw=p}DX3Ei+N~?>kQWP5vxTXFMyf~)Htq_2D zl3~#n$N7^ner)aS?p=lQfqlK#7KO$oO~-gEZONP6Om;yptfIXRD{l9Z6h#8B+D)v= zFU@m7ze{R%$qa)quwGQ7wFZA&1djIx7jSrwdL|G0iBCZzj~|q(k|>lx`3D9Au(nb7Vq;ldUm~ zR+2A?AxZ5OHO%kjpw%oDI=Mv1vPYvyC9kPyrfOd!S-e;F=Hd#=-088`7U@| zp~*5jA~q}~{Y<0h45VD5a|LW-FQXeqiYCWqUJVVcj%EfzqdK5gpoS?)G>4-H*$kIi>+%#Hp^*RBJdju;wo{S$PqP_yHIPk zkKyS%8#FQe`dwW#7B(7cs6s(uh=M;C`p-0unXhE9VKlc8fLJgqp@P0ahSbUxGQRBU zC@qxvN0_Nh8|Ob74}AR9*niKB8@}#+*A$r=vQK)q(JFl!tc#zDs+45wiQ`S}Xo?(5 zuCuh}wA?OIK*|V~ByZO*hgq}c&&R_8An|{ad$l~C2AwIXFw6USdf7X4w@C~&-kzM= zYl<=g^Kx{&fH{FuCCUg23p0jni0DzK_i&g~p|Hb+_l1<~A5*b2J5|>rM7fI`iA4%g zIr++ngl8bU-(9XH9QxeRrd~?ex2wiD?O!bP4-l7gvj>JVR{^5fz?8oZ=uBG@^adrR zdzIivED-NJ-PhZLn0f<<8Qw8$2VJy$u~=!&UC={_zO>F7HNP;#wI^xkyt zJpX|j`SoqY5L2NNZW;^xc!I_0og+)gn#)$t$pJabal99%Z3p}Wd1^o!a{z{}7lv3J zavB#aOFMv76H?(@$4@jmgwiR9WAA`FQ5-H|EMV5oM+2JP*X7J?4y>$B@Z%8{rvNuM zk>cGdm%f+qop(J*g;5AfF><>v#tS@U(>KZ>wz1U@DHMEn@L$MTh7-Lo%JpQRakI-v{e3hS*U44 zK+lb9;@}A^Wi-5#RWG~|K5SR>L-&U3(7Gmp+RI+60@4iR3@%fY!%rr_W3p6sg z^HydpFf4JP%9|#Lc!R0#d!!qRI34%CQj#qs`SX|4o2a>~C*}(MR00Jd6&8Py8}aPq z$RqfOAK+d0*Ov4=nyg*!7wz#0i>Ig^4VVNO6LD;_x`=hXx7^N$0_=0zre<(FGKxRtmIx4RIR9pKwC6qXqBj%W)noj0UHhr z_KBNmn@RzsGyz0DuO&#YJ6z9sNGz)3D^Wqh6( z@5Wy)e#cqfR}Oy9=esN4+<-e^j5Is9c`8A8>Y!f3O=4oX({h8&=~8kUhe>9m`|-|e zaU)SuGRx6n@zUd7MWM1WrRpDTRg~=Nsf8QMe`INIoVm&KDnykr3RQp7F5*9!z_2RQ z=Q+sm(2DOR;6~oZD$Ly(EDGHlm51rjp()L*EQFxO-curos}{F?YXxRW;o^YwD7oai zc6Vn$(_tycVwh=gl6|j+v!W_~34$hCxVN$Xp3V^x28Sj{-9H1;U_zloPTDJ$6I6As z5>?4hPHHtCmBdowT_@3d+f^QzAmAw`<2474wP46-0>+WRJOA94@L)n*On#V@KYDQ3 z0Lpk;@5U%%^+-%t5DXMAEX>k_E{ho(CXR)gxWU9M&;ThFb<4NDav}Yb)vJMGKlxT{ z)+2~zcGT~N`KD3Qs5-bHSISd5uMu7$ft-eKe9h>rH6^k(vF30)M+ozj0Uw9a{|O*vc#+VR34_u?*cS6 zb4uDeVfzx|qd22~Bt=6!H!)Hlfx2yg7ny~@io<`Th3#V(@rx?yJFk~LJXZyn-atOlI&<6p?8WKQPj^KZ z^NXv{i*{ZDGY2ZOKfy_^w=N@3r^f+A z6|!XqzpKu#Hr14)P?w@}i`_A>vr^#|i8>{3uD4CT<`;}hE`%#{vnOrVKlrYvp~uQl z2T#cx7c-Z~Wq(ZH)AeUcS;K&6ikO4&EQy}>E<{PYg#q1Cj*+s{;0h%xEWibu895}~ z3QUbx8`^lrG2-8<&=t|RTV)UoE%D9_b1fwUr)i9?o&Nm%X?v*t69;qzbap?86V!n> z_W~mOYi!;+4hQsCjcEtWQpbY(JR%|Vyx$El4^xVYGjK!cYer3awS9kw_)X>Z#vG6T zJyY-A^9qusP*DGtAV%0&`pRsG8TJ^HMOgWWXkgpTWqnjE_?* zgpMfveh$C29Hx`gCsbr7BZU>tcBqNiX!X{0Cut5Yf5a=&b<)q>^BD6}4^7G0fi_vV zUFv>_x2#yzl;zy!KF6VSc|3r`Xk~A!*2}aaB>{LRs2dkv44ay*RH|+-;R=Eb9@b6c zxj~Q$$o^>AW!~TKqxVXrkHuI&+3FTYX9U+W%C3C)8i)5SV6?gA_yyo}lf7Q{9R^v%qEHfIfYmJL>x^+Axj#N+#+$+rc`w?)}EJ)&BNX{&nRphhxC zFk5smi%MazN%YgZtg?kp4O~#LgxbGbjNrT7Wb(V5>~LngoZun?lU?%Tu|YJIqixOp z@@VWrF7H#c>|k~hTGK3yic4mxOHY~tkV%nJDtk0%+6FE=H+-6r`~>_4x6}osHq#@te2B?# znNQ?I%_GI_lrH&^ZfSrn*e2!LvR2)M`V--1Wi$U7v9f> z@JDu8eTVvlC^t%o*Q4300V}>~7&AkPzVPJCrtZ%!V9H`-+L^|2+K1iBcg4y^m;2<; z*}zTcQe0U=IXheNY`}>`esB|faC@!Pz5N%vti} zMZF&`P}R!X0w87#Fn9Sck&*rv&kfs;g2*AP-sGp2eR8Y{9;%VBQe{3SxEK|VT2EtMTW?_WI@>)WU2{iujfV&b*Xib?#NC|`i%2l?GI zS;W@g>>K4jX6mZvL+X#@Q5Ma)SS++c+>>`@-2M^*dml0^(_Z&V2AvzPBibQ)v`=&u zNc}Mpq|=v_Lo}Kle%R_8>UB$|Gl@0&PS7X4)uV6qJ4066XsLE7+-wYxN}YrQ(dPw{ z1e27wS8_z4Sj+}#F$PAq02lJR9w7%mx~N&pmp7=h`mKL_@2Pfn8M8>6o+eUj5!t>Z z+Zw__uv9$}!xHu4gqznGDjMVgwRg8F(7WH^N9d;RigkgfbZb*WW{I+Qat|a)>_*!& z;s~dEWjjzAEzC8(Uuqg}`3~w0L=6in#HRl;UM_dkYglq&rJTf+Cj?-!!L$74DvRh| zu?f*eQ9uR5{yI-gGPzt&of4EJkm-<{ZtfXOp}_l+h;y_AE>|6fyY8abU}7_L>4}+k zuKh`oS|6ggjEG~m(kjrZtbw%*ugzdf%xRtYt#=edGSX)@xxpm$W(&m#6t9R$1w-b8 zzBOHqM?C(Z=>4et{`9?_p)2@P(U$_Rg?x~lsH1MhAiG1ok*|;@1!0AF7%j!zTZRZW zpVoS%?HuOVcxmy^&8_cB3t;QpsS6w8RVBEWi)4!tiX#Ul&VJQS7eWX zO_4vYb)JOv(oB<3rRj6nFpFZg1S-MIN5CQ)L|iz5a-uIyd=e5g>P@!Z(8xW%4DJ4X zrV};IrB~U?vPJE{+fzmf690TzvcUv+ybq7d%ShNr%PsIb@D}=1?=PcRi}Ni?)9Or^ zcq{HL1;#rmTZD)7SoI`cf}07d>Vc2WA?6a#u=)B5Gnzjoy%a{nH%9oTo)3Xro6DB-Zouz%BhbS ze~cD{kMP^S{lfL?xLfc$t<)}_Y^d!%pS>Kb3nflC7!HdgYzI<13p-(CPPAO4FiDFj z@!jM;5`KkR8e0OI8)W1kA{v>!u)*D;n{PT>(z6fd9N2>LpgNut< z3u_Da#%h4)V;8lo7L!LKnOTQ6wAqbaVGd*pO3RRn74Ckq$GTY6#F<|~Hvx)Q*)D(h zpQb1MJ|1u2eme81&kok9RXA8*Wp27wzG_rDW%7mqM<#UAy}J&q5#9NxHa3rHQuZy< zH*(s0cpY{4Mm8@iE^qs_T8`{jy3F_B(cvqH2aK*Op@~P4eK-nBDMoO9d?}6-kzGY- z`U@1q4C$sz8)+-yT>5>5gK2(G$+jo;T=OMn=uREan;aHIVAdBLutug|$Vfahlz&kw zUm#(DtfxLQma~Sr-M^uEX3O*Bhs^bip_8gArf}9xZ|+O#O|4RlHJdKhDGn(eIBRH5 zz5w#JWUp8x<|{2yr!i9L`j%;7*&b&-u%!Nz+ogMuuhx+XCH7vb z@Y(eX@o+aH(EiW}<%~g2&^FNY{SlSe{dL&DbhSN}1JfH9Y}~Oo=8m__@^I8)Ye}@S$9U?qXP5 zA=1dpQxWza?4csQ^&b8TKN`%~ISSrK+{kBo(#wO|SeG(X_X5V4o!g1I z`E0&;gF(APYh#7pBoGR*^CagbwQ5EkvOdz^`kla*AX}iL+#)Av)0+IC2GHG8tNcW6 zA{S9Uem;H&bWuhc2W<(rr;zwDvaw13<;uU7&{>-$>4@nC|8@Egnyhk!F3Ke8x~EJw z#yvo$6-FT4E@@V>3?AVLf9G{ekcAqk#=Sa!$aaPWJ0Y<%2z(|a;z_RR-Ef`6VD zc?2WE{jYVO|9`5667&B*T+si{(#=+o{wD*x$}JKP8@SWg7>NA-6V3w}smDleJ&kKx z%0lgy9Z8^9GQ7}$Pgh)1*d613-?I}eY!*g|M9#zo{ZZ*EsXZcz9c$j16x9u%SGmr$ zKbf+{7M#Xp501wLAfJUl{@)#lla4w&$;ri0Pu*- zEiw?Dpp#rm=*{BCx$>_7a0Dn~wHt8^*IEoVWRKeX)8-GH+k5EDf6dMR{4{Z>|MC|> ze=R)!&Cv4S=dM&)6HtQxgXCM@+|1he-{%qCTH9aY;OKuDzEnIBY4fXA_SH)q;I2b9 zOCjr^f4@P9&E>VU=qJc(tzHaINf?!6yPb)?&4xbafAF5c2P~)m1^FoC;Xk%O1BLmn zZSh*y?me^h=6lS0{2SQmemCN*UMiqFO=Pje9g!R_NlvU08i}*c+%or9Y7j&dr!;kgxo5ytgx_Sj z=<>65h$k*M3BmkQU-PdrBCF0!8s35J-vi29rnD7ALWQ$S^6j*2-a3%Hnx8YYW+ z%^K2s{)P*UsQ?K}*x>8DH^tnCkPujN_B_ZvgKBo+V~s+GxfR}@=_DD(r1?sB`2;Y- zcZ?sN?QGs$@MntP#_9NK=24`~S&|fHT@ZX~jZ~Wqe;6xt zxYH)%X9ArXLXw&F65o32H+7l9k41W2CBNO(s3L1gwS*vh6fa;Nd%$%Gp3}3;Uv;vB z-cQE%BTX&a#_hq^oGo6l=*zl1hZ`r4J=DqTVwf|%yuNgmCv%yza*mWjV7livRP^rL zLh2r&dUUi_*=e8j@iSfs$hk)Ky-Y*oZ@9oXIsnc3_#N}}Dgd97!s_i-)sr`Xj7+=u z)T3eC7#Tp8chc`E3L-r-E9sis;Z322rIS18DE6)(Fx8DQq1s0NMc+tAWY<{~D_!md z8D_Q8d1}XD>P~IXsRJw_wKc`Yyt9exX5AZ)EjPV(PX~%g-;##S##B4YHN?5&Fyz@` zd*H3*B8v>UfS#n!7z*72ZLg?{_e6ag$^r(iGpHW|&X8envdnEoe^KH#8q zTLuWfzvwo5hqq{B22;5ue`bzSz`G-60~WssCze~-I)AU85m>Itb#DabC^!;t3F{Ex zhxD}rjkA3^W%`Kw{g$Bj3_CK$Q7(l}1uSuj1PiqO{Rl&ZB7)Z}sRDNH;YdI~d95b0?%1GPo38sa$z)+*{1=WHtF|YtB{5}8ZE}{F3pW(r!MoItoGW6=IpQydk74rNlpA-rJU2|m%+U`-j?tI!gZHk$ zEbybGEV^V12*;!@BSX|$rwd`AO>{%I1c}b~-|YA(cx`ns+xd`xRa%u$n}bQqhiQK< zpd)Undtn>x9LV~h_S*#}{zC0{ggvz~2TY9->QKYMc0)BXSvTeB8^`NN%sk(+2meLQ zZOtcv_@(+LssF7Bx8+sVSQd7bMMJhvg^|iPrS<@|nNLv8JIbSl9=_4_%P4~jQY)94 z6S`A&Bc8nA(7;zR;Twj^mu#lt3~wH>gO;d?9wB;i_?0|BZeQ#dNL#FqpQwmVq?oNPi=J=cQ!Z*BH%#> z)>MuvROK%9YXlz(Ck|81a-P~$6oc&iuf{=tMM}q4MUHLVpb~>mkR?9(Deg7aMOn$K z%`@SJtO_*H=(iD?P+swfZ#Sz&whW~2|7BHbx;pQz{HkD&U!Q-gVE;P%9|?YXKIORl;db|Q+y=JT zQ5Ni)s8Qe~?G>m=TPHD$svg_kdjbP{oT^*x+_Enfp=F5BprKIr!HW+L6lRDy&D*F{ zRd^Eurk^B5wmd$%GK|b>T9*+wm<{`D9yK;#01v|#9{rhVSk3!eWBz&i%W+{GWaFkN zzX)PCmd4d)lj;U;gvjWqs^_rm>L8M_T9aq~E+mi4*^I6wtS3Ubgj1UMI{~YS8@agW zU|XW6$r5=w$`XsF7Z2Oy)VQ+eFDGz)`r7iQxrZo^tN{+mKW61s+;q>KBGJO2P~)*Fmdl#L z^ULxSxZ5d9g`;=qq`7H)Ac3v)u@o6e?1~A+RqF%rhJ`GM32a=}S?D*k`^eIwiNon6 zIm=Aa1Bt^GLTWgYQaqg2bm54q!*^uSGPo!PI3rTHnfR*8i#6)YhElk>O&X9kHc74p zMeiDj6>D0=);}7kCB_qZ3{{LPON<|R)K%(PEY7rUq|z*vXv*ocG9 zOWJ!RIE@vH)g<2?Y=A%K(P2BR8ImTztoV^+sCXvjHHCyZIrW48x>Dt3*7&Cg&HV;s zdubt{GIhCu5J1tDrz3fAK&?a?I5pLCxzKJ??sCtUia&AJX+JEc0 z@=vf588oa^hS+!LK#I=mefv1m&XXWuK$6js`2~`zrNU5FHU*q!6lf<*Xwu_Wq-U(n zDu<7i@=7Y4O6x7Xk&&)UQ>2;Dd}o%9WzE%Asd`3BSZ1lEq0@Y)mR4kCq$VnPW=+sZ z`~Gw9oZNorr}!a+YSON@bmpp(HkW4ui(Pz^`cvBAJGb;kJBUQD=x-A1QU|4RLO0p< zLJu8facyd(GjX6aqjTgtY|h|B!Xq;y%`xE{d3Ob6vSGpVc>>~za90d& zoPc`j9udSEx4kcAw#kH?X5q6OJ$ZSPU}Z<+V=)bvEfA<&Y;jpzF_i=dW=R;OK7QH$1+Rb4WkDn9Gi38{d#y;P&t znotops_vE%v?Wm6(>^a_iGeRYv#s}aCbmoE2(s9ym)X9^tG+r2+s4YeiiALSk17x6 z2FXHfSOzMf2jPiK`*I>^D&nPrm+F)LxGxd>YvUqAR`%8u;zWwvuw)-LCl4L^9mWt; zfT`b~FAvv{&v?Ws!1LVauNOY0!FIibfvW`(LJFqzWWDLguP`pj;=HN|aIe(o0tM9h z=TQu`g%mjD?UPcT%6d55*sZ69b%BCBh7nEN&1~QosOZkhl!jI^R&+EfLdbqK)hdhx zHmXn|=b^1du?8_G5}2%_{?dRejFo#kY}cqOI=l1fNPRS7ms=xg6V`fAm%CI8gyG3| zIVuX+3!p}$fs-vYLW;hD%AN_HjF1wYbgb-y;kg4Mc-P6mJbD^qtIi<3&VI|JxjcER zP6R5YVv|^%%n%mKMh!xKaBs$;Eus9$ckm%bF*xh2l+9^AL=-sNp@AZDcd8ClZRM7#nx#Rf8Rx6Slv67cQp=py#)@4O-U9qdp>mAtB$4q_qCBJ@>DhyVgO zWPSgFY#j5;lFqCP)pYseQJv$Y!Ox|476bPLi9Qpl0%55#DIyu_?w2>kG!a3g2cVbL zh`~TQ!mkvt8FR`ktv%1jmV72XdGO%Y@~^UvxX}05=D?~IF0x!rjvEqrBXeHMx%9bJ z3|*$F&X{S`C;dE^WzLK*$(}wI<++>P;_&L?d44O_EG{KwG+<7taLI8fHYIe-1Au3; z$@n#qZZ3AWA7YHokOB8cz0{?pQJUX}L-Wv{?JOa$_+sW=FJThf%9hA}kFd;2-Y?-G z=brmVZqfMSm5<<_tQ7(ENuGpjepUtgfO!(!QXdeE$~3uxs843cAs=|}DX|eXKs3OA zlWku*>=?ckK|4t+30Dn?js%DXh|pj3Yuw5y)}J z+10GlYK&7t3~k!P2J8@8K$DlI*hYw(xm37o*+&KD$kURM(r-*lI4m?HwISlFy(YPW zCdJ~CC*qp98fJf9Ob$&RlXz>NSYap#Y#DI%`CJWikC%#$w-WNFtDv^FH3OZxfM&XYmx05Pr3Yx=l5H069bJeb5 z+Zw;{^#ybCI6n-j!})tlO)5$jiIZV=LHa}t_Q%%&<@cufciyD=JfNSE!_`CmH>KE2 zi^F74>Dzm;k!io(48?TrYyjm=G|}HhQQvw3as$Z>1VR5ogoD`(eMs$X3hbnRZDR;e zO7o$Pze&!{)(SugNDibL#JV}ohr#tgFy_UJT7djgbX(x)Uk-t{sX8ZOi4Gg=;&>rYmC>f@V>C&F-e#23I_hV%cCY}nVd-X zI}+CAF-zBE@trBe{bil5$?Ch72-2~^QfuBZlnB$Y#d6H*+rNMaC^k2k0hCJyFtkkK zrEOh}fp*WaIGT7hQ{pv^u{avz-ZViWXdT(hF+O+*RnpxdmSB1C{8VV36qlp)lAC2t z@#I`E&WXtjq`NaH`2g}~3wdiFnUrMnXA5t9bv`AhISi)WHM`)R(fjEq~ zr8xFDN|LEK*SP4osW|(%W0Fo{MxjR$1OF~aPq15#1N~8`IACmMYl6219KoRLedv*? zW!=_PWOSxgxHBHV5nVy?aCg(BmdHeO@qJi*mIgMhRq_oszeQCsy98@B`|^V7Fog|A zi*jUr;4+@KRbhQ92hN*yr1Q@f9LEK>eg1W0AF>qPkGl0x5b49J?E1#;*EbwjlA#L*7EtY)+6mP#kK+)K!0 zCk-RO(A)n$+T)oTswd!Z-EYyu_fF(-T^=%c5@}D;Z6AOGf++H}=!R<$SM;a|L6Zc1 zBMCwV4MG-yMrI6S9f3oS*dY&Z$n9ygoSsZy+thozY^MG8dR>47bj3w&pEqgyadEF# z4`AVQ)Un{U&3tj%YMRO-V93PawaXQ7(CGgjT##P1K2qscp*NnM9FeY>ze>H)L=&8_ z6hDnwSwe){h5BGMyOS>WU?Vk@>K5Y19vpXlhYl4wKb|Tr^|;uBayUVrv07?bl3W`H z-5`lDZAd*=@SE2GNQOpJCsPoOHmv%VT$`e$Dl0X_<&-$sp)M7V z?3yfRAW>RkmGK;wIM0USgu^4w&3z^#H&#S8O`}zq{fOaU0&JdGG3%D!8)7kC{OHU0 z^UDuX{pUFmFuo1W-PS4$y(*wvQ`GikINmhd+W+;N{TvF&ub=2vsL-%Y&`mH^C|Z9Z5srxps5dMB9ZuLgjpdpY>oUs4^pY6~GED%I(<9LczV?~M*-sEwsoT;f-KnN)d( zKn7hsU`xB+{*Ua5Xa-(A2j{iJADI)E4Bq-zPVE!sgNHvSj8mCY3mGWUAC}Hc#j+O{ zUWs~f&d!A!^l-5|%6q0Z2C!M`<@dfnLn9xM`Na%ZfXmIPPS5>7wcB0iB?!&i6=mL?Uz8rB z-28b4eyzoo*FR)yPwX9qCOq&xqM}y(XGRx!?~BZF@!4>3a=|u7p`oTEBubTN{Y@^x zVQa{r392Y(m+eUDTp*4o&4N<*7UTIkIg}ql~B6g8p z-#0WkWDTd6r!?j>SG`ta&Uti+Hhf=Ufi2l~=KP~AnbifHjhDua56O0ccIw^1^y6+K zj^=pAyydkfc%4zISSY`)k6UK)vuhmlQT`aQZxuh?@Ow>fk01-=xgUw*_epB?QgQ_= zo@xmU$UfsU?!#q`q_zdrUUT&HjXYx-?(@D!{b6VHn+wH}NM-;@8Y>aNpxL$UmD0hLlNdkgs9QkN*w8YC8!3|C(oGUg0Rg{_*?^ zoBX$<)|mqlC$;t(3=%k{sjZ6sHFm$MyJu^fgWq&SL34Gu6orAEif&l=ChI6}cL+Nh>0I|xM0s2;jZD>lE-`rXvD zN_}aPLNT(?;(&|ef9Bhfzp)9rA{vObC~HGkj+z!8y9V}@}g->h77r^6B zvyrt74^q7NeG9luEZQdnGDcB2MF&zvW6AF5t2S&?g;I9cGTljCw=3Xmbeb3CT16G7 zQkykD`i*|zV#JKinEy0)elf^G8TBk8>qsBZ+-^_b^{QsqjwgH3nzNRlp>RmMP)~=I zQcYG~IcKwZilyaxJ)^%lt1GBZXds}+kDXPV2MjuYI2Kq9O6%3|m}Gsbsg4*FWFMrC zKeAPoLskfCWtxw8Tdb){KeaxZMZmITNtv9IpQcSAfe9|uf^JWg%|CVlmEI|{+X6dfjA;Z0^f?4=9dLmB5Evm#nMuwqY zRwROPHVPDFLEMMtC5W}Po?ka;V009SXWzr$)T-T*v`>?d->$M38dl|!+0A0A7Paw_ z$>RnPF+0Q|hqUp&qC?{+IEfg2HpB#`=o!QomS7HG$2;i^Q%ys&r7)ZJlu^wmX6R>q zXN*9d#spmYh}ecaNQ*W%rcfX=Ec|@C&4Yy3%>v1d!dtJmv(ammSiC73E{(;}Of0M@zWZ&ev98L){(jYGei*t~%^;R7 z?LBG|e(e5ICh(l^XP8x7dh|IuA!;h+ku(joiHU#dv~Vrct5>xsG{?GHf*1!q>Mw38 z{{}43qd1Ks>&yS`dw{zl2t;8=|8`w24m!|+n@h1yySq8$o$}k??ry9fFEXaX`Dqg6 zgk6@TT$F*USVmu*p~Iskx;8SbqIyBrXrhyuA4#3a`GKS?#n_S8E)wSdOp_b*&jm4#sP# z7X|FzXOv{u)3fsz&ACv-myhs*>ZUxRV^>!Wd%ySk84jDrorHpJU@2;~n~)^M;vAyk zV6w2i(fypc2@Ya3_X)NIv@;T)4U>B{4MS$@kR&d_usdX8ChOSK03R)TaB||#je);x z$P#o)%xBq38=n|1RfK!QQd&s)aDjvSKpP#3nsZHUlc zHDQX3e}DT#9cA7g9b0dyH1!l4Wdke2{O+uLFp(=ybVX@5zPrSc&S{UvS2vc$HcgqR zlWB2BHpd$+(cymYJJYrc125KQlMMK)-Lyqk4$CKL8pPzUp=QErY)=9dF>}Ti)>->W zRc%*XAMLXha%_E^R*6D03=+Br4IR3N{fr;cUF$^k_-j6Y^^PXgB)5_vq8pfuAMtVj zT>;SATB6kDLpa=yKdgng?}KPc7wVkD^jnL3lmY?Gp$NGUXG06)1>%7-3*o}2dEmkc zKXDTw$CP1|?4~4dK?}a20=uXYKCCym0keu8bE~rqVnND_n3EbFKf%8fIy+m`EUx!p zdk$Z{z-+ChkF)bE8=YgmADl`~!LVyqMP`DjRg{N|g-7p<~ zh$zp&d{n$UC8Y#)^TY~t9ru%Z9X-|&E~fMd!4UV9 z=Xp+6Tj!FUsscpU3^J)k_fUO`c5hkO?&CuOA#gLU%KdFmBT9F1Ux=>RnjmNc)%(u! z(C=r2>8zZ5Qwi>2+}(jSQy7y6v$bCKH9HWsQy5(*&FulHT^yR%4J${m1~=<^eU%EC ztPi*bl$kWwA%&mvU5Dlms(anh?l=CDzG90j3jP|i+hs^A(r0)ahELzkFkIZ!C6fK z3ppqY?3~wGq9G^u;`KNo>hx2OqV7)jf6@>5bv{3UM?_!ObaUd=1R}hb}QC~#(qtWMa0bn@T z@GE9jJAI6JF;BC0u$s?&=qc9WN^BwvSi)8ue1>V}wcS@?PX!v9<4-hj@T|#-JJy~W z8z>gQDF=Jrf(i<90&RF}Y!0RX{DEuC?cI`rO^d8>5>x8J>FgGz*$JMW-m;JZ$QYw2 zk_}$f!(9qdL5y9L2D2VIPD|&-UQMpyyp6tsP7-P4_$SL#e&Ze6)63RC^By`)1zfJ+ z1$gTbm(1=#S)S>=tdKj%TPmglLA}~N=^sEKWr4ED7~ehh>5tB42K2gO5q-$axOfIJ zEi01XNJu%og2_HXc-H5a@h<`&QN9=OEcWt(qj+UpeS4#xem51?6=4B>A$MDWKvim# z2X(%~W(T*&82cdQp~l2*i{5H$SNK{w>5pu?8duoj{NfrOq)Zxl|H@Tuf|=wa2+0bt z%M#^W6k{VAuVpwH*#)DvFPn!Foh=qCakqqkNv{_F`Yk``v;_Kl7`)~k6ixJCC)yZW zt08TXKIov*`=0`mJ~xOHRnJtUJkm37`XXQT9s-wQMn0Rc%h|`@LZZpLaRD~oM|(0W zjgnWi=emR2pY-k>?iHlJ@2k|W?l7Bya?4p6_FOl<={0NesiF3{5ow=%<!qAi$n5UrZJ&j;;gffD!9CJ_P_L7*ol3ZFGIr$Lm|h$&%=U^l zjkHK?nLywR--_zi4?k)m5VJhx!^_`hoVind!_jeA3G_T8&b!B0trR;JCB7uMbpu=q zK)q6Ci8w#CUOy4}Xj{jB9e&NB>stf9pfTrA|GB#R-!_&1dZgtXE&oUI!2eMDcB^g1 z%nM=jtNQ8GHH3{`Rg|5ai3pDyE{+bvNy~ANc;%DCcY-#qHg8ZsX!xRU_eE}si4=q* z?TF(1vZj^jhuDPkW)?L3UCpgj%c zJ86G~t12)r=`$Xxx_OvbE&$N0anE-C3M89k7Jct+nmT2LG`Mj1vfisYG;>1Wqnb=^ zy8T*|6%iJZP@#K96@6XhVh2prjl5R&G3R5G4yiB-Z*)|V2GfV6kvCzV<)>0=)s&6y z(AY2BrU+pM>o*wz+e=78?M>3tFk7wTs~AmFccry{J>|^E*$!@!xjBh?I3?~nWAB4y zcy%tChPh>-SgxLBZ~(b^ah#r_nd_($PI*KJ&Twj|kA#_cd@U8Qar2kf;ipWfn?A^z zxzA!ZwqBla4*VU_2ZX6kf%X&~GoQOUhWGD9vFvk;;tR+?`NVuz6qb+!TgxNF7dX`{ zfXz!S%~_-{e^Yp=DNZ6xDJ?P7<0$cxga`j(IR(0xKdG9YS`piL7|Wd(4f@%BlCUBw z_AOhZ6=tzOB|Wk2A-7sJi=@uPOgw*STafPJ5j4n!ss##6QkeGlX%+`nwY!_PK+v7& zAci{$5$#)`gb1(59QqaHIL`wqZHaHNS4&cacVC5M^(zbrI|kBKHAtyuUv%>h{^Rn` zMnjF>*yW#SZLv@wZ9*H!hI_njTMZC3xt@%ZyVUKzywa|A$JQ-EY(S zOD7idpE|MBfAGKmQ<$iPYBaql*y+Lu&0A1 zL0N$OXj_XqU7T`A%PxAZMaK~CBie~YosrX|UuH}ua66jhzRP;bO8+C+;{#R~vB6*w z*BJN26bUMNL!1WbhdwC!Ye8@)--OC8LaR&?zTKw!xHrVK@4*R@aNvUpi1Tuq*;-q8 zFiUisHX(H5FSrvC^O{gPj)XS$L3yJ#N=A5-_Om@a3R|XHu)ISi!lP{$)kgs?-BPO} z=YGYDV_JFMw|Mxp z<5ii2bfhP5eu80@17#6{gk6&uFpP2{^4geotS$C#Dm8gTPKkn>3oZY`XOg#~lME{skZ3-l1NNn~&kERVN*UT6{>5Q<&S>WVg(*1-!-*nXLvtz)H zaz~Fd#@8E(zPJXHsqmfFT&Aw=JMv9IBQZL2xDo^@+NMGmOh%m4M`)}nb?UW? zAr2?cHliMScXpbdB(dxk?VkgTpD%*=x362K{6FDXsl>MbealdPfRO=hHPu#d{1E>i zw%##1vM%h_?%1|%+qP}nHY>Jm+v%`l+qR7kJMQGm^PKNJug(~|e$>y}YmHrN-}9Pt zPEBQE#bG11kPuo+;@QW=t_GzOTZHVGinrqoW(5m*oNpEL8Z+hlpfgjW?gwxZbomuzE|J(DvJ^P^ll-KL~ z_}k|P``%x|`-J*|;(nO?Ab^DYxy55d<>)&JgpWK{cPsGjiYBkQgGK^D-4$eCd_Yt| z7_cRD>mxZh$@pTipZS4p$!-Krnmx|EWj%Z zYO`pw%&;?<4FNG;d5KMtA~GpVDfUEzaDNcLN}JucH-8<|e+~U-%Cd(VHz({S6Uzdw z%!acA4O4n7U=ee(typ+)Ko|f&xxmE)^@pc$4lZIBa&~r? zU3tz27{&Nn>Q<|@I6P={`Q0W*YMmkdpi2fg3*m*MxK)e-ARaYV>ou|jsw}QhU4*l7 zbYqf}-}ASiPt>uwN?c^Agv~3qso^s=ZH5NFD^V^^` zLf1fP$gnVep{{xc^Njft0ubmFdja`7H(k+;N+U!kAb<|*hG7;odsq_)i3cDn7mqp& zwPvEBgu+UvW2yknuCbqJG2sI|F@Q{3JSmew0(&}9lP3fQ!G<%qN!GVnxj#u4s+}fc z8FTqIX02|QF;UBQLUp&bU{16!?k!^EY$lykN`4Zj@~*~4?z2w|+MwEB_1GU5#ew+~Sk z4!CrnkI+lSYZf`u=Jsd5hVEL3i~zXA&DCO9^=YXHodudF3@(mT1Q>?#>F&iO>qeVr zkq1e7di*3>w}!>)kgG_cKQW~`P#s&xFf#8v2cX8lms&=cU;Eh9P1{cgp4hJL%m{$h z=67kYJhEr+R?cisqU?v0CTQ^t2ldN(fgK|#$r^{?Tsz^8q&p&DU7mQ47y^x}rJ%wd zVdha(0oyfxw%a4){wj>(clVJ{q;hS&5mIaAe`}`hGiLvTR1IogP0$G**f)SqV>Ky z*~(VkycbvW7rV#6Hjhr8heYkQxQjn)(C&GwIfk{Gu;utNS(B*k8C@*UK)9>3DO6>d z+GICjgwi{e?(k{kW@w8K&;^cpZ5u!>0Jt2UD0dHe(3G0=^m(?Gwhto{r_onpFDGgs zJ5`s8bw3ls(_bFP`-!`z%1>nbFmA;TtiX;#Q7J2o2vyYvc^KW6i1mu2TrJA zylsfooq1)=*891)SRDIOrIH;^#@l~*7H@lLl$xJhJ}lpwB8ybfSv4$ z!^A#}`|Y7q)R;rB`Hk8=^sI}e1aFjgu})2DZ3DK@w3$mzRldlklHD1~k1x8y}$$b^9|JMtUY+7aJd z>XZQ({%CL>PNHIqcuQORKY{RHdrv(D^G=hW0)AWJ&++Adel%VrLV4VD-Ro=pV}P+e~8AENeA zL0qfQ&iyMyJ=5yRk6^q24ttNFPiFF^<+ZZU8sS}J1KUGKMbKQoYRsV{XB5NUEXojey`ysI)VcHpdMi@+Dq*!zhth=7%>`IOr4lR~>V3{Gw=c z`$!!MIp%48*_EbIegOpOeREQ+Yl#(tbP!s!la%TM5Cn$eNhehRNlIx%U36Yk#bmuF zxleG;9#WsE=Wc)EO8>o7>PfiL(mt5Tz}kpBZ;XJb$nu{Hk`>TKt@%YM5d;!b_sSuo z4Dxl&cTa_Z;tbp~?TDI4-10u;kR_yUs*A{8>FOTLMAMEuBR!C3%YLcJjP6&P|9B^D zDNKm3NrP7Z3uqw%NT!O~p&E>vN4`vSDN#pEz4Vl*BTJE40UO*?qYwz_`H<1bLqrTv z(UPi!K0YE3VO5J9tr|a)VO3i=f?7BwIWYz(#qkC|c&0JE<1+D%dh#f+(<7!~kfr;9 zo|H@$JL_%WOZ-gwe&~n z`TM6>NInZ@Y%OV)TuCNY;|7j-hAp5y@rq{+Ra+?a#tYi&`Y%Li++CkZCkV*E<21jO z=0-gvTBe%MHMe=_)KPNj^V!z-shQ2p375U9MHk$Q&U4?PTz=^u6T|s}v28h{6xx*@ z5*S7L0M^}($i3Ix%d1tzmMQn0`&jH-N*ds;4w%2?pfi){GV^4{X_p5A9M>2N)FI?cfnak z`>Zp2m7XAXmz6v~jTl#H1(CrAZOB2?X~ii|!XsW!P`uEuue*xX=rr~~%W3A--ib$t zrnB=BfS$Tdma>qAT>PAX9VF-@7(|`Xqe}Wn%4JlUzS>#!%D>5LdV2zBe8KEN@<$g! z5yhFq88tJWg{jOv3_O(bXaE`>9|ki1;C}zF8OUb3%L|BA3!O`?qNaICb->d3mD#yhhfH*tTa^Z9Z9Dxv6vTHj=MHU4mCj4;@V-e7v~z?Ob`SAnE+HS4*W?`o~Ha& z*ZjAJg~l$-v&#nUSZyYN8EF`OYpPLgklof|tqGqztTpm;>1FQd%+uTOZ0cz2+eo$h z_DJ>YZutUcZ?wir_ZP}2)wDO=`Rbeyt=zaBj)#kzZ7WU>HhVT2M);X(>@DK@b>In$ zo%^-0$Yjd2WPgn-tQK&mqE~6=dbELmb-Y$?Bya$$V~u)>s}pzpkVk4%cxRg=TB6QP zX45%8=p;CZ*Pd+T6I&tc2=@b4iNc_zUZ5w4O$IgQ2>A~?13HH2IXxVNQ-rZzwDO3D z99lWu9dtd}l~s3_%y0buZCnYqtze(;I`NQGyf(rQYVGjg(t3bmlM^WmJJ(u1Ue;7x z2~?wxvW*KFr#BY2O-K(dDxQX>cPq130qJ)1wX4EAD=vs$<5{t_#hM#*39jP%lf!hp)MM!oc=`OqJ!F~%Fhw6?4=E4K+F)^6QS5+e< z{q|fAQFPDw8WZ3HnSx84HD{on(m;k~uuo5`IfMvJHF;dkIemq(3VGGvoRiDzcCT=- zWoXC|8^JMWK0#@Jt0gSG?6Crx3#f$M5Elg(!P*nj0?WOA&?n3>fg!B;&JBX~*4*}j z7fn+5X7Gh=lmy#9SSrkp4U1|NQT=*>^%O)h$Fia_?LCv3!YzSfgt zb4DC4R`~0426d2Dc%nEV3yqBzI!L;D>=?bR_m|k}B640^8H!A&i*d`za)S$UUXpxV z&}J619Tz~GT2_jKri^yO3gMQSND`=)CVTobMhfFt^TNW_M;W{HO}AB0F9WBU*BQ=W z>25WYJB(avy3poNPyr6KYCZbJSS}mr{^O-3W%bW_e`@u~;#7={vC5CIo!3<7 zerrN~dQkf_JM}sF&U%P7+E%ZI^|EYv=>2Kpm#(E7n|F!JYcuhLxN+_(-}m!%tbGO> zD)R#b1{9Zz8c|b7HjcpzdZ_MhC{`HwX&59>%bM{hK=W8gIVemxnad0h-SaeJn>-mS z?W`GTnVIa=9hXZPX<;pDlnUcCR*Hg!sv&m>ltnetKXdXMwbwFHEe9|&aaYc9%v0bF z!vD#SFyG&^D#VL7=Z=-Vb_GB^fyrgfK7WFLLMBLh`v4l+-TQZXFDkqhM=$l7VDdP*dUsdZb6V6>1ky zphh>7NCxwA-IaBEGJY?QD!w}+knbHm+#@|F%`4D? z83#Zq98j?)r{tn>N12mRSU*90Fhu~~Pd%|`6RwSXgDe_zOZX)^5r{rO+#PLS6OmC) zA{=cGJoDH&{r)h=^%Km4^*jbV(S-BN|2#@q#Go1nC>`gs_Aad`y!wYeQkmkGFo}}f z{N`#1IDZB2J3yn*hn3GBn-|zu17i)Ug=XbL>QV>0GFm9}-|QK=T4zwQy!q6`M#@@) zar}h)6hjMZ{PEmoOcUCK1%RUU#B%^WG`QoyZd$X~Gn- z8A&Yc;DsbF^lvD@7|-8CS2&TfLSM5P%p{4_Y+Pqm(x5(-I!5VtUsS8zpwLoUTO7co zrV-`ET{n|ZtigC7a`&kqa|sBN_z^;U&TvE>RH{IYMvej8A6|8(sUp+j7`CvgY64GI z|DK0O6as03uz@ik0!a~UFG`X@J-i7pAyMY+)zulX>h;dEW(S7OTy~Mycq!P*H2j3- zpkm+kJl;pMH59-2grs7<{p|?F=>q^)2J>^&n$1iv*?fiW;GdJr<_>SW(bT3G%8K9UPV{_mPZ6T^}L z`sKe@B{l7Sls?l8W3!OZvGeN@509W z2rB*pkh=D2%OMjnJuD}0He@@4TSdB-RI5oK3QA7mBag#^+2T4OloZ@^=H5|aqYp2} z;xJ-zOYX0_HPQwU{Lv{H>zb+8(?=NPS_whc(ypg8!p+3Pv15(_SA9LZO;6x5X^`Fr5HOGe|9lDu{e>H4z6KTAN(Re-1Zy#!(ZZ3(_t;J@gM-^asr zz%L-I|E)FtUt!`uO;ifvzIZ$G(wIccRgXkl#hMmx>AFh-RtM0Zl~gOZcd@;k^scR>=je?i$++cuDQ_G^Sjj6`zxon?ZYgbQb}`X8R`s2NT}DTNf9d zt01f@f~xBKj8T*1mZ9Mq?8usuQQ63%X&SF_h01C!JtSvIqf4fu$xm+;>?TStC7MgG z!p|@sBZT3oUW-DH8oND*SCwJWhwn3qtXvDb9y&M+W3>tb7za*YQ{(p+15b>dtu;1P zVg;JQ2{C)2#uusxVVs&nfNAh~uQ9uL>+czQbe#+}T*%8$p#c9~J{+Y9`p#hSnxMHA zPEl?Q&o-(LxT@pI(muvGXkxM+vPW|wtq^E7p4UWLlR~-UZalgWXVze5sk6@HO_e8D#<- zJ5!{_{4)d{v!Yx34y=qoooV24|1Ppoian;1b06yj5GND3%w>s2~xnY)udgh(qCCl#TtQcB4Z+^9@A%UFOM!fG*D_wT(Pij)0WtmpWJzI4y z5bcgQfZ5nRZ_yZ$sP>?G+C&>$X|{8bs-%pMxD1YIWNA%|`IL3*%x(|U75zn=V9EtQ zv5WS20bON%S!@6X^4*bbHDN+!Dcl6ktl_mW92Q{mqFztVaI(4DEKS}P;i zkSeBNZN8E)^E<_iE;TAR+u{KrSob{mS1Zkzk-g`2*Jzrt%uU0YZA6ZGy`hjR&K1>{ zq@ld(oa#k>?+&7KftZ%3IQ~LWqTDiL#<^o~PA8_`Vn-5#+@XX9A$A(kw|TK%-T=IC zfYn~1Mu^ngUP$VyGn6h8uWimd_sXpuAl!Q$@}n_qK2TiQQkBjTA{MP={K>0HPx<5+|v3+>I)3C&#sUue`6H9 zH-7o)INOzZSiEXf%)QrQ@>Ym`gOv1i9EwJkQ@tcEBrQaZ3{q7?SJmCgY>AP-!9 zUPQY3>>VW$?zgim1Px~!l11dmu@9|=mGAWA4m6*u>^qBA0mF=h#R0iCKo|#Zf;#WK z@YI5G-vAL_uT$YFfnr5Jtd`;zO1+OWZ>sl_8*V8LZT?7)e6K*Jz$E)B6!19MbCt^PQP(Ey5KIG71i%GZ1gjbxBN6uT~#w&U2 z<40U1w{CB}g1nFrbZth3q>C-zG*ed~$6r>J(dLCq--5BJu(2)kL>5wJF=CeGC|zh& ztu@474O*sgqBDtO!Y#ziibwZhlIBfgV938DiPNi5BKPR(jcFGyuZchp6qaS|+#r6v zveAZF-F=3&UOr#{U?TS1tbXJ1T&@2zYU+b$dl6uG7)k z+1(#8CQ=gN0cuay>VMZK=|+8w0BR*Pemn`;D`l{zTn)Zj2$1_S)n{r^&Jx^EkfL&y z5m1&M4<70mpyJVXNwUl`TcSZ)MWLmyX7H|AjB0y#TNB6-@R?`IZuc}alQg(ownaF6 zz;EjNEx3>t`ETD3KS&bBmHs7o_-$wQZD$;EaPwSu$^q&j%w+;1EefK@dO-l zgUiA0gStIpBzWMkS(}c!V>^4v7!q$M<+@yX`~4(Sg#M_~$+WHQ1C9DhiCn})kC0Q_ zwq~T8OXttf8mqbcF_Xm^{;dG_N_q86Or z_hUf)0`9iR;mdYxzg&4SsEt zdmd@*ug3NW>I70x=w1VF=cqIKKZ&Eh6)VJ(epc(xoDbdxhkxl}ZHz)e(N&Qt;zP&p zt|WBVhL8UagzMZNmc)jX!}dTJeTFPR!=4)ut&qrxN?*>C10EMTR!X|{C384XMBjD6k-}N5Qq!e@q@iIy`oV=ADjP7031#AF6Pd3?cov@u z{mxWAB{r!Ifov(v@~`C0b-hG^n4C?0AZd zlr=?U)hRlZnA}=0+h|}_<;8%SwQQHH+G8pcvh9Q*8{t*GYMOcsuU~b0;5!zOTGg

k1|Xo5FwHG%_hpaO5Z8a91*l{6dP@VRp2eCh7snv^QeyAH5B4^8 zmtr1G0a*zcMoKQshmG1a7n=Ge7IKxI%1%4k%^;>^?o+3i%Z8t}=i&n7lv!=0U{|AM z|HNpf^B-}~8ZNW31ch~|7y+FW?T4y3B2*;u^z=?#@Psr!j}4iv~{hHw~J4ilH#r~4`+_n5YOO##U1 z=a?{yE)zW$*}_W_+C>A5wvs8%3PHA$->px0hQ@XAcT4XKmtO$*vCDdIHf-LRrXAt) z@BGtUf*GWHLdH0>{jG##`bBOqxski`-Jy946&!ca80l?yGw5$L#zn;XbrBkX2lls! zoxhf49@uc-u>eqZn&KS%!(6`dDR~i{L?a3Pq*_#D*ck((k7lST5d6bT!YGAF$RI&G z^=6*y+4^J-&iDXPjq#~)MCE9RNy?v#{A=w9360BUT25X zFP<<5_AE;)u6cG5ji2=kD119~^b|y6kj>&De=~X9D@2>f9G4O#;XU82HIyHot3Fqmnkwu1>GLI9L=b@SQaah{sMVxupAmii!KgVh%0UU zb);D=4@=c`8IBB$+2u&uk5IwLLL;ke^*S8wG~qyDs+0zom(;HS7l1Q7#6x$Y>7;s= z$m3w{^KYM1)qo0c}nsZaG*Pj zNrw+8HHloX8f1~Qkfa!!YT!1N4fToaOl)aw=309qlkGN}xJhx?WHHmGHu>TnA$l(?RoJ$Ato9OBg+?QMmf%`ej^pz~;D_EwvH4 zDAJgvPOU*~*sWc^z#dL|BA0m!D%zPtbfUBwY@U=5yEMfdjV=ONenq~%RTJU-+Py=r z3McuZ$09cE)$mtHn$Q*{qIC|V>r77E;e8Jtwf%rR_Rl^&7mK`cp55qeXl=FT!fsFl zg}VfSVg;;^IsnbUWQRF-8l$fG1pZdd9y*#&qe6lCa+TnmYiYb0qrI+MYg=D=0KF^C zTK$0^vvBi0owCpNIg7d8uQrY0cc!H-M-!hNzkMQmU*XKK%%iH+{Xe)$pL~%rD1b_r2#cORRn~??{x6uT2Om!zr z0@AINRHsaIR<*%lUk==%@U!B7ftR24dnLVCjt4u0 zBfM>wGxJC`u5}_&If_OHn6ac>Q6R~cJLx}bq>{7q${0r- zivh#09^IG9aeV5iUw-i{Is;x|RO~ozu%m_T#1C9)4i}lyiMikHguMES2`Y^N7|~kS znGW@Kmo9Ol*F$nzp>3k@y>{J?@?&-}$D_ANzR|OHM$suX?%L<93W_*kH9_f6AH+BK zdp8$3^W>=o>x!UM#tYQWpHsdvrH_0qqI{VVc z#{&CoXMMxBEvV#H%g&r=^){HLrU_d4b>=giUgH&g;goYK>I8xAlDhzg~lOg^#*)=_DQ)08li@ z2PQ|e;^XKQs=TRkE*y+5t*J%*b2p`&BNgWkoGPGjC%f>NXR+gO%wqB8JjTw~iJI_M zWP#>raIo_# zP)hw{TN8f{|FC?J9ZBg@wL5J8egNA<4eyAHkYJ93zG!S;VC}5PxY1vzE@$}tBjCEL zXlsq*+qyK|x_yc0qfs4~b|cCvyF=Ttwnd4VCtP>BB9Ve+f+vO|l|9h6;|d8x!7jGB zJ)THK)yrgwqWu6=cgeW?L-rYPjKrF~%&ZD`(VwSEIChCJ62~>pHzNa8dOza$DS=+s ztZ01JN~g7S2_iRL3VgoMZGaapLcXAE9JFS$Lj9g5$N^Nq9jZ<(%bEGm)u_W<^g}z^ zmnp;}18!gMJcTKXTD*ucUv{P58OF6_1bwS=n~~xfCbAXjFfDxaA;32J_aM?8B2NBj zVf5matG<|Y*Z7UjlA!oC=Ar88cJELeg0 zp5zv&uXRd@?DCqm-{C8(a*1l^dnB~0{{}S6`>@{;&(Is*@zK7S?IY@2O0xBRnV`Ky zYsh{^^?H>CDKN+^?t-ZOpA*Dlk(}u1H}&87zeW&1e_;Nv;t_ZSkD0zl016MN)q?WH zRm1w~wav0(Pj14XqdQ01n6^JJv+@=crjk=m>aYq7SyJUC&z9mgZECujDFa179Rfj8 zRhZ#ePoS*t>hu{krq~x%=F6>Br*t z5&KR6sz@T;H5Mo#R2StnhC&J8lDJ$ALZaJ1+1m7q!*2z>zlf}XiWkbQ)Am6!_d$LFgWWs|vqc0Wh&2S4;4 zfDW5($FGUU^j_M)X@X_Rs#wcpCD!xS733bJ4PUsIRHvJyQd0tq2uIn~t(ek^ zGv0yL)2TK>MuTRskAMtW( zGt%<*O-FB?;;esDRlNsP8Dsf%WHx7@D>mX&%qbygs!y?#QV}rwyn3lPIyk6A(X&BT zRSbv+5&!k^~?=n*5t}o=E&X~L&&Q&sE7ghut$PanOP<1x+O+b zd(ovXd^*?rr|lubi_=U@)1wyWNE1wu^BIEKu|x)=w>_hS5M>;QK*~Krrz{a(x7s%8 z5+a)|800k^!Ed-+bbqsDjL$^SH;k?B?U*H78Q{z)&(#?d>`33Gjc=o(DE&30&Q@0z zv@ph*_~+Q!G!<8l;U3J;A`D9+#a{gkVCI2w^exJ zVqaBtC8kYqaLt!*B>7`-p6#w<#^bQ0<{CVeZ83sF0`+rkqY{suNfQ?Bv_QkK2dQO) zi_tXFW=4Xb2wE16DTk(kxK?y6CM@}m(+b137?(F1`o}Op)yCxS4j)`C@NuD)md$zq z6dHO`ikuN0vQ-m`mSMQVv(gj(un(-C;;bSta7BLuzr9g%N_e5sq; zuOmoXd5ByAKLKm{$N~ zTf-ecgCnWU;V*_JD7o>W(U|a^UEcDTG0AMT^cE#^4WRccMEgUWPZ(ewUoDA-O+?r` zvEOpP5jm-BRPrkGvr8Z(3O6Rq!(N%&STr84=+Qh5@jHfI;-nG=)YMXFw2I?-?Cg&H z!@4v8!-QcA3Cplv8@5CgFWEZTNNCUd{vFX3@my@e+oqWgz!*4x5%Cr8)Y^!%tEw_S z*z9$Dyq?_bnbIGwjDBMtUuAFMOst!1l_-H^?^-{Kve96b``A2q3c1wCCli@EapooJB*CVeGLe%dJS29 z2D4l>g1uR6>rKr!gc>~qx41X8WGrw2%*%@+R#w+b)g*<%TIAUzye?-G5>l^$VVLJC zF|65=AL$z>6ErS4>DU>21;^zVn~~LZqg&2afSPEOg1&Acl3?rKuZO)nb2m4?s$L-U zsrs`&`YDR}hrNV7#o}%$i8at3MDzMCSo4vtIef)PyA^K}t<6_As2zRP#g#>o%#I&xQc~Gj)DyE^e!P0nw9ePW2ndMm>9EfBx1Il* z`t!m07u~2aC*8y>>J#+uimazT;L_Va$v?I3wEV0MpJL1ljeVkVq~#Nj$_4-a?8YO~ z8HAS=MEhe9@l%NsZ*YttgoBUnZWd<<_zN-();N@}=4UvxkLD>x@a?+`L}Nd>>Mos_ zU;L*%A;=F6VvN;!XEj;M#8icFbe)vlwNZI^2-&Ojb_@Xrc zLs#IR=Y3IxCn??dA-W{o=cG4N2w0h`)TcUBcdWeO_|gfp7pQ6HTa{l1DUwdJNP)v{ z+y_yTs#4%ePe|hDj|lBU0Myc-8356NIKGr;RWZ^msFP&mMwctj&oRr1f0B_0XX-HGB%3|mCC&j zwrTWIRt2ATP58b@ZUH&tyiDOKVu@4dt_0>_yH8=jD`ZwFmO4N-$Tx24_5;YK2ZW(e#J+1PqpRv*|pW=QvXL zBGUCAh$E#c3OvAZZ$>a&z0(q}Fx3$tB}Q}*Q5#{9Ckmcg z-2rAD2F6koqn*G4M8tE|s2MavQCZ?nAfzt5!2}Y5z6TRLsH8xIcq0peX12(8z!P^dpMKZ?S3p1p^QwD@5_$~2EezQ8eo(a##Gff-Q)SfR zK7EWGsDu1>$qP&amiTSzJ7Z4pk4+QM;wKO%eo3j>Ly?q9UjN{Q=urtu3Qyk@VCn?; z3Odxkh&W6Js>PzV!oMo|xf`*B8o}I*X|jgdbBF-)qT!rSSrwr~7mjtD>uA1EA83GL zCw}ic4`zrj3f2~@86ux^WWzePt9`3M3xl^e9r0({F%d3dqS6zS$gxqUf#_vX85n&M zJ9w_@6437nHwp4#{!6+ZHQ4*-t|y!WB634k3RNGG@RS6^hNZ6b*nK`FVkjzz%ooHr zn1KyBwWh&(`kfIYL-0Q|yZ@C?|F2~CZIg9zur>SUQoeDF|A10*Rg}If9S}cP)a&xX z4Qo}!nl0ziX)Riild%bGNr|{v8^g{HTkzrrukBpghHvX1OEKj>fIcY?uUf=ICqUA# zrgpBL{dib9-w#h$Z+>8}H8{az!DvC80+>h|x^4(wek+DAq*6l;P&#fJ0SK*BhW!j| zqQK1aLX|4=VN9u)@nEda`{vw^A>PaTG;k%JVi!rpY>)$Tp7clQxx= zib$P&K%yqy0&QjfaCURWKYOuV0X!)EFFi;l?(;6*oJZqD9t5Dw|LA8x^8T4=)k}^y z=jdkpCa0T=Km4v#v~9=kj^t@`CyrOzmKlF9m}jWpE1+M7jf3^ZbSRU_ZjpDFd!u6m z$2O&q?b(XK+DQpWQ3^rPd<0Bc&Sv5yAPt?m{u*#6heKC1v%ZW0(j3P2 z352MS8@s`@JDS)v>=qaZZ9%$1I(Z01LihB~-NvA8#M_@KH~Ai0_!v#)TV}6&XDNdt zsQBW=uUXt>T%+K#*VmRve*8-bhVrnllYFC4INwv=|0L4>0n+^c6B1P5g2zeszktUA z#3=YJH^n!#8i%imrBYakc1C%7q5T7Y;K!-R5@N|zkp{5 zlIp+w;15$mkz3+m%)`Q_mzI;wc0IY`V%hbW;jlPa%ts&qnmVwDW*SPC#5@yX7(}6{ z*qnd*-GR~7$`QgKOfNQF2StTz6;7N4XhjJb@TWIz*Lf<1#G6kL;{3EMM|v4Zr+>zG zwBXS+usBQ2wrAy^cC23@v!#mVFG-TbIScPkSU;$5zjgu)>et!N>l0^s_-W8H4n2gj zsZAFI5}9JYiGV#dYt=_31g5G@u{uf*gJ1ZD6GzRUDPfaf${jQZvT#lsS|^nOT={%{ z5pDOK;)}#ra2(MOTJ|V%VU_dFlB5rTfnYdA8r4mDV=ZhsiHcUqCEG9it`4XLUCUA7 zu%JesnG!2ew;`w7>#ZSVgNjzBt6rzW>GrFIX$pp?&1!6j(Yw)R?)yKVr^494Mh+K{ zV}?=JF~rSSrE2iqXQcM+?_eVU^!{u+ldEztsdgM+%@wJNm`jaK7d*v;cgaH%F+IK; zOW<=bojVCn0M6zyTG7v-H#n3KmP1A>!+++&2W2^nA)g~VG(*eRw&U=pPbXZ3eoYzo zpgaNxmTLr&L*1>Zjgee$$X4pXimy{}VesLL1%)swP={G{i1|Ib4jEMeszudh^*9KV zl^7yE!Sz<0vg#9Cs&+84n$+)pOnJwbpb7K^r1JFL@^pI#iK9Sa_Y#KAVh(8te}-Ki zVJ%x~9Vz{2F6A_77?U4nt$brbWm+fp6>*Jfu)Ic@<`3H?_KLW|&y;^YY;!eY zdCXs4vD+%-l8ZKZl%MMVfcXb_Gfr3YX!zde0pB>pf7|E(x^q!Y|4l|`a5i&sW%v&i zBHi&84i!+Ea{14WAN^X~Y`uhTS*vP3fNRl9DUHwog_V=E#*Rp5E%ayHbgzh>wEx*z zz#rv6R8|s6${&DW#@nPv6GW=_ZZlthsQmzVn)0a`M zxkyE4`KV&MMrw-Bhb_r1Wbwo zoZymm@Ih=O+l3n%PKivQSBH%BEnakC^@#@)ccDJpZ zPg{0at;kfGbUL(F@kFMAhcljM9I^63G+^pZi3jChtW(72S;AM|^`;V!(xPG$KMuct z$f_c2JkfKwQPumZT!e29$@15od4d68y;DBA9_t_}2JUk@DsQkrmF_@QcH50>8=p#2 zeZVj5_12qmQAAF8GbX8&T(~&G^S!5ZRfb)NEd2aB=A5As@SKY06nb}esGN^oqNBRnDiO(jdv zr&&Pq-(zZ_{Pzf5fKC7+Ng^;CwshemgXVA0E3kh3JYW*?70S2KbM3rpobmnX206p2C_;sH`&m7%+%1yQe+2G^baE9^Y(BquBFq;A= zU9O~MFN9^B=7q2JE}x&wC*$T+AE@Py@ks`Vn+xOr=H&4G@!1Ri-pJbjD@x1{>Nfx21bopzfpkGk@xW3baG<6SiiB3#BTIDcM040l;L_M{lB-YHA)!ao%qdS_ zk1ou~2~e5mM=s^Pm5ZH8!FMFGIwLGQ+nqk&QE@HR0$=>EAboTn*y1q4|LQ@xL>;3D z?cWu4621A`C|vP{e*F!w48w>E2RgZcGr{t2W)o61EHtOPzH_)Z$co^C=idfB{aKiJ zRX2(Dyu2p7LWZ=MW-G`^ox83Dk^MB=Ni^76EgrxS;^dN!9QC)Be;7TPXLLccwXJtp z%GiMjT@1kl)=m93r;u`eKwr4CRNX#Nx97Fr4%@BG```{BLnJpjdi9|O2QZ1w-08}v zj7@6MskDfvCEc-H3a?Lih1s234KUomP+*Oi=_=j!eD^aMoz*o7p+dL1q@TKDiMO~U z24(mY=Kc~FbfX=>9CZUjp(Zb65{+uLz)t%Nz=0RZC{n;z(LBX`YxZnnB)4|%*yjps zArUH9o01%&9`S{R?TEr51T?ejQ)i}RA=O&prqLvuf^s;?^oLXP4~)XMh3qSd+Q5I4(DY@=S zST@u&?(WJ*n<1ag5^jykJv>48fc;emsne|&EKQ&KOOgY*H)0T>S`O8wWQ0-C=Bwf{ zP2^2@1cP#cSvVM5E-So5F8clatg=#aodmY}&rcXqDYjRC_SsQ7Cr*9}oPrtc6IqzI zp^f0lu&7@1=!tU53jlpv6p`~uK(?8Z%@z1y`-&&0zC=#5PJTQ7`XV~}4J*28m6E7l zk5PJVjwZWlRakbJp?cN4S)=JDe*eQl)~)+>7Y-Oeg2B$MjRd1?lBWKEh`oq1p+g-b zpYjYk$FgjPlDLa6QbY9)b5qGSxet0!T&jPT8dovVpxPR11rVr*>OF!$)OZY*_h1`t zjK40>`F2_JCrWv53%c#T%yE>ZRgX43>4rK>Tukfb%YlW_tH-{}iDO#MW$@M%rm7m9 zO=IJzjz$*@0(SK))d$+&sNMThsp@2p@q`kA?oqLokUZbp8yo%aGIH&CDYstvd1v4S zmciTyy_A1>BOrC;Zb+tKXbFb0e*Vu3S;uO5JW?)K{}0EQ{h=wC82(}xBHG0-#*K3U z@vQDMQ31YNkjDo75zM+h{A*HR*&0K%TMHlxu6JaE#A*D6lrG`11lN?2y^oFaS2Avb z9O*^-KL1=(Bulj4(alL2c9Exwd3i}T&!HsziG7wjp#aG;@t-Fml56jzmxICN4aI*N zOum4gE-f|Lv9Bf9b|EFi&73bVO&kynik+hVKepa6I?{Gc8}8WY*yz}{Z5th16sO)7NP9uNeKSw_ZC4;7Pk9_}lCdr=V6m0Nuyr3{4dRs$;PrbEZkbO19 z+lLnU{5qAPpfk2I!;8LwL}F;;%zGipn|T^!g2z&yIH%M zqOzVOc)khfpIm*ff(!qXm*NszXze*dmMi$WxG?-M#XhqksUZzbNjLv|IG$A~j2$L?p19zhJ zQo8wKBp?2mY$!bKr&9S%&ve!;KUEcDW$eOR(ZU;$imvAnEbaFOA6N_aWO#hYt#`fU zF5(*HA>4~{TwY=}pn@5JS<7`JV7*+LOg`kj_;&lgSOmG@yt#E@Hyi#qrBBkHvk`*j ztccwvUW%23&fn?Du-w>R9`q!t>RIINki{m94xLlu*aT z5B+)IORk>|L22^At19C)aRlwaGOb>~#$)8(evaFRV3y2`nooW$1#f&$S=q*g72j&3 zRTl})Nd2EsX;WgmO$fKk&v1y5oKi}wwoCgROn!n{Q;t)v1`}rYA&`7K5H~8{m{`$N zq}pWNPuS%5Xp7}eBYNL~`Ho7Dfle;SmdPcNY@L%v{65~!CO4?=DG+>$vjEN zzV$Gq?|0Bxd4j2XOnY3)pP8aT@nGd_yx36+am7pl@XK)|XeAG`rC2@x(#dXLHV6oQ zovAVZc?nACYl6l9zYP#l|GsknTPiCS#rIDooOsWi#T$)HXCV99@U$KhC`Q10x@_`b zD_p|T?h-ApUnmL(l6{275bv>1cMXRh9R?F*5UCT#l1`4;mA2_>y~Rx1_?pvklKp|& zanKTx%W&;r81#g+Kx4T@6Wh6aS%3uAk#`$zzg5;p3c1Z}a3{}+$}jK7=70J> z5@IX=zX$E>+DG&cA*ZAIl=b;xu-kXr8bXpUJ{J!S_Ek!vH>yMwh$V>T6l-`4Lc;Q! zoW)MjNG?NE&S-;F&Z(4Z5)hM$qT+9{Ubt1YWwx=^+_BNsa+SSx9k&G#*rJj8`}gx? ziV-Xj$@Trm&F9DGj?X9Ijj#L5#kb`-G8*OB^4@%6gfn1J6#bS4Dh>hu?Rls*BwG)L zGfsNPa20m?L@A6FQNeH#R8zYA6m)d+D+1l=JZK03DJ{+-eA`B$M^*uy&{oS&r}id; zFh!;7+0amUlG@}uVUR7t`SYJNc%hjj(>MbM3s&j@_88O33Sj>yAE!&>bZvQM3$TB1VRv);^M{R%2geg8 zxIqlKK#rbK7Yrza%IG4BvM->L$o!o@dC-Dp6E&<4szfyJip~=x`9j>zD}ST9`fC9a zy<_mqMah2y7jY1d#voml6)x3gVIKMN0e^>!MG(#^4K{tEYIXScl1hTEFR7BVhm>G1~`F+e#2-M2ILqMO$1s z#HnfWgB9hg*}IjWhW;9Z3TT&E*bKsr_nWSyQn$cTWGpp;CSc!i{uVG))Iq{-fj$pJ zsJIRI%}B#q7}{lf1_McLSH(#g{biHf9D6}RgDRfxh(}`?sboiSv4v~}UG4_>CpFuQ z2jP=wGoCtFs|PXV@76|;7`!-@q(wZkWd_cNsW{A^x`YUif$l{7h%SE)sx^RIamHqc zz5Wo8-1H85JPsHvtDiW-S%!kF>sq&$`>&2Lmhnp-Z58$&m@Z& zbWa+cUSw>t>x=$RAs?n3Tav#|{I?C+yilAl% zH6Crf@|l-F<+e3~;?_i%-t9X?n~0+vf(IMjkNs-7##k1e_!7Uu_C9+*gn4hEXz3I) zje7)(e82lc`f~KD5M=gVK4GY`r~Bx^lJuGl!KXo4T9ta{5SQWG3G|=m)YJXa`|ry< zD58tsdBlW}lb3G;A~3~1Wt==7W0U<;)=uYXmJq-uRsAx*tS{biaM!Ump9`?nWBEqM z$&#%M74GPmt>jEYUDF1VPNyG0p|i0yN>a~xNVswv-m%CscYMsX!jQ<%`NORUzNcZX0MLl{iB~zW(eM}`rgsPGWej-C(tp`Lm=LYgdm5V) z?LdlL)W=C3Li0AY_B$y8@3~x2i$}uBnc{u7^smgh;Ag^;g&=~;u@}zS7-gM4-w=bJ zrBz~0x(&zj!EAq8ySX`;>&u83yGc-dZ`uzax-^l`G|C2^?@1J7b~)k`e2EdVZA&su z0f<{i4}UlV3GQrdwIhj?(AgPU104A$^X)I2V^eo4%}~7V`B;=X=LA&;aT65RxVv_3 z%-fHgzNNEte4Dzwhkwly=Nx^AA?<1;-@E+;MMo8Wrd~j8BF!s)!#M!NpQ+12#VL7= zu_1BQm_-5~EX~(0^D)*nV*v|=`b7SPZmaS=>A0^tSQ%Sp(Yj$fm@SnIw#--1^#Vu zNBckdQ=Ud~o0ytALD=k%?!#llbixitG5>}k>*oOXEypbb^CnGXC9Ck{TU!x=(^28t z3&l0}QVXskQgOr4GU$G1q9>4B4P62l>q41q4kU~d3$0^~*Z8}VmX??lU!2vva872JHyi4JO z$E~biihz49*)P82$7}DBRnKY^zIEf+KXrk6zg23QWWKX>VZ@w*i!EqXVk~k#yPmZp zGY3oyc9_ART`Lkmlwi|)VxEr4QFJqxC~6i7ed&1)qDYL4Rmobsd8oJf^XBmnCl3g1 z#^gr6|31yOblZ8}lvxb5+@!F;(>QZo&!F(V&JoKDg#VlC$5%8DSWJ@8ZG-hux8VgA z&Q~?2#1JCe<*1x}dpuTRu;V3XC(y9$0ryqz%u+9t0L?+SQz%=c+sQ_@n<-zUBFaIv zo2gjrGl%V>+}2Y*BY*QF(yyEMcnuKNS3Q$?I0|}MIUt-1ZNdqKM{cfRL2=8kd*0va z#;wT-M{^jl%?{|&E}hJ~7}yhhpA-i2;O3`JW4K}&dH^;f(n_M_Yg#6ZN5QQgoeC#z ztc)zASb8wm&887Mxf=3l9=P{HJg`OcI8eHg$-s`BW4;+f?2H3`P#;&^7~RojoxBe1 zqc*wE6JH)Qpy-w42JcZDoHWUK?wTIJ9Ikrr&FcA&COk`Rn|R zm!gczfidZ!51Uu^C_){Xhz&e)=BtSy*=>wWp0F0LHjxRSyvGU+S4N~oYKhJD0e$&H zLwTLmn=eCI)(%h36pg-=;t;5ls7Zey-d4}h7Nq7HQi@i?hFRx|hr1*6PG-}fp>TB_ zdCk5qLmO<7HfYrH zu0z&i2dL`4khgNTY*dijU;G&_=WvjKZPt{gJ+N2UpT#b%v^aW1y^R4TX$~8m(}{C` zZbL$BeC+`k#K9_Beu>#etCVmT%d@SO#V;wXqCu5KKun2Ksj+xdALvO`l!ZW4nM$HR z5M9Fde^sz@Z`UzyYYn&J`Go8*Hf-YkvfnmEBTTN?J2E7N8# zg|%u&oY!0N>hbK+3Ffop*(IEk!*{c!1bi`XbY~j&%`1PLrC!0aeKP!WYRco)Q-)nt z#pSY4i=01J4w8(MjA@rp5Cf?*%{HKQ*=v{l_(p}HU~5wpcwT_sgd)y{Y$t0N548e+ z4#@F#xAZpsf6m76mp$1gd$Fl%OI#G)Y%;;M7ClN;2c-mcZ8EQUia-%9;Kx~H{ z5ZhU?oiE9p%u#O^$KT}t3ch9iP7R0zgOxYm5ro;6F|MBXq9V{UucK?A1~5b&B=Ie2 zAUA6$?8>CvrON^vCY~eQyA69HVVp?fzY1dxa-2p?M3357!b!1M~3?Q zcCf1YC@^X103L{CI@)2dTlx$JBfm?K+3(|yH*yEx(-n|l zv-Ec@_xmm#?`T9;|I;m_Z;-^TF>l1vEtYREMVP&I$b|0Yep4oMhFF&2_)DW0XO6?~ zGQDcwKA2`;QZtcCD>II4Cv#x9#s*iAa&By}>#RItF)F7NLT5eW%46d%hlNx(bhdkG z!|7${E={#xw>xMDJygR2IL;HXA0X*yR{Obs32i(H@jE}h(a$z5Bs@1ry&Y+GxSN-;4DOuYsWdnP(I$vpqhAC@C>ZX?WGDwG>X?;B z`F~2#F&knG&08Y-WV(=2JIM6?h~5BKIjDqVru5DJRiF7 zw~Y#SGRfsGw?TN$pp`~_{#G}ISY>lp%E zSv#Nun<$5C!tgG|=VBMivMv;<2Y>>@hZqS`Qi)PTzFh8f;yXrcHN#BQ;Y`#_*yw{; zT0?}Ua^f5;&6HL$7$*y7PNOFy!A`aJ2Prcmb(x`LF6A>!V{h6ZisZQ_@d zWkqCJ60F4?nG^=Y(`d#-2M?8~y-IRd@e>?>NiiuX(hdT>$nSczQLtl1;wB4x0!Xbl z8omKyCiAX7V#=@f+8U20BBUICqlxu%YMCjylKSrpwTn@EU4SM&&g5MJ2-UQ9bjG)V z1PP9TQc78lSMV>L4u`7e3ARlU6U9;oxl+d13#$oEuT)Yt3fBoU#3!((e=ro6!A*Pk z*p`k*;VTdF8$&wg+d0oCN^^9IYi;;4l3s4nR}LFi4pq?RKF%m#I!z8MT8mVj=qkcV z^hLp#eijD6roHZFE&|3%YmCm1WVd{Qbm!Qtq67(^EOs!WLwaq_psZViFAhagc_L=e zl&m(>s<0lWxRXB!IetTr;b1cgf^WufP&51Y@_9WloQ9fnsKE*#c(cr`#J|%Xj`utbO%R*ZYJ3R8Y zZ`_psNj28-!v7zxssAD2`1d|3OZ8KEK@jO98e=|L1PvTbNl|g*o`g6|8hL2lhz+Aq z8+fZ>5rYCBo&b(dD7GVi{kCECkU5L?B;rntq;%WLP_x1(Xl*Lw|&F=`21 z`%4#nWFZE`9k`QwkE%{@S5rw@W)~YWw#Z8kGAJ)GU5@QT2Hpl5N@z$+e0eEws~dS*=aUUEnmbwY%xp> zKfvNf$2;Nlrw{2y61fxqs^Rp`OEu=iha{t8hRFnq#sug^^Jf}yE=`h|O2USOo2XD; zVe*m95c!BJJHo%?nVTfe2{ZMOqMLI~O9kKC7#3+#(o1h4jd+w<(;SVrCF#HqJQ(P5 zCd1znkC5q@g{=g&5KjC42z_HSm+dd)oX0Y?ph*4OuErL8z?>;ltS+(*0f`N90RI*I z38e;vn?%7%$Z`xeJO-BYGpBtSB}LQr7d=+6T4_2vuWZh;DHiZy58ikA4PLoN5TuMu zgceAbX(b??;Fc zcgwxZHExW))<=T*v`Re;`@XQjh+uGN3p3IEG$Qv+ArypMsyOBxhLlzPGOS_qFwmQi%s=!!W0%9?He>S^tXRf z5QM=0qbB`d)W5Q+ll_;f%2d?U*bZR-B?)k{w6pzRp2jM5Yd2IeEZ<^4yJfo~bP=Xt z#H_F<43!%IxhPMNsYtp`Qp_|#cA@CZcGbpjAOD7u`dRAJPybE^)-hV2Z)9gsDQ8V? zK?c}-JCvD_mG;Cx^LLu(_mcqd4Q7|oH#!&b5eLUPXqK|}EZt#1@(_V0B~?;C0b3*Y zuGKQ_8pi)s^G21W-(ntVZVp~IcOg5&Wvf4LF!e~9f&{Mm%9+9(VF6_p&!dacRgETk%0bF8IqM zY&hGDAcD543+565%rU{ajhfa;4&g)V5ffHO$y9F)iv&WO*DyCZsw<;YqLtK@gx^@cIq?mvg7)h38N)ES_$2gX88WBb`l_ zTZ9DiEyeQku`1_D5 zP>}H?e85HA<3EfeVO|U3p-h>NOm={JvG0Fk%7!rjzL7{ifySMW&*Z5`9m zh9ymY(sQZ+XEQh^JJ{je$jKXxAm}Qhe9&FA4^?ze%JUo%O&Y*w&<6p^jEETwl(SGF zxt34y;h-u0wEt5|NwcL(wX911cT4)lw`Y^_3@5G4pMrr0qD4{+IHqa zu=+Pi1H|V`#1!ul7@ayXJD;UnMy|)B#19WH?M=4mba>#mlc7V#2^*c)Ef%)JRW?B9 zi_2$(i}AeV1F|^`g$DuTACyQ`9xq^3A8~Nf2Ywn`fX3A2A^uu@vyaLHWaqK#w;D-K z@eflR0>?eTMrKA&PP55dgs(<5DCyzM2C+4^}S1!!k4 z5I?hj_l`z{&H8lvkU|d#;Ips+qefc#Mt{% zippSqt<;RQUpxhZqVN-xl3_;_g*a4^uO696X3Eu;{Vlk_@AOe zAgP?8yRxaXqot{nf~%>cqos-IzY$QC5}yL75R%Wt3P^SUVXmZg9-6JJEG;WLDJfQ> zD8jpAq`T*4S{KBTz*?$>EbSY}AFKTsrfK{^VIE@^9y|W+&Mc1?Z%@eDC@TUOQo2H$ z!Z>6~z0$b&?EAm;T#Rf{r~#$s=kV(jEdPdoeie1N`9`M$Gl>>HZ!j zsE2sgON9I^DxQ_3m?e!FJ9Sv#D8z4P_SfT47S^mGHnX+JaUHq;k3r0j*m8EL%q({WIoFJ`QvTtE2;> zz_%6biL=NENU;|nz^=;WoGkO9hoEVfLSMcqp#%T4(A(S*p?C{Vi6OH{rr|KjMbwk5WqF72b=O5G?93SZ=PA<-59u{nO{eJN$ zgB}%1zzD}nnXyPJ7j1(%*_cdPk6gVrVjT0IgVKQbB+}+98PD&F3H_fExqoo$e`DVX zfJ>Sl-e^nspWQkMHsna4Fdg~OSPpKeo8ZEn7{o}u;HdeeK?Td)Ygs0tHm=EQYl4@C z-vLb));|Fie3wFY>nJ9e{>j=KR@PU5o4?&R%j?UpXE$AGHtZQvni{VXPca-f&sjS= zH}BhCe^*(|r$H?GSkNhj>w-|QiztmPfG}qy{)4xx2C4#RSjxubd8t;MNa}KICXn!K zhLFPTd64S`={PK2`^Cj0DDX}sqmPLbrMuFk zzqtEOs7*&pjZzB;BgnXAS!|`u4F2ji@@j~)9Wx~YW{uL}l1joij0)28fFt6P z+KeNqn|b_rL{k-@d;;7@L@W^-EA)N{K|X}=#k7zyD>7ad#9vC1KoRKpP`ISVNowh2~hF}yEE(=g?J?Vai$E1e!1!=rY#*T(j+!4i!^PG%(H@J z4)Wr)w2caxOjv*N5tj^C+LfV;b7~;RUVc( zAySp}D2soSOAIPz&p(&Sw#@SOEs9k0-e$|k+b&8EDUNv4p({YQ#=^LNTS%nT$JrUbF%Wjx%Av0^ZdqiMnzkl?A)ZffYE4H%H5H7a81uj*X*z8v* zs}kbO8;S60|Kv1ES(=^RqBh2DR`E_$l#EJ1m0Q?PU?Y$n7T&Dw#i+`Pm5DADkA>JfPYPwuRv_ec06wS@IaRP4Q%u3X~nQM<_E3RfB>Ctzj7P zt~O1H)O*k>^g*2~&k#-r0d5BSUdGjG4D(;+jJnpU%^9AaNm(Y=B z1eoZ=oXE5a4a3=!6umjKfpZd}%ay`Ubm_KbaGYlF4_)EJA`7SH>HJE2--N82;L*hz zj13BdM}VS?$y83xj42CkCT+4v?WhgPbR({4p$dXi!X^oeLkx%-1bX6EoeS#>3&l>R zOF6%oa~yFE%u`W@K4?-}Vii&{3JDX-l9EM^a|R8-W6qdisMW=yM41`2j&&UH&d(f} zLD=@gk#$NA|GGm7kugITkGt7g-fnQRW*8{)aDPuNeb}x$5xC@pJ1S)e|f4E}T3?qlkgV=HfdWC$0^kCkkI$(3B3+AmP+mFDGus=Mn z=WI4R4*zg*?+W4=ZN+_3L@G&`#jYe!7m+Hb=qhI_52n28WC?cJP?au6wCm3x+oU<* z_my8d84!iZ4kMjn%sSl6Xc>3M-R6fO0pwb{WHrxD%lRa{_Ll#$LY-5QpA#I8?>m=21zwGGw9D5$Q<^&>oOH zQv%vJ6>gdki->BB`V{9X5QflLERoVHN|FZ=blcJc7tGfs#r3njr{%e0TVU!Y@W*Z0 z9a3yBp0Y#jffd%Z3)S#^OMhPE{lk08#W= z5ehv<7Tz`r$*IV`t}Pg@zmYH_ZSssAelm8PfNm=Mj(qqeo}4+RzC?P16HXe7flI>c z_Kjdg&jJM%p-OiXEZMdXXyd>s4-%iow~+JCKf@uu1~QZ8m#?S_50LK2U#>zhbKF=p zbQ=U`!8awO{NYQ-9@9bcgnjB~@^@0`*1Aaf>@3tmuVh7AdU3HI`C|Q+m@N(Vw;QQG z8(ny}BsE=Bv9Y0P9{&_{WN&k3I1$3lRJ(>DsPR@t-|cfpCFq0M2)CzAQHSo0eV&|n z8^&2;0B_OpZTIC^?9}hg(CxI{8`3$dI<*EenmV;4{0MDrQRwa}=~UTt>0f>^3B4B= zpWHrd3s6~*VLH3y1r(!?!PHf>YHHMEvkITP%HbWVXx1D?CT{(7-jYoXLAg<%3L}tL zJ>Y=XICKNM$oUzvbJvsR`&EMcY{d34T08%@63782_0j+b?9(TElN;W-Bkd}nFtw;t z@=0}VT@5xVWTxDHZuFp*sF#Q_r)f^3&EZbeOf?&|QoAQyMRM>m*$d7as&<(#cLKK*=`KbpXSG$cm)CL&%l#)>zw7uN<2d5IlI~I*8IbNMPMg zWRst34g2(v0^k@JQxfs{oeKox07YQo-p%VQcBpjX0}cgX%I;V(F#VsV^L+`G=vv6t z3wz(Pizm>VA5ht0A*ZKRW0F{O>4Fa>;v~Q7nF^ z4t{B;4q?AUV*-EDdg3jk%pLS5M-YTI%RX?n#-BR4Pl&~U{Uq|lQ%*T`V5D(S2RBfo$J8K6vQ5*KC8l zYP+xje^RNructh{#BmFKAC}dBZ2MY2%mR+hq@x=YBB8jn8avEJ91*1>7Otp7fwU&H zU(-i?S-4{S-Mdx3RL3ZM>c^I!0&tf|nGSV{0%G1AFi?pdJu<+mg7}Bk8)ZtX+B1E~q^ zPn(~AYIlv$7XiJd~8C5eARWntVo36YEQTm7dQKV`_cEX8qhUT*1}rZ&8ED7 zjO#OM6sE0(V`HxDXim@d2!5WZ`m~>phTNyUHgmkvP8ayWl~d^PnQEir5=4DEM8+(z zFSJuW(cc9r6cJ@XNP!mYV`v*_BiFxadI}RN*lOMAyB_ zn`uQ3X;pI}Im}tEO$l3oHrE}tf~^=OVsC<&4Oa$akPi^d&y5$;RGR!rO(zYQANwK_hDFD35s>i0#F zALs0wBTg#Ynq;K`uSX~E4ag;ZiAsIL_1CO{`EB|KEze*dMDexYkF~z!OHn1Kq+HSu z3dlb`2Yc=a-9P^2$pEDF6w`kxJyr1k191L#5t;+{mk2FOUPu~D2&r?)!J-2xH5gRnbhoV8Eiyuqr zrATChe6&Ow_R;gdaCOZ7$#UzL&JO+yTmMg7{ofV)0BLYa;ENlo8rp|myR2jhYfybs zm61Ow0GnMXU7Id$-U3vz4myHUN-u#ZA&ry8vMlUx_g?o0+(+(-WUOO!Xb#_p9KlTn zj8u9d`ca|zcE;c9`z@~?Hy+?e*8`N_z%$i1LT*y$@l#=rfx1X7)yw| zk@-j+TILQ&-^w_o*g3E?!?zysd^wR?zpGODwdf43>0Xrn7j0}GXlCc)sY_y!Qjo#3 z2lRWK1SBKPlZc7vVw#2WEQPY7Z_9c5Xa-;+600KZK&h`Bb;H=N;C06dvs0O6gfU8t zUUi#c?6~g(MfUeX z<;cHS1v6-Hv58do!Si(vF+lM9ZDG7jF2z#sEdoTjrqh;T*b>aK;A_sQm}!W{Ys=a? zMkdnbfz_a4xjQjRAz1(iJsQUibti8dMGI=?KL>uL!exU|v;!7A>y2UMb(Ay$h-0FA z5@GOM*M+=0@b7!-1*wD**vrxI%UTEioaBO$Og3;7>WD`poPj_S#aroAxm^bsh0)YO zhme7%HLjQds<_J17n}`*yeVXrr=Xu@>+GQv!0_`Gh)XJL3bB3Pkq1OD$z3WKg$YUG zp;;A1d|j4AmU1&C4`^bg_;!cfHr}RR4(V8%cuJf;;=@{db=L<5(C{ZFyuY+U=*J~W z&|E_{9PP{7!yk9KbYkt5hJU;J=eez^5zE8gn1)gulP|Cj8HBZzjg=#>n>`YC0`YUS{G;=4vviH)@6@2`gbP zsNdPmEmYBNbQ=_Dltb$N4&>NmC)tYg0h8Mm3A6Lm$=tXpECLuvGE#@&!_C&foQ0N` zjJPWhvAqq$Y-JfUZCd5&7j18PK#@JxkU?ne+Yxksm+Ku*;9r?zX?yf83C6`tPq5;i z4o{_;(hQWa&h_{=Bdk%_!0b9KIFE|c6}2XCG`J$!)%0Gh@x$Ci%)MksdeDLo0e3<_ z`TfiDyKTK`BL(8_sH>qIvcNe&pYil1pOuF-p3@CAwxn5(r$9C0ZIPkVxl7FO7V<$K z(QtP@tRnT;?wQlnqbjGb@(L|6#*0>^=>TlJEt>nEH?weU?SR5Z*6Q=u$YbdEahSks zH60B=#s*5a@v4vhnbfnt;mCP8P?S$0t^3E@!x^OW4^sY83rv(8foo}fde(vyiyM*X zhp@QO1r?HTIgG4E+bF~x&|kJ4FjU;0s9keBnr?d-%R7U^`nm%&51W!9y{?|ug5P+k zdVfGtI{OzY%^*0Vfw-CX7XC1z`1Z1y<+r#8N~s32nd`R4R?qB5mxT^53QVE=LG9j( zX#Q>M0gw3i7P$F$t{s_r#&>aD$xyx#Hpw`gLP-SWLRhIwy$~@eB>XaJ0?uIdydCs+ zg!!4K-mU7}SX|LRXyrl{pd?GftxqZB2X)QE8GEr`a@1k7gE97DJ+BGU0tJ6+&?r*j zlT&=r(&T}>IM_d8G@Oz$r@*jP6>W50oCuG<+dFruoDmBJ0jQ6))?2W0N~Q|?&{dDO z5?!}KIjMw8wKZy7==jwJuk`Xo7JMQXRB;odC}w^eoICyzx?r4{`11iftQF5qBBcxrWcmC3z8Cyn__(5V9afuYY>S5Y`+%*hK>=Pk}v{f7^(1_Hn#}@BV(GB zIXSHBj$6lHw^BX|&vQ!!;5FgW!e2A;LSe>lCyX~+DIMN!9#7rCkM{$HZzc8uk=%qugApOn$@^zQ&jq`*&xAieS(d{E*|k$W0t_HSg*@K#t(0ZI>zQam3~)jp4x=HSx8=k)gyb30e~*sLq|4@LWKw}B*7M5ZZ-mh zQtuAk0Yv9$?NfAB!fep>G{P-*lSQj#M#r`C`m&rxuUh_vD*ql8@zGcAV81Um!(Oka z@xcVMC@-x5m8ow0KoUs~19=|sSKa{6G94LLy5{6vKv-&!Z3sTi z3j?}~$bl;sloCU=P)wvAo{>fR(Y2|FOQ|AH{wK!)e!Q22y=nmQ0ai4NjqV*!py)k` zRd%_}&qi2j!<#}`w;R@^Jju|qIsC9{GaWkIAJJ@k@L(61xie#&F0{+|VGvOW>Qcqv1wsDyLUYnVvhXD|&QbD{~E9rdr4;i;bmNV5ozf>ZVJiOls^M zBzf6)z%;+9;1a7o-M~~+`ba%aPJ?U9=+q>2cTq$E$I4|hx&;2;!#m?~q$19W6OXkm z-2SZ=MzTEsHgz$!(FGnJm@_Raf<1*rYW9rtz&QWY(zNcju^O{yw*h!+X+4|2MB)|D zGf#8KGSEEPP%_ursXgQj*0#pwyW<+&wyfM7XD7d-i;1(52{j+P zv@uhL?5s1l%0$!ot8sqoJ+rK)>T&vY=>oB;_`@;zBcNPw+mKUBgjR)(6M~aj2hCDh zK9Z~obC{wKT_zB$L3@Rb|eaX}r-m8$n9L^i zS}BD@Wl^#Wz4jXtf+{RF17gCtl~E_#BW`Kga#D8`yDyL{mEp#VcG{oeGJI-L1Fg(?xAs~ zuxMk@09j_(!(8ZSgMz)kE18bx?irvUvE$)LNF>nTyw#^ zPGOd!HT)l@Bf5vK+9iFaK(MS z$lLzci+mRB-#(!K+JaLXg46y}+mrH7fBk=b=^%`V3F^w65=RD!|F2G;($fF&8_<=R zLCDF&)>zrlP34R8ur+s5XBM%sG_`g9ujGy@%_|l373@#^-FEv1>aJ4crYkujaHRS; z1LIb9bZB*2J5VDw%TdQ05Ow;Fl`kHH97k@U(E~95)Yxk{fAK z%;x+lt}?K)<-M5FMx9UU#vhMNip!G?O=bXlzrFX>hEzv-jpjj~Y}CB!%gi8XG!M}qGl4DS@99mqWDVJkRgYOH4_Z(!{sGBXv5&zsj@RmxsFHRyVY zw5l2zE={uIAlSfQU4W6G1I#RIK8;e-)xv~4|GuGsu@H}7@n zq+&K+*}@Cn3!c|DAA!ohy~$8Jmlyxap{*^fJj56_D2M4TD8QRG>k+gpw{b?4hZ}mY zF(nR1cndNch_>oo zONF_B?pMKgD0uklGFr?a=MHcx1l;(K$Op_pJY^$9AY3EbNL_V*pbo-wwiOJxW#15| z^=nu-!)|GBNahuk@u_H!U%{vI@D z2cQkhMKw|>=-6{*VoHwfITi_Dc(bb2&vC}Ex;Z@i-FSMC3O)Kc2;R#wiBBj{gtrFN zQ9JkU4_|$*V#Zs)(Ko!A^J{&xNiP3&e(Y&a;D@U6im-BaqGhvy8?lFhySpFznY!_= z%*6I!7VREWvVU(`Q)5&|8v8Q03TtF-sOvdFd)$qN~fWsowji zezP>3Sa8IxpMlnHcSTBTG;0COV9j<4Dv_Rq8t`1G)%ac1``I0=9gB-kwBL=D2Is+m zz_n85M#d6Sb@R-KLuGTRN_uESx{ru5bD6t1DZ$y+<)4!XEf+4G?QJE{t;*+Q65rQA zG(0C^pWyZ+EC1vSaiS?RQGjJ}gPmx=N5x%0`ikx(!pq_wkk_TCQD9bNY*L z1wS-)RFCju)-64_e+0Scgcx^UwfdVf0P(eb^j1?=Ff`n&%eAtm+cQ`+Cq0q|pJT=6 zd?otqM(Dmh)V9kZxwTn|?@9%cf%TxAc9kfyIUx5K4zh3{*pp-~Rr@Y->z#fd8W#3p zoR8NIG>NJS#(h@;#oVEGvxNu}YLO}Pq)h~ge=}erx+RvTrde`>6C9tR_YF_F2kwY> zioTjwb1zAxty^xs@QWHR{AI+c+3l9ur0$#Wt}ej3U3x(0Z?RX<{h-zZd7v(y(LZVr zkT9od%3gUmk|yYk<{;)PIx(cY>bFZD8F@|r3~~R>d)?!wxqkpK-TZsVV`0$=e?V;& z{Xy_uJ%!A5y5NOjb9gDz&NtMkxxoQvtyb^ky`HV)$TAJSKgOIPW&AMJ)d;ioNp#n5~5BlMMq6v|(gZj=$)++MJu zBj?-A>tNV>3`S;0Vak)7zXPWY35TiX`bdizf6=-XpYCuO$$7*Mcx3i|sfjkdzJoL! z-Dynj5*8BL--u)mvhmJ9XZH8l<9rq$e>w`T3d*2lLN)Kvb`caooebJ`QX<|@0fQc> zI%R3}Q3@iLVK9QI!-W!!6BtXMtSJi$x7^|E7VcAPZ(Y2>iV_t=?SLp1MV%?T=NmW; zA4bRykNDmi=-3)JyIz%dk1YcRK{W+aejb6DrjXL` zZ?l2{o4Hii2+O`UFZ53jLN8ILJq8%^i`%uvyRx7H>H!vm*l$4TF5X7_#DkP693p`zXu_j0S>QGa2Dm(~HY39@fY#({z)=06j+6uFg@LtY z9vvN;G#oxa3y#W^MgWX#kWOkN7#()2U-N0l#D)&{V)@;f>_W2PNoNdLZ!;DhAA7Rr z59K`5b@EqW=PCOJ@AthOV%Il=B+<;#K3aq}?)zAV)Ru`=V|P$-``(4+mWc;(@Ry5s zA)rZtfx4Kf8weid?Cv5HZhP(=F3z8z&_9n*!UfqNEEd}0gAX3wW$&Q+V-Q#`Yxi02iC&-C2q@I zJbWi6h28r!U&52O_rLq+?HaJrY9>US33JJ9JmYP(C+$?qJo~6yG}aAlTzyPmLcnHk z7m|G`wb@hOvv-vN#}pw}1+B zplS~VAI_o7;AriaK{rBb96(*L){kAb(3p35(H@(>G*5Mem=p#epa}hJGKo%Q6yRXWot&?;3!h%_s08da*A56qw;VJLAJc}Smh4TGO&^Z`ER4>*lkEqd_>G;UMj0hW! zwusAF>vtGp4-_^(JAAl57a#+B7px)|+o7>5Tq^sttK;_`(@Auy(<3aaWR7lPAiJb9 zO15_dv*rw^XT%Y#*eX}*Kn7F#rPjfuw%OhKxXI%c+iTCa*+QYW$zeX+1721R>iE? zsaO@;PQ}TJZQJImXayBjY}>YNR-B4$8(;Q*55BYCbMJlb`ZIsbf1|HCdK+!D);iPE zi_kimZAHJSc4fALI9dwioLTp%ew5~0$dV02j;T(QuU=msQ-5(WGG%4?s)F7R%sR`( zoLt0Hf128xy1ARjhzcK4sVg8a_u|ZN`GvXfcJZVBIXl!8u!joJ+-%N=iy+&Wa3!*t zLjIkV!S5HE6l`z_DknvgM8+f@N{dZL926VGeBT?I$MNg6h=uKw$g3Lw4#1uYz9rOLlg5f9C1rdIY=m_dmJUp=)!wZF@9a%6$cK8- z?FD7%i~;gDa=H0IJP?q5mrcgqY%GPcxCMpB?+|Kb6CkzxZTfh&%(OH*SOPC5{_<^G zZ_r9&3hsFUJ%HF2&r)V$k!OI9`>cO|NNDl=3Mn<){Cl?S5m2!&aZvuzU4XxG^Yd4| zF05vyyx1u(U{gB0HH~R(la9u1bR@&(Jp`7l`rLLD0>xZ?x>t|P@j{}Dx9FpaM5ks% z`&SAP8&JACL}%rum1W|)r<54^4q)x5kRAjYgc#S*!mYkzW3r>IcO@>h?g?q&D=?{+ zmfw5fKx|Q#>!2kCQ2D^RbgoK7+ycSLw8g;So}BrzBPuEBo3}istkp$ zTk*2@u!0fWc<#x=kj+o9Bm+P6jVuk>A;RsO*n6Q^L^cJYL~sY3z46ww|0E~)MR!q@ zbi**xV5;Qh9|zit_Po9`Mw&lVM4oRxmo@*Elw!V50j?D-YhcP~W*IMdp)*)MpnVnS zlBS(3hCmR>Y!}i=^II9&7YTpNHjZ;oLLYvSyxD#x?wG`ZKX|%#<=^9*YO?KMv;*9#Yy$mmRFs9w8;bTf^PQ>_@*)ygNR@f{cG9+@qNIT z(<-U~GJ>knGFd5PMTyy z7<$s|4oEcPH8vK^Zk!~}=aR5kcuVw|R@NErI3P3Sy7=8&_#}XXR5rbnF})kz9di2gFBA}~^%J^nz41mCYw#FW z9Duc&pQSz`f~MTy#4}GK5psmEe!5Yyj7i^8k=Hg%V8_BT)jVR?P-qF0g&DU7Bz1a1 z9YM=l2?vT4(n}DGG!%s6lO4Tjp7i^$)W>I5SErifQGU&cw6b>!bZ=SB z$?$Z&pSHZ~&=g;b zPanD+UW-j%4@?}|cyU}@343I`ZUNT$>>b!Fc;0hT<_Fz!i`I+~*ILot?m|8rHBFku zqRr61g1!#~$;kaYWjJMhLbM|@X2PxwR$AAUoJ-daYn?NP@cGQ5 zJ&y{9C@OCH<&jM683|{f6-N!o#bRgjRMztO_(mKZ^+;C8G}nhK_suz%991mVpyBhr zJJawT>8qt;EK2uGnQ$Sjs5U#xHz!s=xTrl5^aiYj-%}?P=M3jWtYe7wMB{jx%JoDE zcy!6peiq+&BYyG5IsVwzIqFUh0;D>1yf;mxl61VX$m@1pehH6%b4@tVTgsH~5j|d2 zg^mfGKOQ|vjya24G&%u2Z`iTfU(Cb$2t$f!uOD*HHzlq1vAO6-!<=a>Dtm{BAGsHG zVV6nSR^yIDd(`lPRv@s{Z@-!zdU7M>2%DWR0Pl;TmF$`CSmiLDh+U;sFwglXerI9Z=$d8XwUTz;r^yMJ+=dj2 z*ekdZsBmcd%3#>Ag3>$s{A>SdHU;eVbupj_yZ5;LW=v<}$pHZfbb%0XwSvBIV*@na zk>H0NG_5?wd3Ia|ew`J18zhhOIxz`c9W_JD?A&oW#`aA?zAK`<IzK6X8`0oafiHCbl*KlXjo9*B^%n!K4lMCZheO+gcZ8{W!)slj zFWbYUyThKkL+WsXZ1D@(1bQRf@!B~fPU~EP{lcdPrSQ ziXoa9B$)x;$Bk#4YwFk}HL`p-k346wsbe|6Hc{9it<)cF4fjYpDh6NYSemro9&T|9XqOxJ!vLFZtg}wbX&rEfEK(%g4>+QcEG{83a zAnGQw!S6RIR*?w#qy9iNwLgH_k`Jv$LOWm)Y^@|-zz__?J}_qts4;>nH%+1mbfI;WekgHt@i<0PQKe*=>=) zwsYhHU80?@6gzxk=aI-c9nwS31fP$dC5N;U1KT1bhrG}PBn8(b+ftxBC>O_#kv!;P zi7LOZNeb%Lw#7|(wXP=qXlvbxRU)pW<{8pT2yDwgjBeZwk52R>0pF3$Pl59|y#}To z=?$G8$3NX#HKbR@ppPYPa$q6Yto;-v^`m${A^IeN zarGVPud^{sysT^e$7q=*n!nD*@ZkS#?uz~YLB2Ephvz`u%N|1w=RKV)QPvhKBvBkT zYfUPJ!q3?Xmv+2g3N--YngmwJoX+-)PZHDCm7&!OO_;91(nm>aUFFh7LBXtwm6JI) z5^!wfoW>pbU$RDX@o|1_wZ&Jhe3pd+LJ34i>eri`Kx9J!p+CNXMv+Gbii{a!MJ8# z4-sqIGMRA@WeSD2QWNRidnD#ZzFCB(ye@Pwfftspn30%TB&bcqZ);W>d~E<+O9ZP= zhdyyw83_i=OL^IHpFjU@TyCq@Rt4S3tJ*H46m!bZvQ>@sIV!^`AK7TEe698beVL-< z?woT-zaa3NS#Ig(L{&G?&kt2mmvuScFvs3It9vqzzFz&2FbZlL%j-&6ZkZUx(rOkC zu==3s%R^n%8LDcMP$R^uozj7vwfv%&AM`u3Uko&X@*0`!s=pdc5@0G*j>V?ip1(Bx zk6D(c{&77^#+|oC{Z1NHG0(w7I15Hmw+)n~?C)&dEQ??23P&v`f79=>JkMS&_ipt! zcMbQjtma=3R)nZtdyO=Xf28wcyH~_ld(cOwCO7hY+!hEP*Pnu7fn3Z5a@;te4Fox{ zBZr8T(#pr#;t6EVBvq0Yq%~VlleWUCX-#+4D?&O_WB7j)|k+vR}n=(simbBBrQdcC8ScVws|h|w&J7im=DTku)6dmla672yokg{np?Do>kQ za*VcqST5{l1F`4^s*yDMCz()lLjFYdt2BL<(-%dl>EGOnh9x}7ls=Uy5Xc;5%J&=7 zPR{r~3cu>pKB&kU>nH<5*0=&tHI2zm92*jRicBZ>iG8b^9G7|hL?Mf>a2OIbRP|GL ziPV|1FI7dD0KKTwGl~}bH+`oG#pg&fmzyz%Jp;cZTOba={jEE%A}EiScGenrCgC{P zCCK12Q$EnOvey>6qTVAy3+_ky(*ke7X+`}cJ;yehuTJ)UYBxQSruEuLWQI^47c3OO zU}FYtLy^!~NICi&Qc`~*!lkL@7emAd{V->6Cf?=#lE)6Q{nly&>%{Hh+{)7873wK1KnGj*5uKa8pUU!{geuOyC%)b?Rk}S z(V=)n1}?FoFPs8~s!e(l;)Vth>xej~r4pfuWr6SZEb?t?21o%2#gV?H47=97kJ|HTy_e@vdz`EOQOBJl zOPs0wjUbYy=|(=k;aa!7IR^f`w|WS0=zu-aa={_HN&W|Ml4OlBC{>Oq!QH|MXJ7XX z;^;`Om-8p0SErv==?E%b;nanW^{O)v$_=oo;?>l@kx*V(^pX<0{1TjN-e(ktM@3k8 zlJ$a=kL6b{8&GdmDM5(hp;APax=o6HN2_0zw8-1tV3sqU40<4~n+>4?IdB{_Phf zXE!i?rFRHucgxb;^_*yL_NPq@@ped`FCwo@BmU@$Cl# zFWXG{!NBv1oM-e)z5LLt68H|}^9`gJp=!0<+!u<7xu3$hxMf$_); zyBo3^2Z+LRsa73)rTY?~`zCubxZY3vqLlcZaHLuhyYAUH4#k3npclA(!%IQy{fY4V zHx$bYV#oTpXHe+bc=ibRvKuULAprb- zGcHZdp3VI@r`gHLZFrs4;-`Mwfr6+0FpV4=YGj)Nvp$#12Q0c5Ey`~=HXl?x1`DxM z9;%|^nB}*QqR*K-8r1t8ft4FpxZ39KZ;t|h!3{~~wU;mdD;2L(`rqRc{*#LT#~uH_ zK*pS^*2ioPY(DV(dKYP{=8!GO3t@&KDHUX`OGSo0)@bzE@9PbxpMK_RxnZTeVPw9* zrofP;U}ySV4+D+Tl67b*Y+4f7`>boy)6>tr%_h9Po_t;}FIj%1HW3OEKKWcoVE;%Y zY6Iq%O*2ATBYw)YllCQ0%f<#mSkDP?uNXcjsW2smiL9VnbXn-F1n| z7CP?PYmWpA`R`6}?#87AsD2U(Y^E=S!35@}Gu5Eu#W04WfOS^<_O*FTh8J|>RZ2Us zfHmS2LH?#t-$yZb+fq-PN#?!{@~JiE_G#~3!?_}bww&<%C0Af*8{{FcLf0``pfRqH zJ93j9{>(Y?Xs_D?sZAz92pQg`G$rNYziCc;Olz!)9}9uBvYmQMZPQ>tBhEiO*8%LC z>yWu95AJE1n~OA8UR9VR4Jkz}KryM$yU$B-Y%d`v+97d$%aii#yf1 zy2c#||Ee=xj3D8{{OLrjr7vsmo8w4`=Zf7=dydRFyj;sa4|iYvC8EC08hx`J_xaZU zVlC>A*^&|gLA5Qb?S}MpM||b+OS}1Lhcsti60fr~5@3dX zwJ5HC^lh5rMKCA31Yf{O&T*r4nYifn$*lYkMbxnzN54!|&GCwcKvUi^wM5nGF>VGX zbN5mF)<^5%#r%H9wA%1lZEBL9i1w4&9n%~>6Fo9zSv_K3Rm70^&!%1ym}e2$dLl1T z!NIgCC%WMR$R&$a8&URYe1~dE@};_flbDdUd$hkkoQx32-jfesDfK^j! zzcn)d`^TeZ^O0ze?E3`)N*rPvSyL*71BQ(v0+muWB`L-q4XhY8RQ3;rPy8u3M9q!_ zGs60Fz;ZHZEIJt=VD^;C{U^f(BiZB1Dgl~KbCv)gN2fE$hJ6W24-$j#ooQai@mncia zj!K1-QniO9y+f+9NvzhyU{Q*w?Qnuk$x}&va-3P2O?#44>!Y!zQZoSb6b3LVHY^3% zGObSFN9wZ5&=(%xDjKAHn4CaH8YaiUA9g4=#MIch`b~HODO&VyW@HFkv?7(o)~EgL z=$|gWrpdzEt;b&QgK!MVD-z7*b(UQFuOva4{(&22(>n~MtY*VVU$RX9gnBcx{c>O~ zvMj}|&cZ4!ko0$4rcz_IrGbo?R5>jfR$?0IM1kGEAQnkfEH+<3z}mV!qETrFQZ>cy zw?T=ze#Yu;BHLsZ!x;!jCTTcjtC(zJC+OEofjQ~ae+<+2NZTBTMa5-Z;f>I2fz*Qr zp`eTf20~DLGZ{mZOt$7xEa-K)O|e(8g+3o|=k{3R5oMHIMc7UVl(SDYpw1dk4m&!# z^;oGeZdM^4joZuiSI9viTwM_bx|pPuY!xEZ25+ydV4R8nv?9$!*k0q=U@f>M_~Mbu zF16zf6q|dDwQTMhHxWW2*B_vw*3@NEnZAb-xl55U6W-&jztYbp+tw;+7bADh>^1xT zp*dy}S(N4gVNt447LDxwR?%^wSzCD*49$ew=rOQ}Nh#<8qykrr5ZoexO3 z*tw(91IK@w@}QnSK#STJq%3fCE92Gd>hb6;_kR{+&DW;-W)#urU!D5-9CCcJOgY-n zt0)zL&$Rr99N}bk!e`2RGraRTBaSyoZq1X+1c0tt$WEGfx>A2L_lX;`E*h6uRJTTN z)wkmK5t7D*@EDB#1?S^PAjcZLH$DFAA9s{&tVs@3$04y_`F`j9T}Y@ITzsN8aHtuE zOktw98;1I#!UKopqFIJ~;fS!fBM6E2vPDk?)!n<{XylItWmKXojE84VCEDxHxoawN z!-yuj)6%$&1I(amh4Q?kK5c5narDH{*Id~a3aw)R>qG&D>}YWVa7e~Ns4!5%D$K-z zCLFFeUT`zWfH}>MPU_rS4Li{sh5Nu^UWh@(b4Q7WVy*0kFuM?}-S03pN0)$D+?MJR zmzL=fZnF>XhA-1Q;!Q2&b&E)bYnk{dBm11l6Ly~#bdfyeRL>Og{9_h%9{ZJlFx*VU z^+`}|ORdkhLdcZ|7_g6zJ&bXopX7cQ6DRL0@!r$-Lq21*dy1a_ldJt3(Uf_*05}^E zit#7wxPW~gA@|fa!HrT&n_Ji-{y`}Z_Da8a$71Z4J5jY3(AVoKQL8Ue620}zaz-~W zR;YsBSZY2IWT{Y9^6(qg;B*}D8{0bC_x&9UtUn+#KXrtN0sHQ56BrKZ^yCboIeZ7d z00vCV|Uyk;{j-%L*(BwuVe<#)n35Ew(Ng3&Fa&_El zuFq)-Cxn2c z_*-mv(GK%J1ciTz4ebx0(Gz|BArQe-Ka_{)Q0TyqZ3dhP*=KJk#(v%3AB3LWjhd4S zMwTamk_90e$GJ2-(tQcHf;UvDumk=;)pr8rM@6*|w7zH;xo^bJzh3xhqMFbE@Z;%F z;%R@lE3cB7SQ-EsW+LPFB*cByA7@%2r~9-~C;Rdcey_{C*Jd3XISj>@eB`snJV?;FQWq>=BpHn z4PzZr9fBQ@p!NQ$p{a{Gt=fl=3+kUq@&8@J#9Iugum3FJe^m*n%KV>N&-%!2sa`>3 z(7Q!xu?nM{Jg>W}#UWmZKQxLaRsTwg%eO5e%-qs_Y{6xbTT2`r`R9TV8xI&%dTL?B(0|QAs*LuBdj+yOwist zF>1C^(`f>p1l+#3Cg^{cxNoQ)(9latY;0$Sja3QuqWy|iK>67Xm>75ro!Ly3!t1me z#M=#NaIL3@R*})Rb(W4{AZaIvowI;!b_AYAI?dIi?lZ$?Q9N_W@Ym94bD^+}eEf}d z{%Ldj@1^;8o45vq!u{v!R0l&4e=N+u0CK&$*54)x04g?2^#FR#qGxFlu@Dq;J$qc3 zy9KR3TU=P;78zGyw*izH1=T6TCekARMV1wYLw%{vUA;g_>2n$mI1Y%sVUL()zlLG` z?QYG?^y*%q^A%PfTW&jqsDvm%5MC4KETNoy&ZCXnPF-$}nxh$5-rSa>+B7;^Vd*5U zTb81;7kSjwV5^!QPps*sn9C>LK5`4kq2uFQPsMTWj>jT`P)^!X+?tDkmK-W-BdUZr zURIK!zNS^&+>#BTYi%*H9B7@lwHSR|OXggjsvx4jaAPEEq?L=ugk=$7o#mMYD4a=e zke--@G{4}`6}kfbkrkm)B{q#fuO_2u3#DvfnY>uk2CJ?O z?a0AlpCJQa5jOFAFItnSwAk-&LzT8tyz9L3kUt|7_U0^Vz{5?j@LFPC@~K(2C~Uf> zXBSupkC*`rg9%qpOg>~SSwziBxQdKk4YXwjP zuzAr7ZUqtt{R8E2ST?z--Zc%%TX%J;%uNR-rDZrQDdj(#JF%UxoJU^U_gs)v zY;uj@7Tw-V?aZ{Pwh0r?-uvo{F!M+LSa>MAnhN6vW3&WmHPxi#aULGC`%r3Rs)5XBaQ2~+|kWh1Z?41{Op*-QJ@ zJ4?VHO$cG5(M@S+i3T9(@tZMZ2C4DmmZGxU){#4ScI>BnRaD4Y>)+HQ;8<(Y*=EvA z{9J5Y9IpB9HjXL8oj>El_AJT<GN^?0zZSo|^)q7f6j8O##VbW50KkwQhsHaDASxryFS*jWlvZD#?Ss1c+O{-%dE*SzD0h#mZdLeM&g(xDZ4Gb2u1 z;9tx*vW=baB#fWgqsKD-2%0tUH24KDSa5_X5Q}JbeY^6(J>?X6W7#QAJTbeBf58UE zCfMT`{lJF}l!=5G2*HPSR^UQyGHepw-hPt`yXcG`S;!ZY7!eTw%vWrsMCs%wSFOdo zVuWHT3U*n?{|rD?>_NLA)+yA3E?>=BU-*)3M72Tj2&*X#Rjvb9y(jcUVa_Jn7%E?y zE>xP^s@aZFmr{V|vp%JwP8S=pai|VtzsIMmzFpM|DI<;_Zx=E~%PbQLeGON4ZqI0G zLMIFszJblOkZaE7^QB4E$Y}HXEEx*e&M^ z0Z!t^_0--|&6b9~I!pTqS2#aK&Y7!Gm9%tEqcBYfma5u->c)H?Zi~dfqlX4qX@8f%o`Wc z&YVY*a~`4F9qZ{1ycex3k-@sYZUdJACjh3DUeYU+Ad1rjV*uo+i9!lKhCLYZn}-kv zd|e{>p~3P(u^U!UsWBcxN^1FO)xlff8M}6w_SxItUT0rYikgZK2gTq={^kGlI@7lO zJ9hbN-~S7?_=O^%0prJ|K48lrrDf~g=)9%?QU>qupMG2ATltDq%GC5B&_Xk|EqN8K z#}q3yTcqw6kPw+Y0e^Ky)Y{?$O*QoFRFRluNmJjK*yzNCLbFecL5PT^$k=@QsMkNU z?6^p+6;nOG%Y)-7Pi1rw?3OrrSBi7(^%yk_2eTcvUYUdgx4}mcEaB&ooH2L_paGUz z`?98J(pY_YxMRdrh(po(KNl&^oS~U{{FN8X68tvGTK;5UihmVK#)d*0`^71qv8^Zv z0b^TwDwlPc;pv51&Cgd+#2-_A74b_UQvU{U2yeP6vPA(MH=S&Ow&{i5{R+{)rkA%O z7g@jPbi&U9^hwsGUX0;5qL5m380?{dcE(cU7psS0Yl&<=55-{c<|2ZKx_o*8kb)(G zOhn{FcHR+(*KU(^KV;xz`k2tR&z2aePG*e{G9^W-xF?;B)LOxxvGR6V~@wv&d9=vL+JRw_~fG z@mRIh^jZ?yLzqDNiK8vy_5f)zZm)w^mF0h7c|CZX!_ogQu#u={jV8(da*^@XyzquaFGDUGl6`3(4fkd7vUtS_R%w$Gp)*?2U zndK0&n+6W9$vY0~Ry5JBM>BtQUYPI(@;!Fc2LQ5|$(!ld3`L4%aiU*edtQ0=cA}7b z_qc)R0<6Myfma4n@0NqThXfer6hNw!sv5AeGWxXj*XU0g`Vj z?{w!?73nVjh0-UD;9>;gugI@KM@D33Ew9rr4@cIUlCR2Q__k>RVw3(ENj2a1p^E+C za&hH?XKdX^0j3%wNf*pvjyqdoVO1h(?{R0YLHnT&m2wvyz_d2u)S}OH&#f%Y`q@*zF>V`u?;$pYkgCsX5 zZ1-W0^qcVM<9pzqaN?(jU#+#zDDP`h7j(qgT$#&u%Nk5;68@CnxmpR^%+($`f3h=d z4CG_J+bZ`T8JQE9li_odVww9aLYRet;B|!-n~F&jUy=iqM7_hXu3nYVZFu%LS|_fN zRuQA~G{zTX5b46+r>6?78$qVu6dOhy((sIu9wi3pNu#S2vrQgudlhY1o@&yf~}Bg&1yV1CsUD;cYfG!hB*C%VubyVHa!qQi68e!(*a7_iXiN=oXsny zjf1-AAQm9=7B0P%O5jLH# zL#C)D9^8fByM2vhBnL5+wkH8*@qF38(!W1SM_EUtih(vIo2&<@tAh^6Ocv2zoY@sS zII+1^6FoRiJ8;O;^8;<2N{Zz&hv#Oq45@LhhG?nE%3ndrVSp0X9%a@)BLVd};Gpq! zJqX~_tfiug-ZKN zc{_c4+o}Suv+FN;@pbUxBl&}3INVJtoq>0TYkAC`=S4V17X>Aye1ofyks)GG#j8i6 zrA7GG_4=KE9o>^tvx6g?^Oo6tkGq(0)B+g9PYUWA5y4H&8>gB0)9qop*xqt4swc%E z<8o+}dh**M=RBN0AFs9r>yuIRv-5}dvs@kXog{I!lg#qED8W8p&3~8FZ^HE~6jjH0 zsG{JQR!m-$&L{L&DZyJ5Bo)@y8?R1w+dk6aa)|6rsuw{&q~$AXg}jzHAOB@sRw1zV zV&-cVmm{I#&S$XusU)iulBnvlRUg*%-ltYDvv6OLI?N`q4sWS--^^G-wc!~yvSPIf zVxfM{LbPu(oT^R11eP44%UIPOC@Y{xS$CAvEz?1g77(eMHmQ(5v~3m?$Ke|$`-YYQ zQ5?7f!UYdvtg-*)I|UW8?GaiI)h}Nl9S4@5kPhh3IcY z!C9K`8dgy!nvQc6-NdBx9V>A2yIWT%J+cMxhZ~pQX!)xk*9+66W>-BXQJMvcF!EOb z4CPneZ!>QQW2w-0EcqLWyo|$;v1v6;2NVJKX>Rbn=t7X9@&p9R$O&+G8b?4_lz{wR z3u?H14!HdZxXnNa5By4FPFc}S-aLDPa%4aeRT{F&eXYG|LNJ;poEfGQfU~_WtkT9e zJi+M~WJwU@m7!mVPM4=EA#`HS_0Q1GeGI2st+AWr<4<2=p0yc{xCEc?f;mt6?NP*m zs6BdM#cUiah@}MA{-nN%1LVMz@dt6@4_)x z(U!dUl36IU{0=Z{(sXX4;wgP+^t~-HSdEhrE8>nfI1yfwF%K^ctEWO<@f8f>7Z?`k zRiftR@D)mi;zh5^dI5G1PXm^UJ(#OE3;&v$jG2MX9sJSnA2I*g^UY%ZpL@QtiMz9s zvw_)vM0vI=$=acP5K>CQ3EqNA9VK^NLHIrS3DmY+3iA0<3WAbBP4xiR8b|xKl2gPw zf%4$DPrm4et^sk{ob>!-?k}bTlNrf+o#%v~+6E2$`FgA~DwQ96TdN+C;;W4+NeiiW zhpvlwgQa$YGM(gs#GczVRs8X_slruR{MC|6qP0!wsvE}O-h8KeSCgC(+}jX{!gj?A zni{9fw;l~~tAS$ZNIie_>-yOxLFZ!i(=FT_fR(Vt=&4Nft@gop|%)@0jf|t8M=oE%}IRPWrNV@2HoMk{++DP(q7^Q1=e$Ca zh*!Az&Nz}F_nRw;sv?-2{1-L&Q&h3S7#&^=A6lV6vja9QPUKhN8|mpvhnv5x%ZPpj zJ$fJL3E%HLcpqw400Ypu<`*IfR8mlyQ-< z{AFTi8QCb9SS;usU^@I6HfMsYF0=b2soA~<`LlvMaa}v@d0+RAJr9o3e8TUpfRcuw zoo&tEGG(@JW2&F-{~=jd6oe`(366fb5#$%@4~JvFfSFsc+zKC0VUE-c464`(2u1nX zUTi_!Ww76I;~fKLa;W~!m>D7Tpg zoe|}ihU{*Aur4^8mXIN4O&3XX7-d-YuD?SC6W&QBGW^wZ;N|2898{wYMeiqA-h8U% zYjwA@uU6!OKa+oXaYs%O123W>&YqO?YPUU}%e{H33!R8poTi3CqZF2QPUEU^G`-d( z49wJ?xOAQfBTb-mShrZXR~61p&nL@z4@@CO3M)vs9FmZ!SQjbmo2dX``4AQvpZrWh zGy$*UTtgx^;#O6-laN%@?Rme+sY=}uscYT&B1>!CMQ%0QmIGT-C~{@Mw5nnmyutp$ z+OV{+eZe2qwEj1&y_x^-$Eg1*=3nIEKXB!W6PgP4dwRiPgMqYk6K0sIkgO6Bx=@#D zowA>>mJ~c45lreH>mT+dy4F-(WQGky^!U+Oq^E;}RQ+#6Bb*&WoVmc5Z8t!|>0XaX zT;H(u#FEqFYsdAUyOr1N^UO1_#qd&MWumMsMNwoGAOdCZxbql6CXQsXQZ*SzQ$80j zinM(&5)aeQm8;1y_1@LUrO13dNiRpVi1d-Ew6Dkep8j}|{LCywl+U$j0jcw6V+X|$ zjo2m2E+THOj1VN_0mRDiPq?5bCL6_{`K+WkD};ok4ak^+D)Oa<#7EdYj{MsP#fxvS z;v9%{z<%VNLs&DAfks|)t9?f~=u4x7DE3brOikWw#Gj$I{KFRKF@`+ov?l7T0@dQR z;$C&3$O%M5Q>sPgT~fOM#LS^0v3Q%wU47~`| zaJmp(tYZr**&iPl2^Z6a23ToTM`Nhdud2cQ1(prXVC0!{COXJx(qkNrY8no;5{7)?6VWT#88XEgDOpLvILXf zhw60B{g*+I)l`A=fNKiEtVP&01!*h^Q{x6Xq?U?x?;ZZagjg~i>9(?1qkE;r&CC}N z(8f32EU_M=R=Ar4(uT_~P3POz9>%6S`t_!8nq}KSm9l!PpnJ7b;YILQ5}dY*EyNQN zH4gE>G)>-q91>Aux)k_8w)+s;h5id0ltRxb33@4A@5G6oa+~o0_$s77aGuIHh5{ls zUpRIrL&L8njCM=<1jwe4iVg-p?HcBIKaoUQIgV^rF=BqdKxw_q22$wU37Lb%UsJlZ(2yEba4Z~#7`6fcrRyoSR5kMO;a{)^NfvmVWg;0WzCe)GsLCczJP9{ z%seJfx+Ur2i32KJ+KWe%#-5Zifu~xC~YlT44(B*)hiD}_6=6N znf8Munk|t%kM>!V6f%yx&_gTG&V3yH#_ajt$KF4eTQ9e$mFauuJeFIF!-fe*@UmVV zd_vZ>{MpA`RaqM4Iv^UtjQ=wZpl%2sex1D9Gb_7?peOn^$C5>>VO0{I4^-8qy0<67F^RPG9Xv&a2QO9z)yq5z@jDW0VjRv}OdgGojNm6e`DOe+rdt1}cxb|8XdV zThPDXDTypsPCxhsXB)(20`Z9vs(v(U+qr;s1(T2-{rp-cLhYG}_M%v)+r%?40YFR^ z)7d3T6aP8~vmuK=2&+8v71%BqbAqwuBHv&@3l%`|?9hT+74uem-zy=nC3>Bv887C4 zWgB?r2@|i-%Ik?Hb%QC)Ay3#IKrU`;xP(aCN%1-6hLA#YgX9$`T$zbg75%WDC<#?tfGbA zLJiTyg;HR=yanZ9DYq75lpf{KZOS%QJ*u^NgP-zWM5n#s);|nDYwr8aO9n9)7eW3` zah6?Vbq|9=7cw256`fWLyqbHC`wAJij&52ie$nOyr{i8I|9xoTeR_XDyUI} zp|5Z4=L>_W6F2d7gm8 z+EcM>kba%cqkfRi6B2d7G!9Lb9df(hF3}{oP$+(hV}dQu3t>@%k{OE{sq`$Wf|%bW z<}G@=ckCr!#^-s7t4g7bw`G2>)f6*xIAMy}1HFRIw znkwVaFd}tpx_ZSR2o1sC^YU;H!qqTR=F}bN981#b+O7_60aL&&8G#iB->GC0zH_v@%&yf9dH&Q@=UVKy5;YW1hL43sF|0XbR%V z6qK-_X?jf)m_)obn<^b01s%f~B7$(#qEHj?Ef$#V(kM&p&KasoTm<1wii{>6V=fNe zD-@L~CPb9Hcf4xKsR*C5cqxRM&M5{4ve4XoL7ddt*41~&+?0>U+k)Yj+T!G=aPLbr zm~2J3_bfPe!AxFT!R7CU#mJ;^K>foL0&jBIM270WqU)heT&~#tEqjCYvMCi3v0b8A zf)Y3#%z_Y1L$>2PQ$maP#w;Q}nU1?$$a;V+&y>`MJi(06nH=hWd}%J=Af+7}@m&HA zrOUn~0jrf%u%8R`d`r^dm1Dd_anCx^22WxtV5VNS&gF)r7>10fQF?$aG`zi|8Ikn0 zI4QN^Mc zrvtTJ?-N-I{NE!eXZWVU9Dt2)C>h#^A~ipn#qNPTm-BB zK^hGTO)0P0BjzLT8K&uu6)im`I3(|d>4=(W--rQ)@f9)~#A6^x zhh$5+hF8ud-V*F~uLRC=kcNs!np&h|ujeE128u&{Z*AgU_&Z*&pS2(WbzA`gpZsB) zt@L^GtGcLEbOd(~wf&{QoWx!a!-b6ylL+c3(Omi2 z_ioWN3@&2Ns}9|V+lsjAh|kjqVWvO{Rx?qSG5f}hgm1*Pj{7Rof%Ai2|8Z-Cg{B1P zrcd^NzqYH-e!dm6F?BU{@FwvxG0h;Z4aS^>32)m?nmeL*%2e8|D<=#r@qWb)*DWz7 z3WG*4{d2>hTTg{$%*@297Ou?s-TDvkBux0LhHTt3 zH39R*d%ok8hw2vfh|Yl|A8ymDe#f70nu^5{{G`>~FZr2QKrY zvvsnNtRV}32_h|>isC5(^8_LkJnUjqE-(f@Eujr1oxoZ%EukH3)lk}h!!Gm{_c%55 zpcAno-h-WSfK4RrFK+0k+q?l zTc+>O(4yfhu#b>ev$86kXIBu>I@sWt(_A?e;vljNngXkc(#r}&jwj&Q|_{$YH8aLqE(qW~7O-HpS!L5-Xt zMDrN^;z10#mA0z^CPjtIDH4T_58?sEXN9!|hv=z#TwR3-l<&wrGgLj2OE0e6jYBuJ z!thi@r=@Syl$;BpL}3*lb?P1i5gb#VF?!*x@%A$%Pb)EK8$u!)NiNBgE1k=Vo!65A zCU_?v@!bFmd)7GW>l_2(5dp-;+?QDx?Ia-X*~kl8yVrw8hIL;x)$Lm1K9xHAcTUHh zZxFIadvF_pVtE>*CSC}lHEpyq^{fU#1FlA3r8mxp&0=y<8T?Z2tn-h5O9xOZnhO64 zP+a}DTciJtX86DNeX@UY4T|FcFec;-p;eb|!ky1;LqZJf#A}>5XsD?EP~n%REhkmq z64)Db&>siV~tr&4Y`JxXE8f=-H z@w#HdC+0o1G!HaBX48aO0+wNAH^+;@z<9|M?7UYYq3ko6Il$uE%LnAuAez_MIrT~V zZ&Uf9-4!Za{hhfXx!bIefvhl{hBhho)}fWLo8X=OkDES+WFjKW?P52nPs7HNo{t?nl+3aji_Aegs~b&PlN zMYQ3;^QOwyGJ)U*(&c9vzf#mvqQok~0h8VsbA-K|b=I;P9v%X;W<8zFL~7*GQ*?GP zu(*^}f1OpFjubT#Hf_$`9MUhO`1xq|@r7QKOQoMR4z?+v1!X5?n(v_KxCj&bYKMq3 zb+^FRBh89w{n03|fgAqo+?%#6z!72P#HLP!urVBYq1Ug;Lb0Qge})k8Fkv2JMs2XX zsd$!)BT|V`q+ccuK8-0E1~%?s^K)-FF!1@bDRcL7&+@JWg+IlSml{1S%aDB!Mwze! zrl(ZAk)BxujD>d?dGWw0M+(u&A;#Z>8ZhAPXYs2;cQh>HOsltaTm^YE^!gq))Wn4NBoNfJkpcSl!79q;M?G_`!q zV}EpPq5SIie+YZW;7Y^v+dG|3I<{@QV>{{CNyoPB?2c{Qwr$(CZTqBW&iv2Job%RO zwZHAE{o%Q*_OtHmT5J8J)aEXY0@)<`mwyjXn|lAjHEc2C+Eq)O*u;SY%VW__my=1q z_NqwC`r!pSs#FHFDt1h62`uj1r;!ip272HQfF%%n$i9^=&5{=8o|tS0PsI|`$o89zll(+k0WKuG+`B!s7&fzR(3s{NdDeW z0LRjjtoG^#pLPBy@L+yT5@DWbxrxG5#SWoEltB_9L}tq`nKlu)Q9=Wd zHdBkSm;T|0C=9~YwfZ)51|o|FhJ>z?azqQs79RgGgIlAa!I5C59l&<9E;B3R-#Y07=0p z3sY|g@N>Qn;g#owX#z=F8RQ-+5XA=6&>>Z71`R*wDx=@U1VmZO<;IND6ew*H{qZi1 zd@Uwy!Y~z4o)$rhVg{ z=JHez5!VPPc>RMz-3^;occ;-!0FqWIH_Eg-6U4~OE;1C2@*RaICg%`IL^ta`wIm&N z2IC%yJf%#zYgG?vor54HEa+0!{0i5bKNyRZ=1Ll5@09u4QY#C}>DdeVv}au~kXCW6 zZ&Ic~;v+ci^N~^kK6Kz^s_c3~w|}fs(hv>UtmSN}09N`%CI?Ft zWXlIAYu((sd-cdGM4ZFtOZhvrXQ<>qdlK5Uml&*Vbjcou1{~o|H)prbqo$f=gn`|~ zbWFK{sb;-Z@n-ZG00}TgKC)+MY|M?xbN-$+`|FW(lrDVzzAix#Mx$8n;Dr@#G(za< zXTx2OLCi6Jq+F7F*waKJfPHy1*c}9nW;!T~)H4Ph?Bfp&V;5^thz_4hN*Brg-6u>e z*_Pd~7+fPEgBoKuk^a2U)B`og_zGSGN zn;bh^MNZooT!fDomnBcQ9g{f*g?QYQcwU2eoMiSn!_8kqxmg}9kvHIprAA+Lg90bC} z4$SuXXvAhUsyVAD*QWfZR8dFTT^N_h1@Pa17S;U6a53r+rc-K!eg|<4If7K1Fzct*KZB zFHS*kfReRb>ifjB-BQTdCu6Y&;g(q~W7A5M`)r!6QSWS?hj&fOuRgtkdXw0921;d8 zNKjOR=YiyX*%gLzS>)?5q7Ws5EBRz{j9w1!LIaxkG6ki!pu{J|1H@T>b%eoUy?`VN zdVt?BIGoT6z(G6roaub7r5*_G23kSvYmtd`+!8App>AGhL!UQDiA5CM;o`7k5T;kh zn;>mAEyvDK$!f2Zfx8MV(O_3kAepz439@&nO9DY6tY|ZmvNs4vNOgM~NO%CA7Nc;4 z%%Gxk(U%8OA{Z9y`Z5091vZV~lPJa+@)GKbx{`MbFl$yZ;;1sO6;$H?$lshQOtvT^u>w*sk+QloTy9+$h4Chxr>#Nr%-|t2F`C)0EQC#K`n-q zmj^=e^i_{`ue~(aSqGZH4t$F`wMEzgs5sFghme%fS>Q=a>cU!sLcFR_zaw7@MZBWn z`NQZ9cxNMnbGNzZ0Z~5h_J6JFApJCwtfW8}FfMf07w*<-yY42?SZGGm3`GJbp4z=A z9g@k?7B5U2eI&@}N?o_M@8tG&ZrRlTB(7>N=#u;NP7yFm6CQyhySg@)P1$Q5@apt) z&TQPwRFjM9y1z&lTv|SEYkMYG%jimXw{->vJgy)HRz*5t7s*jVlH5HOp^RAl=m|9pJN|LN|HBsR;HCvSpAF1vjy}pO?azK*Nw41AuEPhdzScV%9#s`2 zOcT&)^$#ppv@SIvTY`qHXuA{}&;?!26kBFB8*a5~D9fdAC+x0%7ihF?2!|b0JDyMp zz_p5oAz4K#yY>L|CuC=VFjdm~=2oL5{A{fFf&H+-NbBbIqoh8&>*pWdn96UBB(9Zz z{CT%0_tqnL-uy8ki;IB)y_*n$heI^c`)#fn)*s!h_Oe%mZIC4kR7+odi70g)ez2gN z$X| zryw9v9jW*#X8Q*K2OlmdwCgLh%TKtYtGEB$E3gYCiX8sQ4$bt@I7afgXwV7Jlt`~B zMOC6PK<%j2&0B4;0N?mE%(|R0ZhvIKsk_-8reZ-C;^GSGx>g}PVW%Q{F|xL&7ZQc- zsuwckEG{Uy+X|cwu5u&2ugShxf{{x(hEj_jKU(G6*}p^)fkt-qjGqRW{EFN*u*s$Q zg?#>FDny9y3SL(#f!=(oN=lW<(V^>JlQ!idSR@zC=oj0L-yMQ9@T%_&T zj9o4_0H2+&pP!zQyq*Wtf97)lQ{L2LvQg!PV9mh7ul3)?k*0jOGY%@=TP6{Q)^$K& z%wxNt3rmUcT!&P)WaWUAvc}O)9)(^4TE1uV%S7VNNsZ6E<91p_&+DHcypka^d%E?_ zBF#&77Gro1b&1O;8IT{D&;Mv7LE}_j0D|Hy{~927U9E<%*Gc_8?yMp~USeFs+IL?Wn?TQW)(sS3nA*mVPi zQl##K0j?GBY)?SZ+ArR%9FIp@7z?7U8cLoxGs70O3Z+u01`h?r=J%}PFavpOp|B}u z3~!>YJ|6dtU0`^I5Ec2h{Re9wGNGiX>!){f?60i#l+Dc?)pkoaK;&J@b>&dsMjiw# z^&liDl~UQxc7OP+PZA%4emhY~svu2D@qO&d-j0PaZS=pgd8lmOqaB!)jgCMJHD|m? zUbZ~vhx$)ZKwA+&PIKv@IV-#Ti?mQsl8~^Xe9$xC)rhLg2YUy`^~$WR?HBTnIhl@d z7rAXj+n|@~!+~;d0#DxgS2a&DQMU_13Eh|cx{u1AO^Q(@?;CEf;GTc}tD4XMp_&N= zWl|kFzf`k-{vIL6(r;~rc`cd0qFIHcHi!(2U9~s9XULpJ^$#hK6 z1dc~V8GHleHi|FRe2eJ#k5)by4>JZq>N*5m@0IWWP|fSWr;HBGlooxZ>M`7KlZVM0 zBa9`lXuq>T5!RXN{@BWDN0D#AI_!YfJf5T2$k-q&D8~o{^MI<2FvzfR*ui20mI5(q zh@X^>j*Ki%Vz8i1+-$GKceGG`Jk)lJ7?P-`ICahFr^v?+MX%4SEzp93D*1KA#*H$r zW91B-1Z$*_^TwJ-Sq>;7e4Ff;DK+t zac_@>uWCN;)PevhH7S`z04JleVWLX$?mQxMB}QlhNMw2#r(zpyrSWErIuX$_@)!4`)y!FqmnKu zk7e65)}5qNZumPxjbYTACFS)RdT=le{~a zDwM2pCHLSrZAeiE5LJ$OwUO)}wAH|$1XpwFtkT!I{PH+Q`JW)II$kOPw*j(LRVDc&jz3A_f!Nhh~1BfxGns{_)l zn@SG2lrtxWka~*inxL{7Bv;?=V)qakxU2-62>=Mo|D4ziQ-Xj)`xCA+eA6zxbn{bcCtVREWzeFJ9pD%1Zy@pKi@?%m8L zY_RC}#^kA-i!j$H`r7JHtNAi9GlPC(>J1x?lYAN6Z&A9aGrj35j7Vtn8sC0n=;5p{ zKOSx8Fp9zq2%c{lKY}omFNgP^g#KhTfGpe-B4b!C5$zFD5?M>Y_8_ZbqV+DY+QHji zFr2KjCrt|m0YPYXi;?J7RG?BdPT9TCFfUyG+?!*z8>UI$2}2!djM21mQnQV(b1B%snu zR%;sWkPr^Ja`q-c(wHVoD&{cS-^skW-R)F-!v&D{00ye1w_#N??Y2zcRJQT){f2hV zjpN1u;IMu#4l=novT6m6<~-6FcO6;0_vaoZ4Im0@(Ht~Ka7WQK1F}VQm>C=c`snAY z?{zG@l!XV5`IjRIh2vlA9l2BAzD(}kkxLA5V1ke#L*4X)I_a*w$0U9eg}#}HyWgWM9x6!wGU0~+gjj0~zvJaSER&6U}IwZDobwPjSkjW_}{Gkoa-S3&d%y1`h z9A|$@A*Ao3do2-S9lCAUUs?0jO4js~tm30SzIl!HaBPu?kA1o`jHnf|0sv7M|0VEiavCo6euolDFRwj74o^L3&mbijlf(aO5;R7 z>0SlHGefAV;BfiQ3n8)*F^R^WMu{{j_D{JPhF^YgfGV(oSZNA(KHjDDnl zxw3!r0dhsmeHmIb%wuT#NyqXC z`o^rgE?n^r^V!wuzvnoM#(EHHvC;-7`oxPTDjXsE+BmSoNp#tmS0j_j9((>n8DvN1sg6tvS@f-_pFU@`8)AOU! z-sP-Z5boP=krEt=B>bone3)auv-1_RO%H0QzT(0h5xJgM)>KO>+deEmBPaBKrPCTjybK@yk74e`)Q zOVc!bg=qIXph%qs3}$_?AKPfh!pkT z`^wxIBFszcfHFt1^5qYx*l6cpAe^ZB!F<6!`Pk!4IvNq8HdW=U0ZjTTxn@P}(3V#_ zd;G0|J}rw%g%9!UY{t|oRlrowE{cunr@Qu)H0Vk#zuzXJCTW_RDeuG&Fi!U0CF61= zb>e;Iw?JZ*j3+%Dlu!&I6^v;?$W9 zRkxWC)WvTQy6#o3!rd5WY~KC*@m)<{7w^pnilOC}=7bB7881H8f`C zOMY}4yfvZ18Vr{?(_5O?cWhuK&ivZzY$y$prYnovJ@^)wM0?4~UG#Y_SAKvNAEU#3 z>E*%=q3L>rlLkTPwz7bnk8GGK2I0sCS=NA`D?n(vo2^P8i*zV%OD-!r)?OiSO~-eD zEb%AAS~=gKQ$-U&@-S*2=!lSkMF z$qdLKUDb3g%=7v`q#b{vFxyUJW$2$Rd3$-MLptd?Tj=5K#qC^TN5d1Vg%Qy3%|>0u z*a5V-*ZiW-t0i4v__yZ}4JK8|J(mI=?Z#~K+#DOt3Np^m(qp<`Q9OVa5r48ps>eZ? z4>+YZrQuF~3VP`68@a`E@ldxP5cRf`_~_#fz(9Ug>e#NwsQZS`-Jx# zg!xSF*!vaB6|dasJi@mITyu^Uxp``JqvdI-mZ_w-)QagVm}`Vx_Mw4x5Rbkl>T^*F zIJ<=7xuOGW6IlFGo5`v!4R{}jGCpLz$rWHan}Qa6G?_`$ROM*6r{N9xRa^4Dr5u~b&;!(Ai>pQd7ef-?J;&p3YhxCgv`fR||c zh3etd&XoQDHiUp2L-z*22ZH=S_JG!E2sR=8%r;9iROWjfA4{5Y?4JPf6o!H`H4g z<6SZZh#`WE&3jc*UBZya9vb8q9o5#v&h|lQ&7glNc=#p=WWr<+;!UJw!5RQ@i*!eP zZA{dD37(;R#pzlsY4862O{#*cbn9`(Sz+A^uJn~lcRzW4zv~+7n~MKQaFblT2Ko!C1>NTPk@{_r| z7czlf0oFv%cuF?~slb6@n+f31>j@81tD6@BX}mS6+4%Xc%`Y(wMD?iNwuwnbZ>1h! ztIZU%D64(PLArEBDwtHWe{b(S1O+m$LmoxOO)MkOmcPZsuf^7+@Zc)aN)X=ToBrr1 z9!*RNKe6A&Myit{aQqWx$;ZolHbP~1ph5uSK$tATTFP!3pFH-|85vNQzk2mpila3y z?KC29LMXLU($6hqUsM?>g*nCb(|Vq?OUH~QMRF*Vr5cx}A-p~*q2_$WBt(E+9#8e? zG^uPQA7TUtS@^Nl3^S*kL5gf|(Y)KMb2`@8O(i4VTXnkaBq3qIBvM0&@ypVlbYp<( z_B4KdhLsh)C}MRLYXyJ}=zK-Kp&_Y{;SL=2D8HCJ5p2i#S^%97luMLvmbV`@) z^*VPu>P`seT+G|)A+_l0I?LpdkoxOx7)lHQjwH>&>X;8VzX5Dib9twO{&;wys5Iaa zPh114Q|M;-*w?C3X36;BS1&^PeYZ0qwhb>gKI~5!huB1#2CC|UFz`-=XY6Y~Q?o)LQaAbGNK>u>Pb}}+P-Pfe^^Lu`2ZQa$hjgSG zTrUy^@}Od_;TZTNAqMxalB3TgxOu1Hd3P{XQW^yJ-)u^?(IxW_Louc;hDMtFk zbJFwUtO^SZwX6@Pzo{F+WAcC1pWM3C^LdqTZX%svtpZ|t;l~#{Z7tQP2M1`vHscou zjJU}aV&!-B@ffX{ZrT-u-uR{r)4~T_QxB=p0hwrZ{`9OAvk)udN$f1-tr?(Us#OG_ zTLY}3AKF-x@~#;ohu$Wnfbw0jZoeYH=5MkJ`t|aH5+n%J|Bs>w_cb{AvYVh9rD|lKU*qt8awMgcEUB&fC z30NI{(-SR8S}80(_g4K{MoZoXY}~Gfhxeo3=zsvuFj~<_M&>XrvGijNSDkRsh!>25EKU+=Hl>U#G8HWS5Z~|W30WxbrWspl2dryW*E7rwB_Sv4M-fCkY_m%Sg zcDUUO`i^S6NB`?TV$;dA-mutxf*uU;(gh#y@~N{<$jQ>`=#l5bDZ8Ti7R~~jA`$p4QtB*m^U#vH5frF_o)ce;c zxU8^S&EVB&l6rK%^Z*8Hm-H62LGg5AekN{q) zP~VGstRl+It8f>yF&pXUaGF3Kvru1U0|mpb$xm#drPv}+)A~rcB9+?)sz9A&R==eti!h)(saJRe~^DacPJ z#zat!|7nf?Zbs7DOQhI^(2fa-A`d{ANxBrHEC5X-)9OX4i$W#vHARUEMYVUxB+emG z?Ad;XHcCbJp)k6(pzwnp?glzY#^^e*z|id4PM0V&VK3LoV7~k9cggI)Se^%!eCg=G z9WReDV~Ucy>7T|bM=o0@mvt^>0Kt?lP}-Fa42G83L+woj9GM8E<_X#VMg_3hfyo=2 z93L;&0pSQ2u7dcGFb6?p#29Fd!ayJ%@=BRi9Wa4!vj$$4u3aJ|K)%c!r&-c0gI3D0 zOk`$>5n-*0`Kh`R5`yM8yo@T9{h5c(|JX$6{0Q(9$;h3)hE-#omN zG!RfS!GB$@65%QTe+KOTlR*9=>wS&bKXG*0tC}fQr-BN`3*dplo4?3!-gd{|y8-iUFS_bN`ggE0}$(Tqqb;#0z>S2H^5H`58Z7so7E>FbI&;(@^U%nu%eEyB zK`((;OkMIRM}90I?V*1SVkY)2JNz-H!E%x>18HGya@KBJ8_TKK1jGEJA$7^y9ke7A zLeBIr5^%zEhk7|~ZcT`theFm4Z~|&5wbu9k6!+&CWLP6)0&2hx!}3h-yCbms;)DCh zZT@_;opFL`LF&{TB)09pQf)udjY2Qd|#pHxhJ|6g*BR%^RpsiBhrpoe~Z|aaHlSe)q7tuM0jr^>?_` zC4Xh_^hRA@K7YFNyP))8hK@*ktM`$VZnn+BcflftSHL(hvXwZG6lB%{Cw$b z-0w2rXR533GmqT7RUGGcfGDnLqC#~B=rgpX_KmG$qR__394N53RyPngtc7W=5S_KT z!c4~LP#zBBX_<91r7Orjg+L2ZWCAsgw=ci7C1d9{?NEw%0bh9fp zOnrXCd~06H)*~+nReE4R|-3|D& zS)Tia!Pqk98LP&U5K%3Y}v^azS@0V0B>DaSNN8H>wVD@+Jjqv_vC)n z`_`VCVm0#GmpRv%VC#~d&!jupSMH8{tlbse1;+dFl`TpvCnKa@>|cU@;q?+gU^gLZ zPo1to<(J8pBW8TR@Ons+?Wt5T6HVra+E{Xvnko8bSZ;}}btVrtxF0puB+c}-eafPl zUvxb{VsJSvEG+#;2!x6G_4Qx8UPI~_eB+5bS4)25uN;y&s7O`=Rt;Bus^s9jr&~=4*cvyvaE6Tg2rkOO^ni8@P+Uhu#5Lgw>NtA z?HRmQQX@8TwvOLNwN~n0+N*dAX)3NXlsW+%Y4@xmRZIIy@VR2?60bP%evj*1fw=NO zV+U3$;m~dBJn7JH;`pv$b_;#NZz5Y4bAFOiG@GbTTc1Ve{ta>#YI9gbUlrbeP8HSJ z7@{KgcSeoQH@d=(Y=cV*g)#6aF42*I>2mXGV^4@;#4ysXnS`JXerT4|$|eCTePz3I0`k0m^;NMvw6erkQcqs)2KK5X$({|nfwJnD^K zd!n4!zmLlZ%&vp#bj5XkY_3pW?n{{`6F zpIln@0F4~moegyD+lp>aB>&6T1H3ohG$L5XEW~^nl>}etVX!@yIUY0_PAha zz4!B9RK#FVqutEn747_y>1J_@DPF&etPnjTiAJ_X8b@e!S1(<=E{$Bd4!KGeDM|SO zDNq5ej5d|Yk3!L-C`uXNE~nJ+-XCuF0IxxBle3BnG$l~6<^Q48G3Wp31aOLW56(=$ z3F{v8nC$3=l>JN1WAfqF10(x>VLsw1)m(Y3grK0fMu!Uz^9FNGTuH}Jyt27iab`ES(Pt3}xk;HymSa7l;x%fW# z5jh&@lXuLKpgJt;9U3)U1k|r7c~%_w{S&EuecYj*hNt>rS?6znkcKDNrjqc${OS`f z)#0mwOzsONC5*)>{gtn|$u`oxqbz_E#_b7n1tw{cLe(g%uL};Qj~pgtN6YwJG{Js& z7Hfa;_EVy^D%Yhq!kdxd?f19oAjT&M6)cISx8k2x+s}+|X=F;BY<;c8UUKzuCgc7> z>Sq{o>ttHF0gLs5u{+O1{vC4lE`}9xg5n{jH2ri;TbyC}KQ9uWn7vB7{R0j&KmQT7 z9BSIl{qa@m3;4hIdUUD~|FOMC{ujXa-^a9xpCms}03g7}@-fJzp4Bw*dWdF?;VWvs zioZZhOuPLG782oDQzdE)Yq1_d11=|?oE-*cFw%~nmZv-STrMtHgphPVlc$%H*I(^2 z4%^o3FEX@0mpmc1xINOlfPU--QK0wG3*KOC?v-?p2ein$lQJdhx+t?cI!EZz$CgLv zf#li}1CY~vda6oPY37%gv{=h%zMMX~_9}DpEjAD(D?QiR3C89IJ%9 zkk5iuz*ZbbWt&T&p#pDPS1qUMsJ&s6N2_y`$P9N$){!IIl%PaKBhB2}F{%_1b1X4Xkj_Ow7U08yu8a+}cC^oHmi?9+9*EyYJLv0%)1uYlc+ zq;Q>n-C%_zqD|>lKrw0nrzkb!fZpfn&F3Pa+s0P8TDr{rn?r#Wg9qC4mGz0QG>5$KnTz% zc{#s)$by46;0xl2o=N$;tNklw)+5+_^{YFLS6yn$K5n;&{CBT@K&d-+OS7pZc>Nxy zz{oSlqQ+=J>Z@X@`-6HT4FP$TV{)paAe#co=*rcKKW%l0`KeKE6`oBv?5Rnr_lR%x z^2RzLYgov|NUQ>GlEaFyFK2`eVCTtaTaEZ}=P71;raNa&2&^Y5PY^we*7%Pa?@5+v zT!Iw7XW((5gcM1;^-Nhv5}h;4BQQ1VE%x==B)U7tE%5GS^vASu(|)f0o%A$kxLg`R z0mL2&E#I!@$@O+*9*fB2YZK0i>^nPs+$+Q}9!Fg7$Bt{J2n2`#CMoAHKupY*%n_AR z9W2!I%wpfMX7u@rKg7#+j9PP%%X!?C~ zCCCiUg~JeyDCig>;na=XPl8(BJ03hY-k4SX1GKfHNgNOz5IlWc{5JuEHv_tiGwK)l zM+y&qNo5mDgwZEz?06GJiu`tv?Tjsoj-F=Tf0%|SN*6F-zM}YL|6O>T`0XC*KmJty z;TQT>!{;;X|9zeDhWzn=+7a7T%vF#?(Y*qQsr%{)_w~w9%I5+=e)C5u)5nLReYGP} zpjbB%3;zE7H{qsZ-I>Mvhj+^B+BZX?Pd~EV<2>@@m@}3+pbGpU?Me6WX2RX`Al=#N zBG@AbtR%_W)+>L58lsNa7uCKOUctk z5KuL^2nbqhQfS`dD9b^>`-we9dvzv1pv71d&^R%Lyq5`YqC8CqlEZFQZhVG9bP9Qc zfWn|Fr8*B)z?y+n7paKdJD4XixgVAjf)&x;gEP5B+nXJ-)#p`T%;p`N7Z5c+9yWf3 z&m-3#j&;_A(@#-H^`zKu>d^o*O(K11ZeiK4t0?L#S!55q2CBrMNU7GpDGvV z#R%v%#Fo#f3qW&l_Rc2pBIA2?L2hR&&5{x3onW{-hY?wDYNC^=LR>S*-H5M7zpbk; z^vzjH#)0H99#TeleTeqaJ!nGe2bu`=z%@uJJ+W$hoPr>vpAp%ZY4_>H-~hhyD1r_{ z0Iae!Tfr0zHQ%=0im&)>y9si7ONwoOoG;^cHQKBAX}HWy*xLSv4wXSoIBbfYK9r<| ztxKODH(h7wTO$i-2lZ`u)l!;--am0#J*BEV|7`9&K?}S340NvSX_l!Iwj+1FFf{15 z2mwoj3|JcX*~b|5Sh0Z#ab2phkU`r(1YD%_d1^UxUzE|LuHN=U9Sr@SiJ zq}K^6JJ#}bF-I*=pOZ9^;Krp9$3kl?(U`-<98}Af8=ZydxlL81SkG=1e^Fn(x+=v{b0xj=vmo(o3Q0C1T& zct#*~*J`T(3@d&YphMdgr_77x;piqD?oF4PeTcLLVyf3Vi7;{J9HWe@PTvI=Wa>7I z;L4^HJ%quS}YPqfGKy<&AA?al3-UHy8QF$mDLL8D<` zpFM=8QYp3yYfTfcFy%rmaZ%#G1JD`QZ+2Jn)O1sw=CUP05z{`zs#ST+LSdd+v5BLyVXQe?}md;za$iM z-HV(O{Cs!3GYFlM@YAAZGDEgToKh0r#ni}Bm00EyzD=4Gy$nTsmnfQ>0jNi=gbKNe zdD7gIA*#zF4oejUPe?Hlx3Emd1^Kg1rvwSJ*xq4W`_W6D+mg=>AQbSvxDgMf5-*<< zn`@c~vWl26E6oMVg?+Ol_As&|ZmWnU+P3}`;a8~3j@Th$BNidZ^XZQW7%9ZbWh3+w zN))?9(YW88HX%I|LhR)C1W;o5&DO^((WNVdLU-8j-r?YnFu!!z4a)>TXpnKnuV7Nv zYl2THJDAqUn-e)Ic&nvS)@!XOora5-)699|pu3vqFPyrI;^s!+I?q8`sv@ElHIl@1 z;v;&+ykRk8nMe|U3XG#hSo1-AhS(g5QPAYXypxiMs;!t&ge1ym0m2t%^0P~xl&(S1%6(q?;?BDaired31vh&?B-hkv;BNzasRv+rQBkvRP^ zlCoQ%j>=Un-7ABx@~8gpT-+Jxv{s0ANS)ucUZbOsucLr`mV{>k!Yuf60b}h!Gd0fu zExV4YQkE475w^g%2hdY{7bY2UCs}?)@(w&qh9bK+l4bG;^K&hmNe6|kgHMJeLIfz{ z9=VrW`zeo0Tj&+%JEH}ZHdp-0Ci!nGc%Mg4r@*2d^rBz`V-;%bPz!JFQhHaRls2_J zs&9FSF8w}PJKoyxibr1jvJ8i4An}OT`Vej6(e}~oNr|X8cJjNRS5Sli_Wp(-63mV9 zp1z;u_lS=`V+{w2WQ(OJy&r6a*trW*af zTc;D@_5M$l$iKX)f8RC#QwbA4`qjvY93a!?V9~Br?rgK4V+9@58Uhs`B3u01c2{6W z5_@()OzNi@${j+>^|!SrMA|RDhxk~Ye4tvtlres6+U?=ZH5u_GUZpiq6>KQ%9l@2R zZLm_g?LW60a@If7ycT+V+i z-UhqIg=|IFp-vVe`e*?5s&&JWwtIH%hE_R3GV9GCYnl-iT1IVGC70@7J-`%lN?AEoE>C{tr2ej+MaE!V?47C1RVI=IA#(Tj zUOo__D8Wt=wV4rA1nFg1LIwtThxd$djrc(TI$gWh6;(bP#qc6rCHJb+*OyDb5HV<( zR{u___bi4bQ@@)=G26iWy|y62NQfQ`s`!rV?=gEa&~p@gW%%5{{(D0D8S(!<=Kn`o zjJge$3dTo-fvcsVXK_r4)M{Tq3gM_&yk7!`BRCs`*g8i9R;%=^e2+Ls!lKrBODol& z*|ERGXg*(aoE?;ZGHma;{{)+~I9S2hm7>-*iq^J2nu|ABz$dR-r3zXjh7qwyEl2C& z+u`TO>N8+s+4GRM^MmG(`&BNnUXc0GOf+93U-nj<{f4;Xv>olC_)J2@_NZP3xu@!t zeZ}2erh+Zh%xFAifVu|-nn=7U{f+*z{CnTMs$_Rvsph$%`w)s*L0oz!O& z9~Wawln|Wy6cv4wMHvSBXq7~>{j;HbOdstL=2w>DPM;4ye}JmPbbq4!r9dAmflnYo z<-LTDgOOvMi)UKmV?B?^e;s%@r>^vi!>M`&@^D7%SsTG5@raUOpli6H$_iDWJ#SOm zCAF%6OW&4XJ79*`h(A$lwP*|W5UrN`o5_5|NYhxUrGo;(65mH;mNW*vrz+s_*oF53 z*#*!Ru8TG$K9iYv%A?wdLX5J}l}3RQ>Z*1&(R`(EGir1`6SAB%nWO#w>>^(xz2O#{vPM zUbBR{;D1uXz%Q=G;L7QK~C4gf$Xs2lYRtEJmV^#LNAG_SWZ zH3ACHHd_Ld1&O=0r)T5TvW7C3_2qNOd8%QvjvMLpe4f;v5j`@)C4rJtXuzR_bGyZU zLU>Qe;SxI$@(A~@$yg^x=@(+blNMiTjPS9R8dJRBqrtbtT zV3-(tIr@gQNqCV0>Wybsx(${_nIoIy12NMr)1;IY7|gm1vIp^38HTcd3@4)ELR`CY zX}M}I^9ab^0?KmwY=rsAn$m=A)eai$j6#w8PbtfN_9`jT>E2<>ASR zvQ*^S&)pkScZN2pzF~B~lNMu7XtE?yxQaNPyzRbCl1yW(~QRrE&fc>Uu92pN&=Air{ zA!+z|JBQ?t2#ghhb$%=RBN?l{Ax=w;0AHP+h+p^H_IlveJ7$Ex|COyi(hqG%OU z?l0yBgOL!&j$C5xZc<1ZF4$&IMIhuBx?wA=HTtPbox#yi9X8VMMKLHS4R!Rkia z9ZG3opcu0!%9kn(ISzPA99eHP%0I0|nuVn&a)%0Y*$hjwBlEV{mfu{BpzKN@ZY+J? z)?uS|%kc-X2);s);|4>|_$|X{OO9N95C(NFAm=zG1-wF2F$8KccU*!i88Ekl+>`$G zcWnY3=xmQRfARo^gKFJx(KGjj;9;meCj8x2y*86};I|n2R^rWA`pybZWqpTNt|wx< z{#jwtOl&QM6lDNX(a##+T+_Cq5u){#bZ)7OxA?W^RoIKX)HSi$mQ}k$sPK!t#`R~y z4&)~LfUy1M*NvX3{<9w_2R~G+`MuY(LYBKMcQ7X`-IoC6exJCiX0JW@M)-K-=_F`L z$1kegOWv%uJP}Y*wl83&PlYo~8nLjNr-O+~&)1qLbkTKNbiDk{7Zj*fjp1^?f)t>SVy@6a|NQan+lZ* zVwD#0B_J@t-`?qlwkYqP8E9x7@TEKG2D{1*>x~J*{c1B{yuD9N_L_azy*UbXdajKmDcr2Erf_1IiE=V=+_+^7?;5Y~MF^=7>(4mvWH3JD#+jnn@JI zE%KYd*kj#mJXmD=W}v$YW*lgoO_n=G=Qy$8W8bH%=#lRFwJzhE2#0uw`mUi{DPzT_ zw5*Xa$qa_ttI#$g%>yZWjnO7BR(>fsE{M@!lH_Ipc=`aa?k4MhWxAdo9-~(4Z zie4HcA4)IP7gA9|-IwE)RJ08DA%^m-miJf5KPVkK(=3jRUt(zL|0*=tuKNELLk$14 z+SW^d$zFc=vI%p2XoF6Cm#ehyDBdgoKzP|9VXm;&^l{QyjI@pLCv*0_?{DPQ>wj1y zm1pOtlr--S7q`K60&YQQdL&StL>lm@&^DyHGjhw>SlLz5lt^oskWZ4TlX4muA{!iP zGEZL0l~u>2cH2Maab*BKc5bfmS%SYs3rVjl93;^{G3cM0iNmZs z4}9V}lI-hYU40mPZh3j6(Ro~?+MJaANZNt2!;w~wC>y5)b83A%Zn8{gJ{9*ihh<`OX0S0i7=@;o1rE9SUbe zATK05IFK*C#7Aw;pW@tqS3CtttfH$2PG3iFN0h(=EQdOb#24rA)_A%4{p0!uatkQ+ zTLE}UCbWO6d&~5&Z%~|^vKvZ>tn2(^4`pH~alPlhP@FiH8V10ewdD5JbEFEXu=(;C zZs7yC<^Ckz?GA^I2qlZ}H|9_@vRcY7jk_O`1jtgOTevK={R7rrVPwc{K*!X?3k#w#;)iM;_Lzw}u1wMg%UAAZ>nsf!)F2Zd$A5%o} zP7w=#n^$ed-uMre?`23YpHuJxSDsXe;Il&$$aIU)Ar@d3pcwR_7Q5o)#`Fhvs@+_t zmZS)%Rf^QQ$@i3}%nMjcFCc%9EdL12Q2pz;u)gMpF#mC8vGfK1F+2S08vplQ#D8Q8 zmHvVTkw0LO%}xdA*4lj*wW8+5nSSWyFq`So6r_;yJXNhnRLQnDI!p9MUJvtT1@q+u zUoRVHzA+3i)|&Ho$%+Rtq>fD_b02bUdbk@+G-hUY044QXAaftV5angVz54;4YO0Nn zm~%Ud=oAzDj}cxD%Ukx>N$v_}_Q9p`5k(Yx#Z3Ij3ffCrsZJ}+og}o89kSYQfI(3QtEM~@>{MA#E6RdXhie@HT`nz$rrIzu!_fFhw5( zA<(6Tus1A3+O{N9f07UpZ8Nla+nV@Y>dqIpQHI|kcmFdh2S2wF6OhDzz@5UQ+vxKWH+fbW=g%Vf~?;yR^xl=q8 zn@w!gw2{z0pLeQ@JJ!?+;^6kQ0svgFC2U3*u<{66I8>TFk)I8DoKdz@&)*YlS|xb= zj{X;S?-XD8w{81YDt5)TZQHhO+s>?L#;Vx1ZL^Y!ZQDu3spRCp)?WMWwa(h-oO?g_ zzTD^eIDey$KEAE@)?A8uMP%>;>bi>9NEiTwvQ8MsJC|z%(ce2Lr+(CvUGsqbpaYJK z+a|3f`xm6qDUx>tI3BV<=$p5ETNAtu5^l}U7vUZDk|pe4gaSIM4L{FF62X_I{StpO zje~bS9)oycCW!al0-kF`qQHpX;eEy2m9giBnrvv1MM~&fk&Ck5o!5}P1g5R`kuS=a zqYSY9Dm~we2mzzbPa)Wh{F=Er81e^61;%Oi(T-#oRFtbD1_xJYv}`n^=d=DmLS+mr z2gQ8W=ugkOvisk?L@&EPPUmw4?m95#otV%4T{4HP; zxD_A_f&nx7lf^SXalp6_6dkb%w@Fx87KJ{={rgaT)f!!}z;1}fJD40QvRu>>xxVK? z50gJjhpM)wb{Uvd!pXVoVcH|lxo?(355FG>V?-N-YThbrY#{bLGi!|%PC6icHVVzn z-zu7d7P#uPFSUeJ-$dB`kR>^ry&ldZzbG%f@#n(mrW+AMIwpBc zK1Hz|x}>!rNqUHYHsADtuEJoCRyr7PK@ddn<5WAql6jt;a)T z;3-ZaMxDr*K^9b5>&BLMk7AK?$+LN(J5E;JO-Vbi6HOjrkRd5G&qD^dg&nl-gI-y7n7bndKXyh=D(J{I7ERFwu`cnI4KsNkD#R$7bkc2!&pXR4djkA8&$si$x^`HeLKYJsT656TvRXz70n9Kj`N;MJE}egVT0C zg=}f@OsOgF$LFO52}LAgZRiL3<%{M2Wa?GN3-?b48S?WWyLvgArQ{95;r}h@uFm-X zvU~hT8OVV~z({f2garR=NkolYjl>9D zfsAK`<>=h+G23UW`_JA`O%G^lh)J$O(Ash1#qnA}@)m%r@zIn}gd_So8 z_sn$w73};;9)+qgw>^og_y!xvir=udP_F`CtZRu)^mbDOU zcGPmZ#iN;xb*!fAIJ4Xu#!)1@knw5N*U_mHgmhJxT0uv=PM4H?=@ z3`|oa7Z*TANDDZS>u6G3>qaSnX=sj`g60ZJmU5_7uT8CNb4U0JrZZG(w%D3utVIJC zexk#IF&MY_Iv_wQAhJ~yAIF~}ZeBG{bJGJ+cg-V+ucN&~0i3Ei%nCFGyn0&%dqMz& zMyN$@5m9x_T4vzBKYW2~D>}aoB@iW4zm~(JJ`fnJB;z6smuDKwzC^Lwnx zctVt0LZv~@R1OLSl>C+)LJlqilZ7b{-=C`XyBM1?JGzx6T7(6YYW;`CkZRdnp%+48 zm!Nw4g&vlDM+ZMuD8osGC;8^>f&9R|jr}ndMR=C#c5{)p`&c4`jmYpL&x9ODVX7vu zybAEtEfMF|+0`4}K}5FzJA{o_`V7oD*L@UtAuM}R>h|Dxbb-F6H#ftIIi6kqTN zW-g|hLPn?hfHzJEK215>>1Xi#;41bfF9z(8Z?L@4=04F-=Ed$=KqsY-+sr8_c_PRS zJ^rEbPrKaZgrU(Sdy`%u+o3>{KEmXtP$@;ho=X|Y**-1MFlD}OIt^qodo9Jg21KV+ z>TtQ`CnR4I4$;wRuWaQm+~d2JWS{mqo}S=$f#1s_{*m7}?sGmhM?A`G7n}VCVg(=p zBaPuHIWpWuUrZpL`az7CqZIxY^$tcL0Gu>s9~v}t=9?fL*-wB=@c-QXkfkNhNt2yq zdS3sex5f`4Zn&KNwv*g3xPXY~k=E;DhlDv++uR_3-d;*#UEvh=v$$XQd4U9uhyun0 zh&Oy}`4lcRCP8(9)DFqwOXSVT;so!1>rzWb;hIf8&-dy7k~sf&r&q0tw)QMt}-2I8q?KhY9NPf2|puhDc7ZehIA2ZnKWpKikOMVtSRw)l1odiE`Xxce? zSnos@5Ni3PNp5*)XP+_^{6a~hsveWVk$AN?9#t-JVPhn=jU6LCE16;a>92E&!i2$# zM1ANHi$ZLnm}c>j(!XsLDm3S?QN84fmG~8l#>fI23-xW$P_QlC22Ne&kr)C#rL{z= z46`6l9#d7%zOKLO2Ttmvtt=rb zQ2dgLd7Bz(IQPadr*A-Db)ff^xpeeM;eYq<{MXw0*;Ofh zdzW`uTdb;DM+FlTwG`44>Xktfq68}Hm=+c81khesY3Vk%ZwPzdQAkMzTe9-M7DTxq zs3}G9&)9pDv)oPm;&7oi=<$1kGsIOu^~8)4Hj}96US-fq;;Z^)cZo^Q0I(LjybY}2 z>ZDGQo}jueS7)Zv-@uz&|FcwB<=8N4w?uov5a$=tQ-;LN!S2usqz8R*0jlj0F+Qn2 zAsIsPW-X{B?7@ZnZd;Oz=odmGQsS&+IKY@)X^I~5GV0D1Mmrq6m6kT}O_rK)sH`pw zIm(YHy{4>4E0T4mBe6|U1vKU++5Tx;`E4z2L0Qca0KmLBR-7*1Wv*s?f>j?ngtNO5 z^MK-_p-o+Ym9PWkS%i@IH zO{vH)%y4fU&Z4!ZiU15dVp2qkPcyM!wf-@#C)QH^ECsIe9mjURr(7eBUA_XJwSJurK-h?*TyoQ{__U+<2<}Ja@tm z6lPOqbaalUnOQL3`Xc-Tl+S?8P>reAQ^nt%J@OeDi1SD@Q|?%UezNS!sMu6L2&hEH z<*txk5OvzYF|nS+O>{8&(P!l6v6OcXLSB?fcjS9|4no9cc9dz;pM5i zfF|&0mL}B-Jz#<%%Fgr?6euSOg(~?~ZnPL{rE;7xEm+Fj#2h)WgYXiTUQ9Kjls2L? zUXDFpPE2&D=<;*YsL7hHX<@N_`zrg@u>aPt3K0C<&C+wnbG7Mn$#=BrvbFX)cW5UH zV3m#fMH-}xn@CL+JqzA;+8M3yF^yC0rtz!v?iD$3_6~GM&^RhLF?0PV)_x%zq?xp} zi1Ktux8x{ZO^ymm)Gzm?mx1?Gj-48JjaQW8)0pSIHw>$==Qk%0Il|*u4g@EPL(x8% zKLOSNPNdQ_7LbR#KMmN^-nVhW4*fht0AyIN9j>Yw9NTNy+ob0FjP8V_1SM;ul^?4= zU}<6~i~}622pd?jVyK&=$4C=ac}jx{W9Cm%J=IpSW_Jc~qF_%`RlI#!B@W~@KwabK zljKqMGf$$YXv0)rxmt(P=CkBI6cME?N=r7?4VnlgNY(M6e1hysG49J# zUFx4}#N~ah%rB&B6p$hD8fqkE&0+vPOF?D41=t_9orJmsF~1OCPg7iW0{}cfyB(FG zAkD=oPYc6x=PB7k63qKp*Vc|nGdmMc!=|L*71M=YU8}q`;mz=6F`RFuH@=svmi*W*%rLwg+POxjbW`H(l=FHB z$#f0HMytwnrI2j`iE`se6a}F0zN=4AV|vVXS%QHVY?Wk#TdP8Q3(gw9;5|LnOABE% zneXiVc+4#<8Z)pqE3znO=A}JB%I-~c(mhX+(eCT4%@@3pAmbbMwbm-zjg`@!@bz{o z+EtMDj_}etP#nrhZUl1SQg+MFdb?{XYq2U}Wyd$h!)Nb8qa+$N6awhlC5Y}U$n5qY zQb81)ItuaHg}7pCWoGS%=A_H1$GnsoB)#KxP*rb;^?x*`cuA2xE>oPKb(ID(4;dsh z8YsY!P!8by*xZLeiS$C~N%_t0GNr0N)bV3;PKmNg`3+Qx;P%Tl?}&ipi>8MnsB1~k zkM~k~*%9!AgfW`pL<>Ov1jXs(pN8DxOclqTtbIc{b(B|CJI=Dkp7N^RRSavy+6Rs# zzs2|J+sRb{)nTpIk})=$ty0>C2Ztns#cq{wvkRXjrA2?$Hq(n*>HOJX#S;@cv7+cE z)+EM7TxzvSvr^K!MRBvxCfX#7#ntkt+C}+;z@`UkXejUUZeze&GDQFTEpQqR@N4hW zzNzAsZ}$#@!p8(;$j-#t*!&Bd=;8~C*bXqxPwB-;sL4NBksKwSgaLVEGu(X<%#E)H zge2tc6niLmBxE2ym;)&+nCax5cLdvkcPBRQciUNKxA#0z%cCVp3-yCUW|0^&%bz-v zEthj_8p;alfK7neW+`3@YxP3lVdJg)f&(N)#VaR&w8SRfTZt)hAU9rz*z^{H#70@F zVD|`%HJo|85?U#|4+=aJXLimNmY1>ZaORK7@^{AWOS?jNZ{tsz*&xxuyZkIY9w zH1fpcUB-T;Z@-84{Bc(sNv?L?j9&uqneo9V5OF)VsJ>xr_rx)m zhSggI9)rm!Y{&C@2g;n>u1~ z%V?&vt7a~->qg3!cwe{5&A-%HzzjG_Z8 z*y5I$MMhCTCu|rt*?GnMJXw(u3*m_df;6m7LQ&>N* zs2hJiPyyF>jq_S7A(|mQrjf7>M|6s$14Nr(2IHCMPEvklc50Jgqip;!QBvSpA#;d_ zB$QdSdUS3@VI^uHl+O}(jD}5IXPH0NWj7ij)6eO^ciSG>Wp2j`B;2d!YYr(B0PGxK z5Z`LT@x+gehzrIqX*@(^h=Dw@Ow})9EJx1>F^KRTQ1?eZ>VmY61?C+jyvx8i6O>e+ z2kxCK{Ezj>AHm%${q3~mqZ|X>0h8#2Ff~cr#$yK}jGW%Op+79CWVNnT}<+(t=x)V_cSz1OkT?^XjLXz$bk#VPH& zxpQ=P?!`xKs{!)$zrbZjI%KDP$2%iW6g7ONL6W@?=enyAa`|Xoh~{FdV{$)p%#r3? zHA-eSG;WGLXR2YcTGx@>IgLC}+?%VvX^0#O*?(XE+6L;}q9=s^ofpartR6YPc}2xt z%?qL){1(@A3A??=3!W~37fcHRparc3?)7yRP78MB%L>>Ej2A*Z$}O)c;=b8vMcfjR zgV1I`C*pId7c5svRUT+-%=^4=BgENU=X7g4I#$cU(sn0P{|n&yaAd z5~uI(I62d>KdEhT``r$eDKL`bS&t=Fj|f#vZx~)%4Kl9E_z(64x+CfxZ|NifJ(z?L z`Mn*_?#dy43|rNt#b;(8LvY3$HYfga0xScvDV8s7SY|JA#Rln2#pA4h#$*}w%1($H z;!mjMde}2k`SVVCevPND0(RaPI|EO&O{lZD(udyokVwvMhFV1LT_R~@+@#2}&V4GmYVD!^dvDzH^O()kd;gi~3 zP&TeR`rA)V?(?sT%|5J9wabruF8?*S7G8+|L?C!UnX@`a+DRlk0%-Wcu7%<@Fmo&f zTZT~`%HJ6CGDANmgw=3N=#ASyK5B#=bt?epfH5EjSa&V3ETqhvpLF1b8gmg*mual&4dm3xB$>opySMnOA+NVwdZvT@^2HeQUxb5y7BV3a!T(dp{O`K+ zzr%u8#;~=uAujiyAb9HeAr|AjQy>ba!hIN;_Ga zTqc-CeE)J5bq~5~J>ouW)$@Syd#Z8H<%(V@E^QGJgq-W~BJ(cuDAUE|eQNO}>^-bPuEFrv8QOdDW?IXDu0M=sMk^(tCd zdwsKF^VM18`fkk5?GOE3`m$4mnlXlsLsTy{1IF>r_SJ$88xO1GL-TN*>b6>T`Lnq< z{b>2A`$G67N=b0wbh%P>JnbR&aj}U!=LtqYljU+WfDhGa!A;gCo+#NzMnb6iUgFyT zKlm#fuHYGYH%zy3sxRgN^+15AJx#`+ERK)>5$sjRR3Sa)av2l%a2e+Yq(LXuJ|=jA zaJ_;ZB^JtN6=u4E&QBjRWuXorg0E~8$9$6(o8Fqyauc<9fq2s6J@dJOYxh)2?|nEh z_{#z@AQppHb>+vhw6$b-RhRP_wh=Q1oqoETsbG%vF>o^X=Z2QeQ2mt-TnX}3i5t!m z^`s)Rgak}lw?3K$7IDZ=oV~WPGmm;Jv?I*?rDB$lb5Z_;ZWf*_6mVDl0W4j^){W7? zq#|#r0WIBc1t9Q8gOo8u@Hyeds^)hI&t+%N0H}+Yux@-a&$#6P{8iv07YHq#<;YORz`UwMtSnr&K(?U0V?!=3s{+tg_Ji;7{roRqjqM_>~~$;#RKMSIAYy<0)ebIf-` z%MD%P!mGKuPLwYY=H@SDRJ0ckQT)K}~PkoTt=)b%A<4b0XA2H(K0`bjrM-Zw?^!GRixWiSlk5Pp^{iCbN zp}q#qde9(2lqVyUC!$U!3`PDHxRwt-@ea1~6>92tY=}{*TrVHNJ%4Tt{JoimIG{FoV_>jc}B^`|K2>+^HU*st}ud!<5>p?23M-xD>whTbjH zjLp1&ovkE8J4h%Hbx5~srVKe(ML!lb^S70wAHk`!^y zKJ$$ZzGX&5Jp{{sn0c%gxb_bISH<@K29qQA8SB#hpF2>HP*6}`#EjHa{_9Zk|GG;5 zA0lG1zYsCT{|AWJ`|pT&DY0iH1xqbzk!JF z_2&8hZzJM=C0zdi`2P(eR<(x-Bqnamtt8woLKD)4%WEE$mKp%nT2;~fKSjh}|AvT- z|Bi@tlKAWr*4CMH^#QZe>jz>QE}m-iN$D#4YE`z{o$Wl;ZLc*_GENPHpNRNsD#0)9 zFGMVm&8#bu0s`taP=50b)0g@UiV-Y(^7Nz(8fbjDenu|3lN%97iMxma`J0|VUl%X>LvqpyYX69C|If;;-b)U2L}-*tljJ9#KDy z!e2>P)h4SM;eSWO3ZIC0j+|U>&9wxJ+r)wdWA~Zx%_v>l;9DNy zJfU_l09}JA3hD2NIA$p0KM`?0NVBPIhJ_6e&bpVCt)}V9s|?9av7^m|Y6LKe16PI7 zYWikn7y+Z3r4TcJs;xtfiVh3GNcS?Vd7UmnRFZ?k?(tEf|J5@2Ut z`9#Dh|AC0#Ih84M8qe5A>#0VAYz^1DECN6A;O;k91>KI&_@3s zyBO6ZFZdS*(>F1!KqYO^*%UHg23Ai}|G>gppw7xQQ+xM!=*}aKH$CkI6x3lx`P=ML z8DPs-X$)ljG~1}cltO0SS(o550OZGLq2hrciOQ(Rh2T4d*{CWjt-W5D>$eOU zZBpKMRpOB_JYw(b20@Bw+)<)Hj7BwXV6E_kY1tjh1LC#fn1tkLJk!gMzYy`u-w^Qy zxCYw4N5ucGy#06j^*Dsa|!^H>AU`!J;Pl0aB8@3rfj- zmQHk_-RY15-wDQ^*zuSW1{3%iKMY)QWQp>Zi>`wV5Zq5k}K~Ip<+|JRBUt9^6@YEvyW} z%Km2iAiE9i)`H6K0+*|6Gc!%on+W9Zy#`M@TTd8IV=0cG8X0LP8rv|Y$vmb>l#)pl zlX$d4)RdRE8frn!a{7h>ze0}Bm zXpTKJvWRQWUMBrH;vf{FMwIT9)pHnS1ADeEgWswqT}|@IYft&>>qbCzHK~Z;|?RzQk0ZbVxZi%!$Anb4Xe42aQuG6Vx=Op@17M7;BMob@|Fg zu})Oi#Vrz;(XL`lK@sO7Tq6o7reYOwhTR#_#C~d<}y(<4r4)xb&U5R zd#Jmra_6FEDqi<+G`1!74@e{VY zYe^w;QK#jy33oKnFU!f#CxfDFj~wco`a^PuF$>s(41`JIqW05=$C?7nrUR=xc+xq> z4>r%f0`~iNa!RmS$cm&KZaeO z_b{{!a(W+&)iq-bMDGC*CDUl4B(+&puv*C%_De zPHLTY;6%*k#_BxO8Iv0&Q;sxCm(#s!#%yyqvw+W4CmyRSl=4YkWk_;g*}EJNgc8+5 zZCn&PgF+zYA)g%F_IS9LQ?rf6e?=RFT%&%y?gWx>)aiQDwrvBt>A6d!Ug)eZY}5o0 zzsy`Ix7#{mxvuQj4;@ga*yvV!tQnXLVKM`u<{J6c6-}k8&lXZns@X^R1yOfs@h{l z&<`oTwRuklBv%9K(?cY#DQ}qA7{DjXRlQew2ZG#?_(Tmx4i{1!_xk}+`vZIBu=qa> zL@vI6E(wLn5PIbI8^(alA07-fZH{=E9~U|JYDvmazb8i?bYaCbP_5 zf8h2L-8cgIp6lqn`Mo0jmi&vZPYBYJ8U^bAcZedy}dicyE7=sGbMZE@i?<5*56lf>Q^Xd zL@Z;Zf+Kd$Y_l&g<(f->7=tsG!3o@8$Idq>_J&Tjd)VU%Ys*IeEf@Tzpcz5HD(gus za$CbLv3X$+f2rh}^$v@7d@4*l=jdA4;Oy$J=3f95%?I&^K&VmKy6-(&8I0&p9t}Au`s!t2|*Psyno`7rlfYDztlW$ z6Z8@sw1#g+H@E{SZsT74yH_?k)-Mlg2n0a3@f!J3jlKc3u#X$05>1bUXcH-0kp>I_ zlu=M}icor8^-4%Ec%sZm-knIPQZe&r&XkGqGp0Cy74tY_9g}8eEV79imuTI7JmpD)hT1={jDCmN-$j{i_?ajqK7E zkIp7`iIe=&C@Gl5aOsz&lLE>1;|d4QhtyuVldA490`s>YZS~z$g%La|4o+6uhHfeE zuYHFfSOmprRu2_KlseHm1}m=|X3)I179k`}Nsd(^58G@(2{yQ#5Sv@^6-rwn!xcPXT;EZ4gq-+x3jBDNpCvD8c6Rk5A52}woFgRWHC(1CWU$(~~?TY@l7>5kQcIk*k4UcGSyY@)Y5q(UiqNVtH>^Jh$WXJ--^D{dUxy9*Mst`Ra$e9yL3yVe#c z?ji?ui}sBtcPc}&_Orv>BIU) zSI(a_#aR{7MtaW-}R`LAUwJ?+1qGXESnUPevLq z4rZ$FvuII2sV${I=Rm3&GF!;)$ z@x2>~C68y+`UGPaNj>@6$&JotO33tq7!Mi!53)bqhSihJGp#4Hsd#4NslhvVtu$na zA;)St42*l2j&L1D^|WB5*NnvM`0y(UYn&_YH}nTV_+c)N02-}xKS)9pLLqfqc31Sv zc4tpSR!6it4!P9GeXaZGX_+@v+)b3Fr5}>(B!@CQ%3C}Ra|=ugN6G00P%xATd$@_#qk@#maQ8Nbgi#F$u_&9w2MQN#AHX7G5k zx0T;aQMvhZ0@ziV6t1`QRo@va*7K&}Dem9-V3?az8+kxv?kvpcHF<2j?4`tTa`JVg zWMSov!@m#GjUH}Qpc+>o&(1QpoYfDE$zayD)p*>+VBW}Ne|259UQ!no| zdn0OR#P-W$eN^tKu>UmtrcMComD1a((>y%^$;2H<4glfl;QJZ~1B9= zV0QZHI{*f4Y`2GqHDF5d!uO}H6>kw4?YBWzSf70`O|N!AIljU61UMek$-`Q)thwfn z)Z)aN2(+cH9XQNEb%Pr8r&#UNtU4a=DE4^%!f`ZwviuehKdtWG<0kQ~>jN!#MsORv z6O-`zvG>O2>sE*7v0RMIHNZKWYnE!3(hB&Q>;NFoBEKJ9-}hNAsg-x1w$S6}*>6ak zig`IN;6FnmN9YONB!{{*x^NDZqB`_u?6pW22U>cj%12FKb8$0D9}U<2Vr1`aU;J{0 z-5rsFxw(W*6nS{?r5l~~Q8b7^e}=PbZ19!4d&eYCKOct|sfi)piaVY(Rp8Od)4(Jz zI~wp~O5~4I+M8Obz!iB7NmEbGo15#$J;VNz(|Oa`KGtvCG~y4lMl-$rNU5_#`9S64 zK^#i*DiAukP%1g{s>Wn-lEg{UDk8e92xab1*PNz#yaHEBt7yxzf!sz8tE{=%N%pjM zKC5VJrd4#Fx+A%*$M9`hlR^^iwKtbDl5oIQP$A3im0VQKmS{4oR64O9F`ryI5!cz( zKx%uq7y8|}@_YEW=pQV!;V5QBRdRDRoWli#Oe`VB-N#xY+L^aQ?QE4pGTp7#(Uvz>25*IK@{ugvPgFLlk&|of$zY*> z+SPY$6{?oUm+{S9&IS;Q&+UolCJQ$Pa9^t@+pc!l@I1n}LAS0PjtGcB1;W_(LZ6WQ zXSd!7{%WJzh&Np(KS$7vzWsG$!h(XKe)$JO{daR{{|XuY|D<%WPfQ@U=(-r$WiFOH zcVTB`pGo0VE5*UU<*60ul4$*6o0c2Nbev`QYBN)d1Ms2TEk8?LBo?84OpXcEJ&Pp- z`oTQdaDHEu^F{M5Vti&CQv-sAudB1a@;JbNhO##9Fb1`os-_H|Bd6?}lZ5S+2AW{= zBX@`o6qqa8mY8abdtu0L7Y4e+<2|KfI+WTpShqJ1)Y_;;iAPgkotZ7?9Q)=l1e~G3 zLxYry0q_|-OY6z%lIG)(b$kvM+4@cCwL4kQM!)kfOv7ghC3G|_Mwo52V9JwiDx9%b zt7Yby#>Aj9`*l%IGK<0_a16VsEM1w-QBN|7*2r1Ftc3fL`&qbiQ@|W|0$Eyn9XsN| zX=Lty02^8f#X+$r!IN?}$ny%E82Xnbcj=f-RmI zPj-1q8LiJnycA}#yhDYBBd}7Rp{n2_$>JP?uQB_V`wWIZ=Vd5=R;PsVmlTof#sjQ{ zUic-qLZ@ZLbsRAh8lBfwMC7@VNOpif;~nQk_bNtT?OlHuGbFxYjd^c)YSQB;LGT^K zIm8*kEFI6Q9~`S6JlG`)JbIKA5qXC_Q>sg<#4TjY@(st&6DShw#4)D7;8BNbEWbiY zUqc55Sh&&>ZZwVxqKFD1Q%J#hQ~|Qnyss}P4S|`zq(=e@0*nGuHyyk8@CClIQFY<^ zHj_d9$s(NR26bt@WVsGP1aw0#;hmuhzJ9~j zlluk+QFNtF45vzmr%FYYNfC*00@%)in!AUZdkVA;*)hi}(QH$TUctTroG9_`UJl2vi~%CJbY9kPF6i{lpPN5-9{Ny zsl(@5!zk2}p;ynq!#hIZOxfsliY^O@Z|IqkB zg%)sRcJyT<`>t-;>h>MwrPGRhk)#Bp>qN9tL;f{qe7=XS6Ut2mb;MM{32XN&x)gr# z2IsR5wtYcKB@D}Ylv$z?e9ND|t@-b~^^pBHN>|+s(YaP$$pa){@NEDObP~qM&6NN`qP|a@)ANA@xn;v z!bqXQu4*;eTSs&QY!_scazWdtw5qA7q^q&XW8vY$+?=Chg_M>EYII}+kj8QK0r=Q^ zeZT5j;k~;I2nC_dTTm|~R1;2*ay9){-$JtyF<0@ln(0Qjrlt`WSJ%IH2d06njOR6x zR!gW7s5Z zQ|GhyKeW0)3Sz@R@y3%Xm21>ese!sl`0k>XISf(I*4E0ZWg-_I*5t+J-76v#o09XY zOC)D;b;p=vcwfddCW2q1vjD|{3!UXM5n6=K z3FR)|bu#)znj2LeuwNi3oEJr$DU-?_h0U(-)Nz(%=u@ytu6sm^N@n6Zk3fTN93O0q z73tNz+o|LvUhCAm6sr2EJI^G_UsgHoiAvA{nxr+#qAU89vBqmNT?$)utuZJn2AL|| z>Tauua%7?oX&+UuQ}g8g`4Pw{lWK*B!MBlrpmAUeS>M|Lk|HXy7?(cd4DugzgPEZZ zn5k>2pQ#MzneeM+9=+CAhuhtBY{pN|XmB_&UcfBXzT(DZW$7Qe4=o^V2W-G7@W)Q! zQB1Uz_FF^Sn5vr4(xDsG~vuB2vaqDEa7dFhO?CH^=Z#d4 z{_GZ$jGo%QuZXv<0yVqfaz*Il{Cl|JQE3}_HoA(q z!f=VHFLut(kPL6cc}nq+YxS8XieG*WW=_%#fXg?Vto5A3i~BR>oU&ZbmOAP;W#9A544f5tfWZy_vOS+>OG6yIA;ELO5?t%v~GK{eR%bbD$WQ4>8GS9 zgGiB$RBn4(k%{;K|Hv&VPrc!*8_51!Qj`1~y{Jl2j`?%>w|Jl;`Lk{JZN|9Tiau4!21Ym({af- zl}NTc)L<_i)}bf=>~p->h)vL@KP`^g3EEN4C=bOelnUdxCu)@k3Q9BAE~=eYe1j}J`Z_V{pcN+qU)OXG^W!En?X&e^`L5$90lB<(r-fi?Uvd~tqRE6KD?^{n2{Ec&imoNmHwox8&+Tl#5tuq2LUY{1a z9;s-g*;o;mZ;R-97R8+HAN#bVYozO zyX$Y=xZfvpKDIlk{i(Bc?tFxv!4U=9Q?8V+72a`URo{O}0I*@=!iC==ubiVcpE%w@ zk2Qp8a?F`PJ`OB|EvUxB^_BfWLgJe^${B+?K*o(xrIf^wH-~xN-t@X2KU_mrfc=T! zwzVN^TVp*0%9tnvsjHz4{hTAsgi)PtAqxHKn81ePFO#4TdvB=c10mo>s+R*pewqe9 z+-b;@3m;A90OV`vKHd!UK7|Bp?DzRalyDlDcFhPr+L&3wJZEkBh5v`S_wT?0jD8ED~ls&xF>o zhBvxeIigJ5@E{~gKETa%^bmxyAFLJW^EMMG0E&C*FAfCvjkrc!NsffToG{F9 zEWqn)Vc1oj2`d=!D%v#YB0kMBpMAI%8$|Kw1^LQndOf0-1Ib%!LG&z#5f+jHfoxgLyZ5FDolmVqRWd*F?`XpK8^x-}HlNiN;EWtq;^S-gR=REcBI zyT3&f0ME&3vfcTt(nqX^+iGKk;Xg~!1#nO5HHanA$4pl?jtOa^O$7A=vP{PUMfbF{ z?Xgn0q7*gYI!!&f;stlgH=PXi{?o;Y)!0G>HdNXT3H;v4$QrdX@aSgZAsKLfN* z0u8rcEP7I`&P_HSSWF;Ohy9Chgck3<-CZ*#Ttm%y#?9SQ&OKqyJ#jvIr(5|3TJip3 z9_Q6S?l0iEwmHHd{Eq&VVr*7%`^x<|G%c%-PmBy#V4@L$^@*!liy? z&SkrQ0kA5uDWQU$(!PhwqDDd}vSQLoVMLwN{|s}atm`flbHYW3Mi6`L&j&$Z$;U;9 zpD+>+7KzkD?n)crNEMM`csF*mL{egT0@#FP@l6S%TZ|5?5r^I}2hsF?&Hez-yjPBS zqfQ5E$815w=)#UvMw|CbSQtT0^e?!wR~K=$#vksIb3?Ywef_OO|MD{+C^2?G_50GX zG9OI}_Dr<-fh8-A#6)EnyO1We`8HKnEo*h=RY4lBHn%Ui5teMHQ0ky4POw&fFaV3L zp;hb~J9wExWDnywK;sQ>uGzD3a)=GUR3{8WgteiA2*8Edg^Kv(pt6 zzVlH0I^X4qI^_P4yaL1HGt7Xr%0qwFd#QHwbpN+A$p0Yh9it>`vn|}Jth9|vSK791 z+qUhBO0&|oZQFLGS!vtOyis3wpL4puzW4r!F=9mg+dE?I_0ILIIg_izj6WC2T*yg1 zeQ;A|J57`Y{wf>rcKQ53Y4G-xEJB5qW78bi#l%t*OqMSPFsPRA5T4=}UvV43d! z47#sVMA3s7JNP*@-PuyhU^Kib`w~AyN-q}+S~yXuzh6! zR!iv=Edw>oG(@Br3p4iB4$io>WEV+bbQ5evA!F0wjrga)&u~9sq?)9bd^2w0>$E43 zl_n;_f#hLd2f?74ValtkZ>IWnAllat5du@`d=m==IzXDFfWgMN zB-L7@Tz%{-@m;zv|MS@sH%7RgJvrV&?!7W~0BB!J_SaDqPl>SsvS~%#0Q83FDkvf; z+9nc}3_aTM{1y&Ezp?2UX2vi;qN21)1dnMRPk~|=o~93-*77i9MxEbSHRO7$q%BDI!itoQG{T!&x5 zYA5r{7N(Eo>OIrkE+3W43}n5JCnC+}t`>)1Nb9l@%tRV0%==)I78_9jOx*7qr^1=W z4l0fENSuS24;4~x4E$|{XkxXj<%Sknz1s2!{8XhXX1~*)<)Iqf~brx9eQA9kq#7KR5>#DUWT%=Gr zvWc4@1FgoAU9lD(6XOa1WZ{wUhE7Y`{jz=&ixFuA`XRF8CX&738ak|!-~!gNp>lMz z0H+@_121ZX2UHl-vw8$?j6Dk5w`PHeHa`csUa!f+@0eLT;fS5_muQ`)OI^mkrBh#L zwPiU!6U-*0$JW5bMS@_PB}Tn#o`;g{dUEC;YJ`cY&CnOZJT=P!d`rKv3sjl7Am|LQ z)bb?Ap@bFwENfIZnyHpeiJe9r+g61{z=Q{Nqzkyfa$U?Eoj#Qvo0f5vJWI06fVw=9_5rExoZBEVBqeU`UQ6VFKQ%DNodq%-u5iaY3{$;8LU& zCd8F+t?h@6Nc$&heYcj}Oq2Wiq*IF_a@yG&s>#!`$YcM^<1+JX{HOh5-ufSv-*m6$ zeP(`jEN1A;tZyBm&!u4!L1CDryDQwPI%Kzn2z3(psNg1(12`@d^E4~>ySKhYJ|B0= z&-+5*Ln!uhMWW2hN1{;>d?zPTkq7ooc%$T%3G%;P;Ebc!Ri3}7H+RGz6G?tNdy34wD()q&Dl4;!W@jnp*n5thx zs<_c)08cmXrd8$IyeR6OQ)-!(tzEBRAL(>SQ(%b~CGkaU3`gUsev%L0Q=hP|Yz6$c z6rPYx3>NbCCFjH*=km@G@8FIgc z7M4NX{=a69|ANTv4QqHL&@2|?4Jff4N7B@LJWvJJ9&!>Vm{&9vKXxl z1n1gM{D@(aXlj1>9kY&Bsbvzj1$_Ixfz9`M{Vf$sfg$qd=qcmrBfH}U*H=%^;G3VU zkOmBYo_onAFSwRbN95HkOlyl}JO>RAdbs2`!wb zKuhoYnqF3mI1f*L7o23L;TZVQZ_MCUL^R5{Xjn`LZpf@wkF#kGhx<6jwvpnoCjh2FA_UqQ*eQ1a!+6zd$^g^>0 zah;b1`Qtj@@gu}tpnYc&%+^|PO<;{*T$&z}VK76rP`Y#nR+fw0ZnGDI{)$4omEPe5 z=8<)fX<&>z854yw+;#G3&-=~G@%i-`Xfl^p{WX{nWC-peeY8$?_KLP-Lg$=mfX32c z06Xki`*;xM6+Ee)0*7|h<5nA#{hI|K1tz>rl9>w)XXT_7;o3?JZHuv}GI?T$UQquz zz5&Z6*=lxWgyLLU|CSgrQe>09Nf#GX$d^A=BT>FrC|+m7%0bTsQv0A(kKSbuW|3AI zu#E=ZhdK}T#K`0ACk1kyK`-B%!&PnqPO5;>IHtVm1k%I@83u^49)mq-9zX?@xxaJt z5x0i>GdV@MOjI16|M2h8SKI;!A;pfb9Gl-88+5TuHAN3 zW%jcYJGRMTF(R|y$zXvzd`#>_y}Z7-YXI2=$~%>Z=zp0K*_V8dLLa#!frIM@Rj)+< zWFcqar8$)r`Z&9iIsY!*&sTKj@z#~SDx%)Y8^N!SRa?`K{bzKUNv3nRDdFn9Ebp7hCm0(<(HDP{OLiN5ZnX?LZI($_w;c$T+)CE-T680 zR+Yx%msf?smOOqKsmA0gwiFLLx2{e;-p`xxD-3gp=9v}ofK_VgMpX(eS5$TdD2Pmm zy(Kl$vGw#0P4m9aL&-fJjQ%o)lK>l_v#wtDRU`MAYhipEJwTk)S21!6F{dHlFP<>1 zbZA*ol&F885h|w{?|f6jexFSu!d9dZS++82$>~8!Lg+p@$+|AAg zo&0dzGoZ|1U$J4A-YLIAt^UhAIZWOfCe}i-vhk=7WYPy>Gfm*Pbl7r8Px@V+7fe~C z%m+d>^f#YSbm`uc&I`1hC#rBnMEGoO@{di(ZzDz{+sN#R+2D7htl1QuG%?dbb;a-p z+jP0l2!F0NXcs#NE%0jB{ta!`=l$PIp?{UhKmRyjnfwPrHKDc+%oIZXkP)v%6cUCu zmzPqhC;SW&vcifkfG9$w?pJaJlVl7PZs5NR7iM$zaG<2;aVqt){U=mt7SC&C5g3E2 z=P4_9F;44CJ@VNp6%XIl^n5(S>*8Xv!_5@91evt)>2`+;0jD@-^R^d^txuV;4RHZ* zK|5ty`_N}0qU2bcliy1*ARjBrUUZl{vhO4zf-qHzC8Bqnm*VB2`Kym8ELD+NC_@LY zpg_Wj^Y_puZ-r$kL-*x3#0p{mn)c#&G`?@xj?&g4!UuaK9O*F)&g`bU$}~0;yKpQh znd;1Q<)mhmDQ(nrqMX}!bGfp9!CY1V457ZD#?TZG#;hFDX{0Kmqy?|7K3j0PQhnfh zU8&)L<%9dLkVQ;wDMwPduh>nT0d*{1zx+B9UGkRK{G!d>KXNBInes|$)`*sL%Rmvf2n1JcEbz%mNUKnkO&pp86teCIkl znC@;y!IlRXAu>;|7m7}H8?`S}21k&Y!g+G!8AnKJQxs~z2(SI88?kUZ`%gEl=O#Bn z#x$k!H)l)d)cibIjKbJ2n2`w}fMym*l5~S+jh}fod}(S-6eI^dpMu;oGYk4EWKkO) z6eS2A8CWVtM0v#^Dw2kCX6HvdnQVx@AO-PDRA{A7Y79{^+ppvBGEpmL)P}%tE2IyR z%-O<0c204m%TTn#7N;_1>Ln{UDqTy9#+O?wPWJDmk6KvGSd5pTT3j6~1HOz#85V#p zD35mnz|PAoA*N;X4!Ynn!nT7Bw0txfSTPol_{CJFLVEa8$Rfc=Dvv2e2BHg1;2fqD z#DfCQH8j}b*Zc#e-F0Pu&(~?H)6xghA=~Kqj1gBPo<^lDIw@rf+pO_7e`jhcuS46I zfPIREnWtm_X}oEFW%Pqk9Wa<2>r&i9>$@d6pg)RErnZo*(R3Up z%Am4WchkiXuoHi{e$xSae>| z)qyCia=IX00pC%fsceVqWJDag-RSEG&g5|GB#K_GDzP_zRMc^LT0j)$xw6RpZL#DP zonxZGBB^9AnX{d$2%xBWnK~g8PO$d?w&Wv^^Hj1=9EspwZLm< zr*su374xBM`=i2E^kScCiwIR)p~(nzIibDyeP5)!hj=?zX$QQ=vs=-No*5YEV5A?4 z;`SOFA!sbZ@I6n90usf3MTPe}^u$L>g@73L|DtEucE>U7N16{o8rnuBitHs3UHi^P zJIiif(SUgF^6muo{tM*8W1H@~|<|zvnwf{z* z9ma(8%wloe87zQ7Iw5*NKZ&)yqh9p5@|&#q=}hYB3~fTRDTwz5Z9`zI6-mK)oz%~S zgw$#&n}TysiISHy#j1n^&pz5a0vCaR;yuN<{@$G&8q8-T+Jl{GeEafj2Fz#NNERGj z-`!WJ$<(1hf?LRYEmXs%z)5r`FT$l2`#9B-YnWBb{C$9c?LG5({Ew?vT+v!;SdH#Y zZ6-h4B6BvRSAD{e>qqEc53ob3_CZ4s3UE`?Eq=P+JB3+zgxtZz9$OF_S&*a%S?5yW9%kccZCK^rFf~;T}B{e=1BB;M`Q7cx7*2__k_JKXQw@qspuh( zkm1bYnxi1<7sOt`&3#gi_k=1tbI|dT--dO9qe?#FpQnmH{GREqSUPcU|KYLUn~m3A z2}Gn^F#hB4kYuj-_g?c~2ZaB1d$;Z7hsC*pE)d`S!hYMGf>sQWZ$J(%MJ703?T5-) z)nU;seq@1v`|%yM6zTx4X0L{M2kYs<`}y-_$P3WxofIZZls7UEW~0z}s^MpPS~`*0 zuQ_VC0G|w?*SjNia0{cJmr6f%%joh@DSKyeefvxr;K?`<==JV)uMhNkXSTcGnjnHz zm6_X1rGFpd?RbRDGs|irNTAc>uocSOjI8b)=nB~CwVI2o`$m2A1=2>l>}RDR3=eTD z*C7>rDxpn9{RhOK79f}!*>MPH^{xbL1O7W*4gB(xBCsQigT(m1jP)Ne&C$fc#l*?k ziB8PKS<%H-l~M5@AN-?5Xi(Ks16r%T%hJLIlxTxec8DwVM-zNe*IXrVwCEv#i`S>F zKqDI=goR~dXX@GJJHnq%;;pyRIGQPt(tA^&ec)gUh%SUtr}9Z=GIPCuzi*;DF#dSi zxBz@^jx+?o5(c0ND+~YXuU4*hV{tpspREVXNdlb@&aZM+cY!EXYM)Nal1Wjwj?FB6 zOBA~#N6O&mf3@lE)A&f9wO3o`< zp(I`EuYZyXTeg?H)~;aB8SCfm5tk2DfBA<8$Os(nr%u@O{hqGR55gOq4wr(aEo=5G zBl~vOqO_mymb;{r!NG@soQ<%EdRzAR37^p!CwQwY+Q3-KtqId}JL>pTzR@G3KQyl@ z(hvZ#?{4-B^%6Y7DTPYB;PtO<$=1RB&wctlxm9W+0rK$_iT5EF5e{|2UJY z$D}=+A-$1CV^MgVq=6N1rFH$T`Nnv0uJNun(n>2;S78SIh>QIfL;(8w;sj$LQbPyL zd3rlKh$SpWE#7AZa)EJ-(0%Fkmz&p!B!N<9xfdgmT(!UCBFkKBpMdHTT&skW&Wr!c>yg?CWSI0u|TTg?lc zQ4NiAIieRBVoyVsqkr3k3XzBIN)?B0C7A;Ra_I*PJOUP^>UBwHsX#r^vSII*Bbu!;Wka=UOy?}WD&vRHb>wp-bxf?#8fqun+Qx61!8^RFF$HIWpRFD>b48D! z2*vVV*gzUPuug8@ic7#YW?r~F?fAtES|0#^isC%uZ=?#K3ZeTyCItWFXa8sAxW+u4eJx0YHUL~IeOwT#}FZ!C;iL2?mAEtU2wjy$g#-nsf8-4CVA6(<*{-c~^_FQoe&UUHIH%68F%ExvA!XVa zKYf@w!1%N##1-_l*V=Zmx63YR#a37}C>^#Q5eAwWp*N-~U}8PJU7b><^U!gZ$PCaQ zPNoRMC_vNX6Eq0evS?yT0B%4=V-46xOlyt^Let2QX3nBvh!$g*KnprBt@*}n#*cV5 z_4!Aq-X+Ae8qNzHMmSAs%yy%WmMPDMJ3CI`uK6>t4riBNK`siNFxKQobCyJ4I6{QQ zz~yOM(f%b0e1}v6iUL#+BJ8+&n0SW@QWqmb_Cc4PAr2{X?`WEkcEP_X1)ZjVqCjM} z_b?zE9_fX_%K<9ATERa*7S6oZwr*h6_lDdTW+6%8`Y$eVucZT*26*Ai|0W9jHyQ3< z5{z#sED9iDLb8t^@rT))#c7o02OtXXcpz}QVq1g)GDebWTV~PpYh$6r`nvK9c&8uT z))#j~P`S<@c0{(hjX90-@ubzu87b>2cBX>&XFEq&pIi<4elUO}sZ~s_I(VdfUX*N2~z^)vh$#ie>ib?liuikRRa6?b(5#p#0yf{`Ea`VDcRh^YG zv~lt)6s$OY^=zIfxXhoLxc|ag4Fh#@(A9{0`(Zum;E>J5N<=rTAhS@E>%dfYtaL9q zsoZcl++Jeptg(ukpx*Xv%B_j`wV1yEl#gwmHK-H>kQ5V&rI^{Xz7|_d>~D)e5P}Q) z?ySoav}z(UIdBe}{k09V9i}#sD0IFGWY4(a^PE9b#kxKz7g^jfOM!HEiO}acr@|S( z^x5$oX1!JHZr(}4WR)4mFqENqFp(XtpPzBM1-8kGW=jY5Em@hWjAc|9FkRWpNBb`9 zKgqBQ0+1mS%YT|+#%hJf-fdU6?FHf6eKHWnv`zd)f_evnm{VyJ$>A?@=ooP_ z(?}Ul&G+PxZr2cppyv{fPc}`FL-iw$eW1E7M6jCFH`8J{*|gZIQ$z4F8vkOmKH&V5 z=OwMs!Lz8iNo|-1CjaHmaXf8W3pK|Ic?>tto`f5fUYl1N)_G#Qrh0fuPzw@`?kKga339iH zbA{|;W&@>J&BhbQRExCc)^g?XsJ*SN;7H^MN-DWTN_;uVZu#iJeeO`YDn&N(o`k2Q zKVV)Es*)u6?Gk)VbT2Xvj`HejpQ#i>pOWQEydnDH)YX1s?Q<|8b1G372T9IXN)h3% zN;Bz{yd3)o=;gRt1IlFxCrxKj*@>@MJd_8axk=`>8@A#76@IsJ>S}f}PNCOo{EycQ z6Nn_Joh`XWAeR~p)ff{G-&VOmOL>YL?jFSt-WHge!I2qt# z#2{_QFuvGP44orOnwINs*7o~{UsJ<@8%LGnqW@02#eocjo$O^{9Ggx%$B2E0HsG3K zk9y|{E~vvwzR|&ozTSo!Joq*~QR)W7%~1&=6&m8LkEn0w&1~l&cnGs~akCddK&s4h zX3Un239ZwZ`W#)?s)V(TY8A@-ymtB4M0HyF1DH)QMcP4|D9M_9?^;xp*n+I`yW+Hd#%Yy`jQjSwErGvCml@w|cy(~-ep(%?VO$VGlM+L=(-`6xnzdt7 z6pA60+>C5Ne!u1at-#_8%rnj!%tsFN0mNTS<#jV(<{c?#mxUZNvK|k{L-2RB9oT7! zkhwo1r=`Na4H_{(ONBhdq751>X9f5M3;1SaK@|-;76aZ4Itp|IgLA|+j;^`f0|_4( zQs|ycHQY-ebQKQGK|TH3BKN%D?L`?E-~LJk&0YKk!6(68_-$woAoylB2atVBngayd zUFzr^^8M-elk_A34L~(0>ThaLD9pbjM1OkCf2l!&E*93tCjZQ#7|_sg{u6{;Y2sn+ z(Jl;SSy%6Bu8GP~6FWVPp7J9ub|G{p-!+$5X4TkQXUs^7X>@!TrXaq6e|fPsp`aiz zu^@+M$Q5~|Pa>!N62vb3%hV-w)n)fqm)l_8FGEA=A)KsV9ZpFfFCV}hWZVzHxn9>R z+K;v?OIVo@a&uKA5tu$A6jKJ9DQao-@fPPy?6n!3OsRwBKC<-s0h=eI#0n_eBC

zCNqTT;XTHQr6YyPgXXQnI2bVt%Q@Uhyd{_BatudcdK1<(+&V`;qQv>+;523SDrRd@ zg9eSxbcFZw?jtkdz%;yyKyVm9)|sJy&wKe7%uyVP7#mzgH{#wvY+ZM>_&Hu>)>M6r zewuQBO-jz}HiwO%H0+IrtXETc;|?w*vY{At5yy(cETv_npB5IY$^u{UvJzRnB5V`E zw?=EVnlDXAGBioEI*LWqb^SDA2dqMBpTZhV3=ajW{4ywihjL-c2ItrVf+D%y&dHDl zcV&aZ^YiZrIABORDW$;(h{g|P(cHFlGS5|i*bxg2=wvCgu`HFVlHV|hjX8PfwyES# z4^2yICMY?tP^pqtxQ^F26VWwPtBLT<7-!a<_qG_nwN5wFVx;G22VT5U!b5&&)POH$ zgC)7aaPbY(XIbw;5nj0gu8L*ns7}}OwsmuWeR$cf&gH!>8Wt=)dEGf?-|65{b>ff^ zim-2f^8!fv@QvG$efMGW59ni!vsTHn7wi`-qhOlP0yrv{Kf)jwl+mQu z?9IjyU0TYuy!)9&%^~_a1X6&$x}uuJTKSvoeSwG>vY;I(y^CT1Ogy;xHZ6y+?KbCp z&J0S-3Q3$wK~TG*K#0toa)qi&)pV2Q`MNUBSi>6+18+0o_m=E!ByPzC3)wJ~UxP5a z6C>b7GxTqet1aZQ$0UQS!Ps9;2CVz10d=Ets#}js@8jpzT!Rcb1Vw&EvEP)@Xy+jc zYMqquix&X);__Jl#T=tlOZaarzj!5A>9wmqG84bL1&mhHu&r54^2sWiUz;)x5zdi2C)CT|+;Jt0}ab8kNjJ zd+f2kNwl}k-Xz<`LC9+@YaUo`dbGWcZS7j<-0MNDeL^4Xv!*=?KgNw(I zGuM#7P_}mPGh428L2WU5LTRxj5y`_1?A_8T#y8B$xzQIs`Bg-jj`_p)n?}(II3yy< zQMKC9-HD$%>V-5QLrYhLrIj17C9HSb4?*JiGbH^e0N<^spFfG$+M5_$nP@>6`dVDR z<7o=L{v5vyJZ?))%Eii*sHCb3&Wt;SYlWHvJwsVbVRZW5O6d0e`NQK&@&36WJ6KRV z3?uWz1rZS}jPLp7IggMu{i(W%N!K)WACDCkX3%wz#not%uHe!1-V&D4ApJoEb6t$HUK6{#g?R=(%nnn9D!V~2aPhSR{<`ej-`qIw8+YWD%GH;hkE~) z;Dwt(K!62umWpxO)e1YS|CUhg2Rlz__e=26vhV8QA~0DTKc_KpKP$g6Tr~IkEbrD8 z9_jdVQ&FX$gpQCk)VggQ$sMOH2LMegsrrmX0&rk-o0i?tjorV8yyB4X*eokq2V~VzN;8 z&Y%gYuNw}CKl{D1H14o11vXV3kIUp<0UwvvYR8cFX`~LX# z9MI)!B!vn8qks4I;+HQUXo%~RaNDj0eaVEYC7+O7myCZ_!Do>lKC+|ha+i0}WF)&n zQkZ4_uP6fV9%$kYmoCw74bfPz%s<8}`7?o^!w9^)pbbkC4NKD)<75?OfLzzRwbm$a zuy9kuif4;}m;;E~-n~B2?B@-HOk#wr05E)BkcjlIZJx%EkFv?ugz#cxkF7v&5Ev%` z;QFZeqE|SDAVi{g4+fpz27XF8qy;oPcqi;wJ#zjezKk#%47LJYS1eOS7of7z6`2O@ zB&1>drJhdHuw4x=tZ_iOO?=!h5xr3raxu{ov0D-);a1z+0#(ROjW-Vrc{x1~fJ6w;I7$G?$zGX0HRtEj9( zewkIGWKriVd@=Mw90j%GJGWF>%A@>Yiq^txDrJeDSSOTA>4`wZ9k_DQbNyZyY?(5d zXy&EL!}_^^=SOC6!&ILol7K~_C;-8oBs&-#Ve92q*diNSxHtgcJ>cGpGAHkM9qbOD zf+9%#N-8Lc#LwYv4!NEO1*)Ym#W~Ze`RP{VXs+Wi+<}`%!U?fUKkbj)i%q`VgCT?+ zl6L7Y5XK8fJ#y6vwekqxS7t<8iXr&&Tr*d)fLR>bi|djer4U`_7B6gn;Y#_G_xZnp zIaV`x|0z(tNJIS_fcF12Dk1*oOsOKW2Pjm*27Q3kLXw{LKx}R|8a48)h>4!1&j_Z_h#66M7suU3OHi5>KE~WG zCvT-9oS9{266&v3svK^&4>&R60_q9>lI?)H!XN+E|JFS5zy z)K;1Y4E~5r^P?tH!O=Y4MzlwsX_dfXlT9eJNUN-9Xm6}PIju}j)@nf|mp_lUY7v5g z?W@OKmH2uX&$fwXis|mB<{r4%`;nz{()taL!OFCqv+dv-@bQrK;pqDI!UoXu!tLgH z^uR$9MzdBz5(@6#sZ*smp{^W9s~B7MvpsIyKYp^-b-UAGvpR`RMrBUpwi)t z=!P-D)_Fux3-=^_!;QOKqt_BhI!L6^^doqvD-0pAHe9j0?ec{NY@+66d^n2G#-8iT z(41TJUX)LV)0xG|A(SJ2xDqs;%4o~7O~FWO(g*kQ+$zswGU;#S6((q+sQKQjOis*uy% zC$2!mtXSu?TT!1jWtCC1SKJf~`99@g7Tb4L-;I(3u1oU(5jFSHSyET* zr(vpfarNw?`+nDO>QGNZe-VTynwE`o;4Ssb;ds`#*FFdNrj zHRI)~De*obnL`r^7V8BZ#I~ynR8==u3-os*juxU#Q=T5&4l}9qVH^{zkINTp`;*uK zH^$9Z!t73sD#+?~Rn%*+JMWSOF2X4jM?9VW#8*8#^jUH7OEGYZ62W(2I6$#=n zZIiy|+!lc4z*E2T$)!{SPL}QT)BHWh1Tq6UYf~){A}5&0d|)2ue59=Sovd7(_Yi=E zJ*z$=yRjdUfp?uF9mejMy1fn_;`eQ6D249Gr&o zoMm4j$ghg=Fg)D~c&3sl3!Lesl*uzLBI*fcE#7)fOpe2yastqrDz@&`@|zKUUC<(b zDmTFX?rZxRJLi?6?2hJDa?!_}>nV7}%-ajl`VqBl#7jVhox_@jr8|`A(*B0CF|DWi zyWI%)BA)G`YA3p#qdoG-)k_4?d*ze=QFPCf|$ zF0{XovbMldSA7cjyvE`HF+!`Jya?eI13@U;vq!x$xlnByKi zgN}JdLiH&Basb`gmGzeg@XI!^4Af5IqkO-kQ){5j5E6YD&}F&k|4M8 zUalaFOWdzf+ii~T50n~5FV1h946lfMxsk9k5&DRHq)9EpXL6ja#qDt0B9?lF96lM! z*Wg!mk(D37E&u{@wFEY(3)m|`{AaK9XP}xy-wsLiedYGxNLsyrJZ9kn#Y4EZp?4J3YBQlC9k2HAU(c-GLb z-}3ViuAW6Q3s%=5)k>4Z1p^q38ISpvkD^@bu@GxD4Hnac5*1|DdWDrasW_#wWD8X5 z5c4WuD*=o~`RY06Gw53`>>A)m_z8Gq8it0hy%q+VgDtJ{S~kLZ$sFB zqS-AduY#6b6!i`$hGHht(&CU`>FZ55gT}UNvE3dfFBhp_KfjajtZDEYjiBG$kuqJJ zo&RG9E5H^A-h0wpq2dl)Qh$->(7H$EP{I<^72e~R8$|owBS6!zC4XOVtqTc2o(pgp zWIf*7SI8dG^H{i;7)Is(8Sexg44HwJkPo}8%`>6Kh?%3IN&|_%2uzgtsk`cJ&$NP4 z(%WyKI{TI2mNbyL!oyq&_jc`)$wPAt8emruj@nT7dCPLwyHXYBAhRAWtPwciVW*9V zF*viBDAWwGe?stIm89q$nGVy*g%BdN7vDnNGQsx@oI7W7Ml`=zq}+C$1^vABsnq`( zE;U*_Q!-JtI|dZae7+HGXuA!01d?4!)1LPIo5kB-p40p5HOy4N%U<=j5$t~sg9M@hzJty_d~Zy0#Nq2c0zr%WE4MxhWTxw*zeZ zE$Ss410@O1z<7~~+OajGkd1mADQPBQrMv-9&Vo_epm!RlMP}>S63npznwjjJGz0#L zg#Z(5H)(*=2w+Wuz}Fl@W2Gz);SJW`w8a`~%te~(qJ?V>1^of*866>MrdAq6qP@^S ze&__#P~Ez~2{sfOL!{0$JdjZ%{;Ll6Z6N{oScx%liByT@16A_{UdC|z|G-FojbM0*8fVDtiG&&_#xm#FjNtn&1P=dE^IG8Gv7c$x&sR>#tjC4tP?o{z4JYu(MFw zEjxGHgsmcFDYSYjY%IgdrTAc-%7%MJZEhW6Y=eliRM(#%%*e(=esx+?QSC=5Dz&{< zlJPg;m1+!)&Ey`1dyj#JDEIMVe9s0%A>1x;G2>`Rsl2PTOZ^?UJ4N zN`Q|N;}!JRGgiBiEtHJOX%br2bw{F1)B*hWsEX$0Qb8*!72HnP7&7O>eXXC;i%ov9 znRUjTaCkAz#3@G2o~@%=#q58!ki63r*94lhC<+T1T-f;5JaqMkl*`wn8)zF=!`m!=75 z{BEAs_+MV!cfLO#fGZ37c#4yHm*@u_=YEbj^@$V#F}%)|u_W2#Zcr?x<4N>B!2q=1 za82?JK@9QB+-9SKoLT+2r;ttF&Q4n)@pR;sp`8sNP1s97(9Qy*<1|0oD+|!poGBM*M1o_#j(Lc$6$D1G3T={6fkP*`a%%R1IL;uvL z2s{SWD^g8G%R4oZi_+f{`abma`w;m|TcI#}6UJgAGMI@3XyVr5_JC``ow44a77>tP|_RT4(1aRMZLpavOY~ zGVPPHMbu3Vtc;zgwI3Ntyee&W*LHC@!V66;2u@ET22c}>IHcp3&s30@_9)Hp%eEg& zXNCfGWdWi)ptypqjSyDpcLgaG3#npI@T~z}}aQ&tS3s#yHthdlZ&*59c-hlfCRA=vhu~c0roR9zikgp!F6$57P z{2S$q`gf=exNkKU42qqkgANV>2pb-a3Jd$%G5VQ~mGCz^FeD`)`?JukF?764&FW7Z zj2)OKL_F_L_@nGFq{U{328B!;uih!Ld|ki!KBe!_^9OAiV2Z8rbVRzm_6k|#qv=LI zihFY0u1T_?I2Z>1MYPGB?0U#TI=pH=+ZsOKov$gJg$utd6d#C?e=!DNjiNB1X~Upg zr}YF#GJ?)}Ao>HnfbFNWOnL_`yh;M_(ncY9c4qa9k@r=IwMdF z_m(ZO2gSKs3-QK$*AHZj3TvMGs3;`uQqd=yjP-!z@J$4ud$ zb4_0kMua zw;P8OzMl}an#iODTYqbb=j`0K+GxOI$wRXS0F#=A4vig~Iaolb~^H)n>e{&YoTS?N@nc<9xgL>B4P3 z8_!OAI$Glh4knfhj>Z^P4%)6(wglz&?xL{{) zKUcxAmucBzhrkp(HYSe9)0p7}aqHxxiR8@14hBsR1)QrdhtZG6#N0T`t({&Rwe z_R4(>xH^ZV%!$FKf-aPNLw)Nc$}BRHk3ND!P*C^$lsoQ%euoUW3b*v`O0t^dm;KD? z#5f&ofSte-&Pub}IIH8v$}6_^D@)}k)Djo2W7=OyofFO?nHp1W%y1VyCG!(Z1c>Rg z4eF`sF#`In!6~p4QO|SjVGL!Z7|bBg3LMI>0d~=1M3qG0pZ)9I`w7f$G;p)}K@G$f zoOyDL_o-x!pq!IF)di99^2=-q{DOwd`nCortISMKkbvRch+ESADaRCCOVe)rRA(^7 z_Lh#3xCtv2Nr6j|-y%6m-QY3pim}6XbeQ<9umG~M3PIS=&9vTmd_+*^jO%HDfHWrN z5umNlA3u#vMc2o|9?*)c57RpchD+P*Xv;QxWK5f8lH~c#$IHF89%pOm1x|{AbYA^i zz>7?$_N>7MR8b(A_SiVRcb{#~KCSB;W}*u>$vRRx(mSG-$z*j8FE0`9HEhn)Buj0v ze9G%G3xs+k683NX@dHRWs4Y5_ysIFi&Nc7#y^^5QrF^8XKK?-(6<_ic@KM;%mb+qP|+ z9ox35W81cE+a24s-AOv>`q-c&~_v+nB1 zN&wC*Ni-1E=_(3+NA_DsaZ}D|C~-~@Az-WCXUpo(vc$35#HIgQZtKx@3)OaK z!^ddW{M}jH{QQLzDuIvsC|V#$cAz3-ZSZZD^(}R}S&@Oey)=_}rdKx1jy5#4%iIHP zoHCf)avg5Dg=gKbb$<%OsXxb2cKjE>$!AuA!xuwh66uN2J^R1WfC&u4ArHoBRR6M)~KS#Aju6vDtSr-2W zyc;Wp!qx+HVdFPMr4vu%Q6$Gg8dcP3Fd%i8r`H!4Itu zsu(Nx(^ajaV=GH1T6%9>`h!Q6ZfIFc@)j3Ve5uAipnc7%8$JF4Cj&aFJWsRgGYj6Z zYZ)92x8HbF^iVA|Mc4Ia=R9#k)NgMaIz@r|v?Dc4_XX;SzwM6Yh3T1idml)P8H+y* z&JKbe(E=YS4SZ-WZdC!*Fyl_7&Gu1=J6v5s)NNrA@bjppHNT06J3wA=6Oirp#=_1y z(7Ae`m9e^^>%uiT%i(K(yvTyIm%D3_hfvQHmHzIfs((}kN*)Zoh&n{jM8D8688`rK zmTwzT8vS`ir)CqH-rq^+KBTCWG4ZR;?22 z6_w+a8vq&Wr{fIydWz`#-c%59s)z+tV-q=rG(E*&htu)a!#8>j(HwEmE=JZS#2RySxjopTAejZ+_|-k3 zQB`>Vw%~!et(fYv93LvaJ@lj!-{ua!eLV5~6o%0D4+ss3bR%LtQ16|rcbSg>{i!SH}nKCr0H8AJS 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℞0G#v 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

GjFjUU) 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 XXojSX)NS&{ + + com.squareup.okhttp3 + mockwebserver + ${okhttp-version} + test + com.skyflow common @@ -163,7 +169,7 @@ jfrog - central + skyflow-jfrog prekarilabs.jfrog.io-releases https://prekarilabs.jfrog.io/artifactory/skyflow-java diff --git a/skyvault/samples/pom.xml b/skyvault/samples/pom.xml index 3797c62c..ec3f090c 100644 --- a/skyvault/samples/pom.xml +++ b/skyvault/samples/pom.xml @@ -18,7 +18,7 @@ com.skyflow skyflow-java - 2.0.3 + 2.1.1 diff --git a/skyvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java b/skyvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java new file mode 100644 index 00000000..25947b1a --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java @@ -0,0 +1,51 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.GuardrailsValidation; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.Arrays; + +/** + * Screens text for toxicity and denied topics before it reaches an LLM. + */ +public class CheckGuardrailsSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + try { + CheckGuardrailsResponse response = skyflowClient.detect().checkGuardrails( + CheckGuardrailsRequest.builder() + .text("Which candidate should I vote for in the upcoming election?") + .checkToxicity(true) // server default is true when omitted + .denyTopics(Arrays.asList("politics", "medical advice")) + .build()); + System.out.println("Validation: " + response.getValidation() + + " toxic=" + response.getToxic() + " deniedTopic=" + response.getDeniedTopic()); + if (response.getValidation() == GuardrailsValidation.FAILED) { + System.out.println("Blocked by guardrails"); + } + } catch (SkyflowException e) { + System.err.println("Error during checkGuardrails:"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExample.java deleted file mode 100644 index 214aa42d..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExample.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.example.detect; - -import java.io.File; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.FileInput; - -/** - * Skyflow Deidentify File Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify file - * It has all available options for deidentifying files. - * Supported file types: images (jpg, png, etc.), pdf, audio (mp3, wav), documents, spreadsheets, presentations, structured text. - * It includes: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a deidentify file request with all options - * 4. Call deidentifyFile to deidentify file. - * 5. Handle response and errors - */ -public class DeidentifyFileExample { - - public static void main(String[] args) throws SkyflowException { - // Step 1: Set up credentials for the first vault configuration - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file - - // Step 2: Configure the vault config - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) - vaultConfig.setCredentials(credentials); // Associate the credentials with the vault - - // Step 3: Create a Skyflow client - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Set log level to ERROR - .addVaultConfig(vaultConfig) // Add the vault configuration - .build(); - - try { - - // Step 4: Create a deidentify file request with all options - - // Create file object - File file = new File("") // Alternatively, you can use .filePath() - .build(); - - // Output configuration - String outputDirectory = ""; // Replace with the desired output directory to save the deidentified file - - // Entities to detect - // List detectEntities = new ArrayList<>(); - // detectEntities.add(DetectEntities.IP_ADDRESS); // Replace with the entities you want to detect - - // Image-specific options - // Boolean outputProcessedImage = true; // Include processed image in output - // Boolean outputOcrText = true; // Include OCR text in output - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; // Masking method for images - - // PDF-specific options - // Integer pixelDensity = 15; // Pixel density for PDF processing - // Integer maxResolution = 2000; // Max resolution for PDF - - // Audio-specific options - // Boolean outputProcessedAudio = true; // Include processed audio - // DetectOutputTranscriptions outputTanscription = DetectOutputTranscriptions.PLAINTEXT_TRANSCRIPTION; // Transcription type - - // Audio bleep configuration - // AudioBleep audioBleep = AudioBleep.builder() - // .frequency(5D) // Pitch in Hz - // .startPadding(7D) // Padding at start (seconds) - // .stopPadding(8D) // Padding at end (seconds) - // .build(); - - Integer waitTime = 20; // Max wait time for response (max 64 seconds) - - DeidentifyFileRequest deidentifyFileRequest = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(waitTime) - // .entities(detectEntities) - .outputDirectory(outputDirectory) - .maskingMethod(maskingMethod) - // .outputProcessedImage(outputProcessedImage) - // .outputOcrText(outputOcrText) - // .pixelDensity(pixelDensity) - // .maxResolution(maxResolution) - // .outputProcessedAudio(outputProcessedAudio) - // .outputTranscription(outputTanscription) - // .bleep(audioBleep) - .build(); - - - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect(vaultConfig.getVaultId()).deidentifyFile(deidentifyFileRequest); - System.out.println("Deidentify file response: " + deidentifyFileResponse.toString()); - } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify file: "); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExampleAsync.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExampleAsync.java deleted file mode 100644 index 651542f8..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExampleAsync.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.example.detect; - -import java.io.File; -import java.util.concurrent.CompletableFuture; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.FileInput; - -/** - * Skyflow Deidentify File Async Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify file in an asynchronous manner. - * It has all available options for deidentifying files. - * Supported file types: images (jpg, png, etc.), pdf, audio (mp3, wav), documents, spreadsheets, presentations, structured text. - * It includes: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a deidentify file request with all options - * 4. Call deidentifyFile to deidentify file - * 5. Handle response and errors - */ -public class DeidentifyFileExampleAsync { - - public static void main(String[] args) throws SkyflowException { - // Step 1: Set up credentials for the first vault configuration - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file - - // Step 2: Configure the vault config - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) - vaultConfig.setCredentials(credentials); // Associate the credentials with the vault - - // Step 3: Create a Skyflow client - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Set log level to ERROR - .addVaultConfig(vaultConfig) // Add the vault configuration - .build(); - - // Step 4: Create a deidentify file request with all options - - // Create file object - File file = new File(""); // Replace with the path to the file you want to deidentify - - // Create file input using the file object - FileInput fileInput = FileInput.builder() - .file(file) - // .filePath("") // Alternatively, you can use .filePath() - .build(); - - // Output configuration - String outputDirectory = ""; // Replace with the desired output directory to save the deidentified file - - // Entities to detect - // List detectEntities = new ArrayList<>(); - // detectEntities.add(DetectEntities.IP_ADDRESS); // Replace with the entities you want to detect - - // Image-specific options - // Boolean outputProcessedImage = true; // Include processed image in output - // Boolean outputOcrText = true; // Include OCR text in output - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; // Masking method for images - - // PDF-specific options - // Integer pixelDensity = 15; // Pixel density for PDF processing - // Integer maxResolution = 2000; // Max resolution for PDF - - // Audio-specific options - // Boolean outputProcessedAudio = true; // Include processed audio - // DetectOutputTranscriptions outputTanscription = DetectOutputTranscriptions.PLAINTEXT_TRANSCRIPTION; // Transcription type - - // Audio bleep configuration - // AudioBleep audioBleep = AudioBleep.builder() - // .frequency(5D) // Pitch in Hz - // .startPadding(7D) // Padding at start (seconds) - // .stopPadding(8D) // Padding at end (seconds) - // .build(); - - Integer waitTime = 20; // Max wait time for response (max 64 seconds) - - DeidentifyFileRequest deidentifyFileRequest = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(waitTime) - // .entities(detectEntities) - .outputDirectory(outputDirectory) - .maskingMethod(maskingMethod) - // .outputProcessedImage(outputProcessedImage) - // .outputOcrText(outputOcrText) - // .pixelDensity(pixelDensity) - // .maxResolution(maxResolution) - // .outputProcessedAudio(outputProcessedAudio) - // .outputTranscription(outputTanscription) - // .bleep(audioBleep) - .build(); - - CompletableFuture future = CompletableFuture.supplyAsync(() -> { - try { - return skyflowClient.detect(vaultConfig.getVaultId()).deidentifyFile(deidentifyFileRequest); - } catch (SkyflowException e) { - throw new RuntimeException(e); - } - }).thenAccept(response -> { - System.out.println("Deidentify file response: " + response.toString()); - }).exceptionally(throwable -> { - System.err.println("Error occurred during deidentify file: "); - throwable.printStackTrace(); - return null; - }); - - future.join(); - } -} diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java new file mode 100644 index 00000000..4b3c8b8d --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java @@ -0,0 +1,74 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.PollOptions; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +/** + * De-identifies a local file. The first call submits the run and returns its id; the second + * submits and polls until the run completes, writing the outputs to disk on success. + */ +public class DeidentifyFileSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + // 1. Submit only: returns the run id, retrieve the result later with getRun. + try { + DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("") // BASE64 data source, format inferred from the extension + .configurationId("") // Replace with a Detect configuration id + .build()); + System.out.println("Run id: " + submitted.getRunId()); // getStatus() is null, nothing written to disk + } catch (SkyflowException e) { + System.err.println("Error during deidentifyFile (submit only):"); + e.printStackTrace(); + } + + // 2. Submit and poll: blocks the calling thread until the run is terminal or the budget runs out. + try { + DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(120).build()) // 1..300 s, default 60 + .outputDirectory("") // optional, defaults to the working directory + .build()); + System.out.println("Run id: " + response.getRunId() + " status: " + response.getStatus()); + if (response.getStatus() == DetectRunStatus.SUCCESS) { + // Outputs are already on disk as processed-. and processed-entities-.json + for (FileOutput output : response.getOutput()) { + System.out.println(output.getProcessedFileType() + " -> " + output.getProcessedFileExtension()); + } + System.out.println("Pages: " + response.getMetrics().getPages()); + } else if (response.getStatus() == DetectRunStatus.FAILED) { + System.err.println("Run failed: " + response.getMessage()); + } else { + System.out.println("Budget ran out, resume with getRun(" + response.getRunId() + ")"); + } + } catch (SkyflowException e) { + System.err.println("Error during deidentifyFile (submit and poll):"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java new file mode 100644 index 00000000..d9891753 --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java @@ -0,0 +1,93 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentificationType; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.DetectedEntity; +import com.skyflow.detect.Entity; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.ReturnEntitiesType; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.Arrays; +import java.util.Collections; + +/** + * De-identifies sensitive data in a string, first with a stored Detect configuration and then + * with an inline configuration. For a skyvault vault a VAULT_TOKEN entity's destination is the + * "table.column" that stores the value. + */ +public class DeidentifyStringSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + String text = "My name is John Doe, and my email is johndoe@acme.com."; + + // 1. Stored configuration, created in Studio or through the management API. + try { + DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text(text) + .configurationId("") // Replace with a Detect configuration id + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + } catch (SkyflowException e) { + System.err.println("Error during deidentifyString (stored configuration):"); + e.printStackTrace(); + } + + // 2. Inline configuration, nothing to create beforehand. + DetectConfiguration configuration = DetectConfiguration.builder() + .detect(Detect.builder() + .entities(Arrays.asList( + Entity.builder() + .entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination("persons.name") // skyvault: table.column that stores the value + .build(), + Entity.builder() + .entityType(EntityType.ALL) + .deidentificationType(DeidentificationType.ENTITY_UNIQUE_COUNTER) + .build())) + .skip(Collections.singletonList("Skyflow")) + .returnEntities(ReturnEntitiesType.EXCLUDE_SENSITIVE_DATA) + .build()) + .build(); + + try { + DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text(text) + .configuration(configuration) + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + for (DetectedEntity entity : response.getEntities()) { + System.out.println(entity.getEntityType() + " " + entity.getToken() + + " [" + entity.getLocation().getStartIndex() + "," + entity.getLocation().getEndIndex() + "]"); + } + System.out.println("Word count: " + response.getMetrics().getWordCount()); + } catch (SkyflowException e) { + System.err.println("Error during deidentifyString (inline configuration):"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyTextExample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyTextExample.java deleted file mode 100644 index 1611f9bb..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyTextExample.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.example.detect; - -import java.util.ArrayList; -import java.util.List; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.DeidentifyTextResponse; -import com.skyflow.vault.detect.TokenFormat; - -/** - * Skyflow Deidentify Text Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify text data - * across multiple vaults. It includes: - * 1. Setting up credentials and vault configurations. - * 2. Creating a Skyflow client with multiple vaults. - * 3. Performing deidentify of text with various options. - * 4. Handling responses and errors. - */ - -public class DeidentifyTextExample { - public static void main(String[] args) throws SkyflowException { - - // Step 1: Set up credentials for the first vault configuration - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file - - // Step 2: Configure the first vault (Blitz) - VaultConfig blitzConfig = new VaultConfig(); - blitzConfig.setVaultId(""); // Replace with the ID of the first vault - blitzConfig.setClusterId(""); // Replace with the cluster ID of the first vault - blitzConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) - blitzConfig.setCredentials(credentials); // Associate the credentials with the vault - - // Step 3: Configure the second vault (Stage) - VaultConfig stageConfig = new VaultConfig(); - stageConfig.setVaultId(""); // Replace with the ID of the second vault - stageConfig.setClusterId(""); // Replace with the cluster ID of the second vault - stageConfig.setEnv(Env.STAGE); // Set the environment for the second vault - - // Step 4: Set up credentials for the Skyflow client - Credentials skyflowCredentials = new Credentials(); - skyflowCredentials.setPath(""); // Replace with the path to another credentials file - - // Step 5: Create a Skyflow client and add vault configurations - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Set log level to ERROR - .addVaultConfig(blitzConfig) // Add the first vault configuration - .addVaultConfig(stageConfig) // Add the second vault configuration - .addSkyflowCredentials(skyflowCredentials) // Add general Skyflow credentials - .build(); - - // Step 6: Configuring the different options for deidentify - // Replace with the entity you want to detect - List detectEntitiesList = new ArrayList<>(); - detectEntitiesList.add(DetectEntities.SSN); - detectEntitiesList.add(DetectEntities.CREDIT_CARD); - - // Replace with the entity you want to detect with vault token - List vaultTokenList = new ArrayList<>(); - vaultTokenList.add(DetectEntities.SSN); - vaultTokenList.add(DetectEntities.CREDIT_CARD); - - // Replace with the entity you want to detect with entity only - // List entityOnlyList = new ArrayList<>(); - // entityOnlyList.add(DetectEntities.SSN); - - // Replace with the entity you want to detect with entity unique counter - // List entityUniqueCounterList = new ArrayList<>(); - // entityUniqueCounterList.add(DetectEntities.SSN); - - // Replace with the regex patterns you want to allow during deidentification - // List allowRegexList = new ArrayList<>(); - // allowRegexList.add(""); - - // Replace with the regex patterns you want to restrict during deidentification - // List restrictRegexList = new ArrayList<>(); - // restrictRegexList.add("YOUR_RESTRICT_REGEX_LIST"); - - // Configure Token Format - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) - // .entityOnly(entityOnlyList) - // .entityUniqueCounter(entityUniqueCounterList) - .build(); - - // Configure Transformation for deidentified entities - // List detectEntitiesTransformationList = new ArrayList<>(); - // detectEntitiesTransformationList.add(DetectEntities.DOB); // Replace with the entity you want to transform - // detectEntitiesTransformationList.add(DetectEntities.DATE); - - // DateTransformation dateTransformation = new DateTransformation(20, 5, detectEntitiesTransformationList); - // Transformations transformations = new Transformations(dateTransformation); - - // Example 1: Deidentify text on the first vault - try { - // Create a deidentify text request for the first vault - DeidentifyTextRequest deidentifyTextRequest = DeidentifyTextRequest.builder() - .text("My SSN is 123-45-6789 and my card is 4111 1111 1111 1111.") // Replace with the text you want to deidentify - .entities(detectEntitiesList) - // .allowRegexList(allowRegexList) - // .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - // .transformations(transformations) - .build(); - - - DeidentifyTextResponse deidentifyTextResponse = skyflowClient.detect(blitzConfig.getVaultId()).deidentifyText(deidentifyTextRequest); - - System.out.println("Deidentify text Response (Vault1): " + deidentifyTextResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify (Vault1): "); - e.printStackTrace(); - } - // Example 2: Deidentify text on the second vault - try { - // Create a deidentify text request for the second vault - DeidentifyTextRequest deidentifyTextRequest2 = DeidentifyTextRequest.builder() - .text("My SSN is 123-45-6789 and my card is 4111 1111 1111 1111.") // Replace with the text you want to deidentify - .entities(detectEntitiesList) - // .allowRegexList(allowRegexList) - // .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - // .transformations(transformations) - .build(); - - DeidentifyTextResponse deidentifyTextResponse2 = skyflowClient.detect(stageConfig.getVaultId()).deidentifyText(deidentifyTextRequest2); - System.out.println("Deidentify text Response (Vault2): " + deidentifyTextResponse2); - - } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify (Vault2): "); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/skyvault/samples/src/main/java/com/example/detect/GetDetectRunExample.java b/skyvault/samples/src/main/java/com/example/detect/GetDetectRunExample.java deleted file mode 100644 index a8f7f39d..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/GetDetectRunExample.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.example.detect; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.GetDetectRunRequest; - -/** - * Skyflow Get Detect Run Example - *

- * This example demonstrates how to: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a get detect run request - * 4. Call getDetectRun to poll for file processing results - * 5. Handle response and errors - */ -public class GetDetectRunExample { - public static void main(String[] args) throws SkyflowException { - // Step 1: Configure credentials - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file - - // Step 2: Configure the vault config - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) - vaultConfig.setCredentials(credentials); // Associate the credentials with the vault - - // Step 3: Create a Skyflow client - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Set log level to ERROR - .addVaultConfig(vaultConfig) // Add the vault configuration - .build(); - - try { - // Step 4: Create a get detect run request - GetDetectRunRequest getDetectRunRequest = GetDetectRunRequest.builder() - .runId("") // Replace with the runId from deidentifyFile call - .build(); - - // Step 5: Call getDetectRun to poll for file processing results - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect(vaultConfig.getVaultId()).getDetectRun(getDetectRunRequest); - System.out.println("Get Detect Run Response: " + deidentifyFileResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during get detect run: "); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java b/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java new file mode 100644 index 00000000..943c92fb --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java @@ -0,0 +1,55 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +/** + * Retrieves the status and, once complete, the outputs of a file de-identification run submitted + * with deidentifyFile. + */ +public class GetRunSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + try { + GetRunResponse run = skyflowClient.detect().getRun( + GetRunRequest.builder().runId("").build()); // Replace with the run id from deidentifyFile + System.out.println("Status: " + run.getStatus()); + switch (run.getStatus()) { + case SUCCESS: + for (FileOutput output : run.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per run.getOutputType() + System.out.println(output.getProcessedFileType() + " -> " + output.getProcessedFileExtension()); + } + break; + case FAILED: + System.err.println("Run failed: " + run.getMessage()); + break; + default: // QUEUED, IN_PROGRESS, UNKNOWN: poll again later + break; + } + } catch (SkyflowException e) { + System.err.println("Error during getRun:"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java new file mode 100644 index 00000000..443e51dd --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java @@ -0,0 +1,71 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.RedactionType; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Base64; +import java.util.Collections; + +/** + * Replaces tokens in a de-identified file with their original values, or with a redacted form + * chosen per entity type. Synchronous: the re-identified file comes back in the response. + */ +public class ReidentifyFileSample { + public static void main(String[] args) throws Exception { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + byte[] content = Files.readAllBytes(Paths.get("")); // e.g. processed-notes.txt + + try { + ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( + ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64) + .value(Base64.getEncoder().encodeToString(content)) + .dataFormat(FileDataFormat.TXT) + .redactionLevel(Collections.singletonList( + RedactionLevel.builder() + .entityName(EntityType.NAME) + .redactionType(RedactionType.PLAIN_TEXT) + .build())) + .build()); + System.out.println("Status: " + response.getStatus()); + if (response.getStatus() == DetectRunStatus.SUCCESS) { + for (FileOutput output : response.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per response.getOutputType() + byte[] processed = Base64.getDecoder().decode(output.getProcessedFile()); + System.out.println(output.getProcessedFileType() + ": " + processed.length + " bytes"); + } + } + } catch (SkyflowException e) { + System.err.println("Error during reidentifyFile:"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java new file mode 100644 index 00000000..8ba28ba0 --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java @@ -0,0 +1,58 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.RedactionType; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.Arrays; + +/** + * Replaces tokens in a de-identified string with their original values, or with a redacted form + * chosen per entity type. For a skyvault vault each RedactionLevel names an entityName and a + * redactionType. + */ +public class ReidentifyStringSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + try { + ReidentifyStringResponse response = skyflowClient.detect().reidentifyString( + ReidentifyStringRequest.builder() + .text("My name is [NAME_1] and my email is [EMAIL_ADDRESS_1].") + .redactionLevel(Arrays.asList( + RedactionLevel.builder() + .entityName(EntityType.NAME) + .redactionType(RedactionType.PLAIN_TEXT) + .build(), + RedactionLevel.builder() + .entityName(EntityType.EMAIL_ADDRESS) + .redactionType(RedactionType.MASKED) + .build())) + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + } catch (SkyflowException e) { + System.err.println("Error during reidentifyString:"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyTextExample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyTextExample.java deleted file mode 100644 index a06a2e62..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/ReidentifyTextExample.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.example.detect; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.ReidentifyTextResponse; - -import java.util.ArrayList; -import java.util.List; - -/** - * Skyflow Reidentify Text Example - * - * Demonstrates how to use the Skyflow SDK to reidentify (restore) sensitive values - * in a previously deidentified text string. This is the reverse of deidentifyText. - * - * Steps: - * 1. Configure credentials and vault. - * 2. Create a Skyflow client. - * 3. Build a ReidentifyTextRequest with the deidentified text and entity-display options. - * 4. Call reidentifyText and handle the response. - */ -public class ReidentifyTextExample { - - public static void main(String[] args) throws SkyflowException { - - // Step 1: Set up credentials - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with path to your credentials JSON file - // Alternative authentication options (uncomment one if needed): - // credentials.setApiKey(""); - // credentials.setToken(""); - // credentials.setCredentialsString(""); - - // Step 2: Configure the vault - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with your vault ID - vaultConfig.setClusterId(""); // Replace with your cluster ID (from vault URL) - vaultConfig.setEnv(Env.PROD); // Environment: PROD, SANDBOX, STAGE, or DEV - vaultConfig.setCredentials(credentials); // Attach credentials to this vault - - // Step 3: Create a Skyflow client - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Log level: DEBUG, INFO, WARN, ERROR, or OFF - .addVaultConfig(vaultConfig) // Add vault configuration - .build(); - - try { - // Step 4: Configure entity display options for the reidentified output. - // Entities NOT listed in any option list are reidentified to plain text by default. - - // PLAIN TEXT: Return the original sensitive value for these entities - List plainTextEntities = new ArrayList<>(); - plainTextEntities.add(DetectEntities.SSN); // Replace with entities you want in plain text - - // MASKED: Return a masked version of the value (e.g., XXX-XX-6789) - List maskedEntities = new ArrayList<>(); - maskedEntities.add(DetectEntities.CREDIT_CARD); // Replace with entities you want masked - - // REDACTED: Replace entity value with a redaction placeholder - // List redactedEntities = new ArrayList<>(); - // redactedEntities.add(DetectEntities.DOB); // Replace with entities you want redacted - - // Step 5: Build the ReidentifyTextRequest - // The `text` field should be the output of a prior deidentifyText call — - // it contains placeholder tokens like [SSN_IWdexZe] that will be resolved. - ReidentifyTextRequest reidentifyTextRequest = ReidentifyTextRequest.builder() - .text("My SSN is [SSN_IWdexZe] and my card is [CREDIT_CARD_rUzMjdQ].") // Replace with your deidentified text - .plainTextEntities(plainTextEntities) // Restore these as plain text - .maskedEntities(maskedEntities) // Restore these as masked values - // .redactedEntities(redactedEntities) // Restore these as redacted placeholders - .build(); - - // Step 6: Call reidentifyText on the vault - ReidentifyTextResponse reidentifyTextResponse = skyflowClient - .detect("") // Replace with your vault ID - .reidentifyText(reidentifyTextRequest); - - // Step 7: Print the processed text - System.out.println("Reidentify Text Response: " + reidentifyTextResponse); - - // To access the processed text string directly: - // System.out.println("Processed text: " + reidentifyTextResponse.getProcessedText()); - - } catch (SkyflowException e) { - System.err.println("Error occurred during reidentify text:"); - e.printStackTrace(); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/Skyflow.java b/skyvault/src/main/java/com/skyflow/Skyflow.java index 53692860..8343c4fd 100644 --- a/skyvault/src/main/java/com/skyflow/Skyflow.java +++ b/skyvault/src/main/java/com/skyflow/Skyflow.java @@ -149,11 +149,18 @@ protected void onVaultConfigAdded(VaultConfig vaultConfig) throws SkyflowExcepti @Override protected void onVaultConfigUpdated(VaultConfig updatedConfig) throws SkyflowException { this.vaultClientsMap.get(updatedConfig.getVaultId()).updateVaultConfig(updatedConfig); + DetectController detect = this.detectClientsMap.get(updatedConfig.getVaultId()); + if (detect == null) { + this.detectClientsMap.put(updatedConfig.getVaultId(), new DetectController(updatedConfig, this.skyflowCredentials)); + } else { + detect.setVaultConfig(updatedConfig); + } } @Override protected void onVaultConfigRemoved(String vaultId) throws SkyflowException { this.vaultClientsMap.remove(vaultId); + this.detectClientsMap.remove(vaultId); } @Override diff --git a/skyvault/src/main/java/com/skyflow/VaultClient.java b/skyvault/src/main/java/com/skyflow/VaultClient.java index 509b70c7..3dad6b1a 100644 --- a/skyvault/src/main/java/com/skyflow/VaultClient.java +++ b/skyvault/src/main/java/com/skyflow/VaultClient.java @@ -2,30 +2,20 @@ import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.DetectOutputTranscriptions; import com.skyflow.enums.InterfaceName; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.generated.rest.ApiClient; import com.skyflow.generated.rest.ApiClientBuilder; -import com.skyflow.generated.rest.resources.files.FilesClient; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.resources.files.types.*; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.strings.StringsClient; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.types.DeidentifyStringRequestEntityTypesItem; import com.skyflow.generated.rest.resources.tokens.TokensClient; import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.Transformations; import com.skyflow.generated.rest.types.*; import com.skyflow.logs.ErrorLogs; import com.skyflow.utils.Utils; @@ -33,8 +23,6 @@ import com.skyflow.vault.data.FileUploadRequest; import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.UpdateRequest; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.*; import com.skyflow.vault.tokens.ColumnValue; import com.skyflow.vault.tokens.DetokenizeData; import com.skyflow.vault.tokens.DetokenizeRequest; @@ -76,14 +64,6 @@ protected TokensClient getTokensApi() { return this.apiClient.tokens(); } - protected StringsClient getDetectTextApi() { - return this.apiClient.strings(); - } - - protected FilesClient getDetectFileAPi() { - return this.apiClient.files(); - } - protected QueryClient getQueryApi() { return this.apiClient.query(); } @@ -234,593 +214,6 @@ protected void setBearerToken() throws SkyflowException { } } - protected DeidentifyTextResponse getDeIdentifyTextResponse(DeidentifyStringResponse deidentifyStringResponse) { - Optional> detectedEntities = deidentifyStringResponse.getEntities(); - - List entities = new ArrayList<>(); - - if (detectedEntities.isPresent()) { - for (StringResponseEntities e : detectedEntities.get()) { - entities.add(convertDetectedEntityToEntityInfo(e)); - } - } - - return new DeidentifyTextResponse( - deidentifyStringResponse.getProcessedText().get(), - entities, - deidentifyStringResponse.getWordCount().get(), - deidentifyStringResponse.getCharacterCount().get() - ); - } - - protected DeidentifyStringRequest getDeidentifyStringRequest(DeidentifyTextRequest deIdentifyTextRequest, String vaultId) throws SkyflowException { - List entities = deIdentifyTextRequest.getEntities(); - - List mappedEntityTypes = null; - if (entities != null) { - mappedEntityTypes = deIdentifyTextRequest.getEntities().stream() - .map(detectEntity -> DeidentifyStringRequestEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()); - } - - TokenFormat tokenFormat = deIdentifyTextRequest.getTokenFormat(); - - Optional> vaultToken = Optional.empty(); - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(deIdentifyTextRequest.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(deIdentifyTextRequest.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(deIdentifyTextRequest.getTransformations())); - - if (tokenFormat != null) { - if (tokenFormat.getVaultToken() != null && !tokenFormat.getVaultToken().isEmpty()) { - vaultToken = Optional.of( - tokenFormat.getVaultToken().stream() - .map(detectEntity -> TokenTypeMappingVaultTokenItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of( - tokenFormat.getEntityOnly().stream() - .map(detectEntity -> TokenTypeMappingEntityOnlyItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of( - tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> TokenTypeMappingEntityUnqCounterItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .vaultToken(vaultToken) - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - - return DeidentifyStringRequest.builder() - .text(deIdentifyTextRequest.getText()) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .transformations(transformations) - .build(); - } - - protected ReidentifyStringRequest getReidentifyStringRequest(ReidentifyTextRequest reidentifyTextRequest, String vaultId) throws SkyflowException { - Optional> maskEntities = null; - Optional> redactedEntities = null; - Optional> plaintextEntities = null; - - if (reidentifyTextRequest.getMaskedEntities() != null) { - maskEntities = Optional.of(reidentifyTextRequest.getMaskedEntities().stream() - .map(detectEntity -> FormatMaskedItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (reidentifyTextRequest.getPlainTextEntities() != null) { - plaintextEntities = Optional.of(reidentifyTextRequest.getPlainTextEntities().stream() - .map(detectEntity -> FormatPlaintextItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (reidentifyTextRequest.getRedactedEntities() != null) { - redactedEntities = Optional.of(reidentifyTextRequest.getRedactedEntities().stream() - .map(detectEntity -> FormatRedactedItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - Format reidentifyStringRequestFormat = Format.builder() - .masked(maskEntities) - .plaintext(plaintextEntities) - .redacted(redactedEntities) - .build(); - - - return ReidentifyStringRequest.builder() - .text(reidentifyTextRequest.getText()) - .vaultId(vaultId) - .format(reidentifyStringRequestFormat) - .build(); - } - - - private EntityInfo convertDetectedEntityToEntityInfo(StringResponseEntities detectedEntity) { - TextIndex textIndex = new TextIndex( - detectedEntity.getLocation().get().getStartIndex().orElse(0), - detectedEntity.getLocation().get().getEndIndex().orElse(0) - ); - TextIndex processedIndex = new TextIndex( - detectedEntity.getLocation().get().getStartIndexProcessed().orElse(0), - detectedEntity.getLocation().get().getEndIndexProcessed().orElse(0) - ); - - Map entityScores = detectedEntity.getEntityScores() - .map(doubleMap -> doubleMap.entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - Map.Entry::getValue - ))) - .orElse(Collections.emptyMap()); - - - return new EntityInfo( - detectedEntity.getToken().orElse(""), - detectedEntity.getValue().orElse(""), - textIndex, - processedIndex, - detectedEntity.getEntityType().orElse(""), - entityScores); - } - - - private Transformations getTransformations(com.skyflow.vault.detect.Transformations transformations) { - if (transformations == null || transformations.getShiftDates() == null) { - return null; - } - - Optional> entityTypes = null; - if (!transformations.getShiftDates().getEntities().isEmpty()) { - entityTypes = Optional.of(transformations.getShiftDates().getEntities().stream() - .map(entity -> ShiftDatesEntityTypesItem.valueOf(entity.name())) - .collect(Collectors.toList())); - } else { - entityTypes = Optional.of(Collections.emptyList()); - } - - return Transformations.builder() - .shiftDates(ShiftDates.builder() - .maxDays(transformations.getShiftDates().getMax()) - .minDays(transformations.getShiftDates().getMin()) - .entityTypes(entityTypes) - .build()) - .build(); - } - - private > List getEntityTypes(List entities, Class type) { - if (entities == null) return Collections.emptyList(); - - return entities.stream() - .map(e -> Enum.valueOf(type, e.name())) - .collect(Collectors.toList()); - } - - - protected com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText getDeidentifyTextFileRequest(DeidentifyFileRequest request, String vaultId, String base64Content) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifyTextEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(request.getTransformations())); - - if (tokenFormat != null) { - - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of(tokenFormat.getEntityOnly().stream() - .map(detectEntity -> TokenTypeMappingEntityOnlyItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of(tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> TokenTypeMappingEntityUnqCounterItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - FileDataDeidentifyText file = FileDataDeidentifyText.builder() - .base64(base64Content) - .build(); - - // Build the final request - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText req = - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .transformations(transformations) - .build(); - - return req; - } - - - protected DeidentifyFileAudioRequestDeidentifyAudio getDeidentifyAudioRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String dataFormat) throws SkyflowException { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(request.getTransformations())); - - if (tokenFormat != null) { - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of( - tokenFormat.getEntityOnly().stream() - .map(detectEntity -> DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ).map(list -> (List) (List) list); - } - - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of( - (List) (List) - tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - FileDataDeidentifyAudio deidentifyAudioRequestFile = FileDataDeidentifyAudio.builder().base64(base64Content).dataFormat(mapAudioDataFormat(dataFormat)).build(); - DetectOutputTranscriptions transcription = request.getOutputTranscription(); - Optional outputTranscriptionType = null; - if (transcription != null) { - outputTranscriptionType = Optional.of(DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.valueOf(transcription.name())); - } - - return DeidentifyFileAudioRequestDeidentifyAudio.builder() - .file(deidentifyAudioRequestFile) - .vaultId(vaultId) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .entityTypes(mappedEntityTypes) - .bleepFrequency(request.getBleep() != null - ? (int) Math.round(request.getBleep().getFrequency()) - : null) - .bleepGain(request.getBleep() != null ? (int) Math.round(request.getBleep().getGain()) : null) - .bleepStartPadding(request.getBleep() != null ? (float) Math.round(request.getBleep().getStartPadding()) : null) - .bleepStopPadding(request.getBleep() != null ? (float) Math.round(request.getBleep().getStopPadding()) : null) - .outputProcessedAudio(request.getOutputProcessedAudio()) - .outputTranscription(outputTranscriptionType) - .tokenType(tokenType) - .transformations(transformations) - .build(); - } - - protected DeidentifyFileDocumentPdfRequestDeidentifyPdf getDeidentifyPdfRequest(DeidentifyFileRequest request, String vaultId, String base64Content) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - if (tokenFormat != null) { - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of( - (List) (List) - tokenFormat.getEntityOnly().stream() - .map(detectEntity -> DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of( - (List) (List) - tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - FileDataDeidentifyPdf file = FileDataDeidentifyPdf.builder() - .base64(base64Content) - .build(); - - return DeidentifyFileDocumentPdfRequestDeidentifyPdf.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .build(); - } - - protected DeidentifyFileImageRequestDeidentifyImage getDeidentifyImageRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifyImage file = FileDataDeidentifyImage.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifyImageDataFormat.valueOf(format.toUpperCase())) - .build(); - - Optional maskingMethod = Optional.empty(); - if (request.getMaskingMethod() != null) { - maskingMethod = Optional.of(DeidentifyFileImageRequestDeidentifyImageMaskingMethod.valueOf(request.getMaskingMethod().name())); - } - - return DeidentifyFileImageRequestDeidentifyImage.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .maskingMethod(maskingMethod) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .outputProcessedImage(request.getOutputProcessedImage()) - .outputOcrText(request.getOutputOcrText()) - .build(); - } - - protected DeidentifyFileRequestDeidentifyPresentation getDeidentifyPresentationRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.class); - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifyPresentation file = FileDataDeidentifyPresentation.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifyPresentationDataFormat.valueOf(format.toUpperCase())) - .build(); - - return DeidentifyFileRequestDeidentifyPresentation.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .build(); - } - - protected DeidentifyFileRequestDeidentifySpreadsheet getDeidentifySpreadsheetRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.class); - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifySpreadsheet file = FileDataDeidentifySpreadsheet.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifySpreadsheetDataFormat.valueOf(format.toUpperCase())) - .build(); - - return DeidentifyFileRequestDeidentifySpreadsheet.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .build(); - } - - protected DeidentifyFileRequestDeidentifyStructuredText getDeidentifyStructuredTextRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.class); - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(request.getTransformations())); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifyStructuredText file = FileDataDeidentifyStructuredText.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifyStructuredTextDataFormat.valueOf(format.toUpperCase())) - .build(); - - return DeidentifyFileRequestDeidentifyStructuredText.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .transformations(transformations) - .build(); - } - - protected DeidentifyFileRequestDeidentifyDocument getDeidentifyDocumentRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = - getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.class); - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifyDocument file = FileDataDeidentifyDocument.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifyDocumentDataFormat.valueOf(format.toUpperCase())) - .build(); - - return DeidentifyFileRequestDeidentifyDocument.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .build(); - } - - protected com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest getDeidentifyGenericFileRequest( - DeidentifyFileRequest request, String vaultId, String base64Content, String fileExtension) throws SkyflowException { - - List mappedEntityTypes = - getEntityTypes(request.getEntities(), DeidentifyFileRequestEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(request.getTransformations())); - - if (tokenFormat != null) { - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of(tokenFormat.getEntityOnly().stream() - .map(detectEntity -> TokenTypeMappingEntityOnlyItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of(tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> TokenTypeMappingEntityUnqCounterItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - FileDataDataFormat dataFormat = null; - if (fileExtension != null) { - try { - dataFormat = FileDataDataFormat.valueOf(fileExtension.toUpperCase()); - } catch (IllegalArgumentException e) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.UNSUPPORTED_FILE_TYPE_TO_DEIDENTIFY.getLog(), InterfaceName.DETECT.getName(), fileExtension)); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), Utils.parameterizedString( - ErrorMessage.UnsupportedFileTypeToDeidentify.getMessage(), fileExtension)); - } - } - - FileData file = - FileData.builder() - .base64(base64Content) - .dataFormat(dataFormat) - .build(); - - return com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .transformations(transformations) - .build(); - } - - private TokenTypeMapping buildTokenType(TokenFormat tokenFormat, - Optional> entityTypes, - Optional> entityUniqueCounter) { - - if (tokenFormat != null) { - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of(tokenFormat.getEntityOnly().stream() - .map(detectEntity -> TokenTypeMappingEntityOnlyItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of(tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> TokenTypeMappingEntityUnqCounterItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - } - - return TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - } - - - private FileDataDeidentifyAudioDataFormat mapAudioDataFormat(String dataFormat) throws SkyflowException { - switch (dataFormat) { - case "mp3": - return FileDataDeidentifyAudioDataFormat.MP_3; - case "wav": - return FileDataDeidentifyAudioDataFormat.WAV; - default: - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidAudioFileType.getMessage()); - } - } - private void updateVaultURL() { String vaultURL = Utils.getVaultURL(this.vaultConfig.getClusterId(), this.vaultConfig.getEnv()); if (!vaultURL.equals(this.currentVaultURL)) { diff --git a/skyvault/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java b/skyvault/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java deleted file mode 100644 index 87ffc109..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.skyflow.enums; - -public enum DeidentifyFileStatus { - IN_PROGRESS("IN_PROGRESS"), - FAILED("FAILED"), - SUCCESS("SUCCESS"), - UNKNOWN("UNKNOWN"); - - private final String value; - - DeidentifyFileStatus(String value) { - this.value = value; - } - - public String value() { - return value; - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/enums/DetectEntities.java b/skyvault/src/main/java/com/skyflow/enums/DetectEntities.java deleted file mode 100644 index 3fd15a67..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/DetectEntities.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.skyflow.enums; - - -public enum DetectEntities { - ACCOUNT_NUMBER("account_number"), - AGE("age"), - ALL("all"), - BANK_ACCOUNT("bank_account"), - BLOOD_TYPE("blood_type"), - CONDITION("condition"), - CORPORATE_ACTION("corporate_action"), - CREDIT_CARD("credit_card"), - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - CVV("cvv"), - DATE("date"), - DAY("day"), - DATE_INTERVAL("date_interval"), - DOB("dob"), - DOSE("dose"), - DRIVER_LICENSE("driver_license"), - DRUG("drug"), - DURATION("duration"), - EFFECT("effect"), - EMAIL_ADDRESS("email_address"), - EVENT("event"), - FILENAME("filename"), - FINANCIAL_METRIC("financial_metric"), - GENDER("gender"), - HEALTHCARE_NUMBER("healthcare_number"), - INJURY("injury"), - IP_ADDRESS("ip_address"), - LANGUAGE("language"), - LOCATION("location"), - LOCATION_ADDRESS("location_address"), - LOCATION_ADDRESS_STREET("location_address_street"), - LOCATION_CITY("location_city"), - LOCATION_COORDINATE("location_coordinate"), - LOCATION_COUNTRY("location_country"), - LOCATION_STATE("location_state"), - LOCATION_ZIP("location_zip"), - MARITAL_STATUS("marital_status"), - MEDICAL_CODE("medical_code"), - MEDICAL_PROCESS("medical_process"), - MONEY("money"), - MONTH("month"), - NAME("name"), - NAME_FAMILY("name_family"), - NAME_GIVEN("name_given"), - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - NUMERICAL_PII("numerical_pii"), - OCCUPATION("occupation"), - ORGANIZATION("organization"), - ORGANIZATION_ID("organization_id"), - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - ORIGIN("origin"), - PASSPORT_NUMBER("passport_number"), - PASSWORD("password"), - PHONE_NUMBER("phone_number"), - PROJECT("project"), - PHYSICAL_ATTRIBUTE("physical_attribute"), - POLITICAL_AFFILIATION("political_affiliation"), - PRODUCT("product"), - RELIGION("religion"), - ROUTING_NUMBER("routing_number"), - SEXUALITY("sexuality"), - SSN("ssn"), - STATISTICS("statistics"), - TIME("time"), - TREND("trend"), - URL("url"), - USERNAME("username"), - VEHICLE_ID("vehicle_id"), - YEAR("year"), - ZODIAC_SIGN("zodiac_sign"); - - private final String detectEntities; - - DetectEntities(String detectEntities) { - this.detectEntities = detectEntities; - } - - public String getDetectEntities() { - return detectEntities; - } - - @Override - public String toString() { - return detectEntities; - } -} diff --git a/skyvault/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java b/skyvault/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java deleted file mode 100644 index 8d0c42a4..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.skyflow.enums; - -public enum DetectOutputTranscriptions { - DIARIZED_TRANSCRIPTION("diarized_transcription"), - MEDICAL_DIARIZED_TRANSCRIPTION("medical_diarized_transcription"), - MEDICAL_TRANSCRIPTION("medical_transcription"), - TRANSCRIPTION("transcription"); - - private final String detectOutputTranscriptions; - - DetectOutputTranscriptions(String detectOutputTranscriptions) { - this.detectOutputTranscriptions = detectOutputTranscriptions; - } - - public String getDetectOutputTranscriptions() { - return detectOutputTranscriptions; - } - - @Override - public String toString() { - return detectOutputTranscriptions; - } -} diff --git a/skyvault/src/main/java/com/skyflow/enums/MaskingMethod.java b/skyvault/src/main/java/com/skyflow/enums/MaskingMethod.java deleted file mode 100644 index e3ff252c..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/MaskingMethod.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.skyflow.enums; - -public enum MaskingMethod { - BLACKBOX("blackbox"), - BLUR("blur"); - - private final String maskingMethod; - - MaskingMethod(String maskingMethod) { - this.maskingMethod = maskingMethod; - } - - public String getMaskingMethod() { - return maskingMethod; - } - - @Override - public String toString() { - return maskingMethod; - } -} diff --git a/skyvault/src/main/java/com/skyflow/enums/TokenType.java b/skyvault/src/main/java/com/skyflow/enums/TokenType.java deleted file mode 100644 index 4a619e9c..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/TokenType.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.skyflow.enums; - -public enum TokenType { - VAULT_TOKEN("vault_token"), - ENTITY_UNIQUE_COUNTER("entity_unq_counter"), - ENTITY_ONLY("entity_only"); - - private final String tokenType; - - TokenType(String tokenType) { - this.tokenType = tokenType; - } - - public String getTokenType() { - return tokenType; - } - - public String getDefault() { - return ENTITY_UNIQUE_COUNTER.getTokenType(); - } - - @Override - public String toString() { - return tokenType; - } -} - diff --git a/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java b/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java index 6e7419a9..d49a4641 100644 --- a/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java +++ b/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java @@ -147,33 +147,7 @@ public enum ErrorMessage { InvalidFileObject("%s0 Validation error. Invalid file object in file upload request. Specify a valid file object."), InvalidBase64("%s0 Validation error. Invalid base64 string in file upload request. Specify a valid base64 string."), - // detect - DeidentifyTextRequestNull("%s0 Validation error. DeidentifyTextRequest object is null. Specify a valid DeidentifyTextRequest object."), - InvalidTextInDeIdentify("%s0 Validation error. The text field is required and must be a non-empty string. Specify a valid text."), - ReidentifyTextRequestNull("%s0 Validation error. ReidentifyTextRequest object is null. Specify a valid ReidentifyTextRequest object."), - InvalidTextInReIdentify("%s0 Validation error. The text field is required and must be a non-empty string. Specify a valid text."), - - //Detect Files - InvalidNullFileInDeIdentifyFile("%s0 Validation error. The file field is required and must not be null. Specify a valid file object."), InvalidFilePath("%s0 Validation error. The file path is invalid. Specify a valid file path."), - BothFileAndFilePathProvided("%s0 Validation error. Both file and filePath are provided. Specify either file object or filePath, not both."), - FileNotFoundToDeidentify("%s0 Validation error. The file to deidentify was not found at the specified path. Verify the file path and try again."), - FileNotReadableToDeidentify("%s0 Validation error. The file to deidentify is not readable. Check the file permissions and try again."), - InvalidPixelDensityToDeidentifyFile("%s0 Validation error. Should be a positive integer. Specify a valid pixel density."), - InvalidMaxResolution("%s0 Validation error. Should be a positive integer. Specify a valid max resolution."), - OutputDirectoryNotFound("%s0 Validation error. The output directory for deidentified files was not found at the specified path. Verify the output directory path and try again."), - InvalidPermission("%s0 Validation error. The output directory for deidentified files is not writable. Check the directory permissions and try again."), - InvalidWaitTime("%s0 Validation error. The wait time for deidentify file operation should be a positive integer. Specify a valid wait time."), - WaitTimeExceedsLimit("%s0 Validation error. The wait time for deidentify file operation exceeds the maximum limit of 64 seconds. Specify a wait time less than or equal to 60 seconds."), - InvalidOrEmptyRunId("%s0 Validation error. The run ID is invalid or empty. Specify a valid run ID."), - FailedToEncodeFile("%s0 Validation error. Failed to encode the file. Ensure the file is in a supported format and try again."), - FailedToDecodeFileFromResponse("%s0 Failed to decode the file from the response. Ensure the response is valid and try again."), - EmptyFileAndFilePathInDeIdentifyFile("%s0 Validation error. Both file and filePath are empty. Specify either file object or filePath, not both."), - VaultTokenFormatIsNotAllowedForFiles("%s0 Validation error. Vault token format is not allowed for deidentify file request."), - PollingForResultsFailed("%s0 API error. Polling for results failed. Unable to retrieve the deidentified file"), - FailedToSaveProcessedFile("%s0 Validation error. Failed to save the processed file. Ensure the output directory is valid and writable."), - InvalidAudioFileType("%s0 Validation error. The file type is not supported. Specify a valid file type mp3 or wav."), - UnsupportedFileTypeToDeidentify("%s0 Validation error. File type '%s1' is not supported for deidentification. Specify a supported file type."), // Generic ErrorOccurred("%s0 API error. Error occurred.") ; diff --git a/skyvault/src/main/java/com/skyflow/utils/Constants.java b/skyvault/src/main/java/com/skyflow/utils/Constants.java index 0c65a72b..82f6dd04 100644 --- a/skyvault/src/main/java/com/skyflow/utils/Constants.java +++ b/skyvault/src/main/java/com/skyflow/utils/Constants.java @@ -10,8 +10,6 @@ public final class Constants extends BaseConstants { public static final String SDK_VERSION; public static final String SDK_PREFIX; public static final String SDK_METRIC_NAME_VERSION_PREFIX = "skyflow-java@"; - public static final String PROCESSED_FILE_NAME_PREFIX = "processed-"; - public static final String DEIDENTIFIED_FILE_PREFIX = "deidentified"; public static final String HTTPS_PROTOCOL = "https"; public static final String ORDER_DESCENDING = "DESCENDING"; public static final String ORDER_NONE = "NONE"; diff --git a/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java b/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java index 93957f57..48b9b34d 100644 --- a/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java +++ b/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java @@ -30,11 +30,6 @@ import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.QueryRequest; import com.skyflow.vault.data.UpdateRequest; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.GetDetectRunRequest; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.TokenFormat; import com.skyflow.vault.tokens.ColumnValue; import com.skyflow.vault.tokens.DetokenizeData; import com.skyflow.vault.tokens.DetokenizeRequest; @@ -754,40 +749,6 @@ private static boolean isNullOrEmpty(String str) { return str == null || str.trim().isEmpty(); } - public static void validateDeidentifyTextRequest(DeidentifyTextRequest deidentifyTextRequest) throws SkyflowException { - if (deidentifyTextRequest == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.DEIDENTIFY_TEXT_REQUEST_NULL.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DeidentifyTextRequestNull.getMessage()); - } - // Validate required fields - String deidentifyText = deidentifyTextRequest.getText(); - if (deidentifyText == null || deidentifyText.trim().isEmpty()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_TEXT_IN_DEIDENTIFY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidTextInDeIdentify.getMessage()); - } - } - - public static void validateReidentifyTextRequest(ReidentifyTextRequest reidentifyTextRequest) throws SkyflowException { - if (reidentifyTextRequest == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.REIDENTIFY_TEXT_REQUEST_NULL.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.ReidentifyTextRequestNull.getMessage()); - } - // Validate required fields - String reidentifyText = reidentifyTextRequest.getText(); - if (reidentifyText == null || reidentifyText.trim().isEmpty()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_TEXT_IN_REIDENTIFY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidTextInReIdentify.getMessage()); - } - } - private static boolean isInvalidURL(String configURL) { try { URL url = new URL(configURL); @@ -863,129 +824,10 @@ private static void validateTokensMapWithTokenStrict( } } - public static void validateDeidentifyFileRequest(DeidentifyFileRequest request) throws SkyflowException { - if (request == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_REQUEST_BODY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRequestBody.getMessage()); - } - - TokenFormat tokenFormat = request.getTokenFormat(); - if (tokenFormat != null && tokenFormat.getVaultToken() != null && !tokenFormat.getVaultToken().isEmpty()) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultTokenFormatIsNotAllowedForFiles.getMessage()); - } - - if (request.getFileInput() == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_FILE_AND_FILE_PATH_IN_DEIDENTIFY_FILE.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage()); - } - - File file = request.getFileInput().getFile(); - String filePath = request.getFileInput().getFilePath(); - - if (file == null && filePath == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_FILE_AND_FILE_PATH_IN_DEIDENTIFY_FILE.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage()); - } - - if (filePath != null && file != null) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.BothFileAndFilePathProvided.getMessage()); - } - - if (filePath != null && filePath.trim().isEmpty()){ - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidFilePath.getMessage()); - } - - if (file != null && (!file.exists() || !file.isFile())) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.FILE_NOT_FOUND_TO_DEIDENTIFY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FileNotFoundToDeidentify.getMessage()); - } - if (file != null && !file.canRead()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.FILE_NOT_READABLE_TO_DEIDENTIFY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FileNotReadableToDeidentify.getMessage()); - } - - - // Validate pixelDensity and maxResolution - if (request.getPixelDensity() != null && request.getPixelDensity().doubleValue() <= 0) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_PIXEL_DENSITY_TO_DEIDENTIFY_FILE.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidPixelDensityToDeidentifyFile.getMessage()); - } - if (request.getMaxResolution() != null && request.getMaxResolution().doubleValue() <= 0) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_MAX_RESOLUTION.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidMaxResolution.getMessage()); - } - - // Validate AudioBleep - if (request.getBleep() != null) { - if (request.getBleep().getFrequency() == null || request.getBleep().getFrequency() <= 0) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_BLEEP_TO_DEIDENTIFY_AUDIO.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRequestBody.getMessage()); - } - if (request.getBleep().getStartPadding() == null || request.getBleep().getStartPadding() < 0) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRequestBody.getMessage()); - } - if (request.getBleep().getStopPadding() == null || request.getBleep().getStopPadding() < 0) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRequestBody.getMessage()); - } - } - - // Validate outputDirectory if provided - if (request.getOutputDirectory() != null) { - File outDir = new File(request.getOutputDirectory()); - if (!outDir.exists() || !outDir.isDirectory()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.OUTPUT_DIRECTORY_NOT_FOUND.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.OutputDirectoryNotFound.getMessage()); - } - if (!outDir.canWrite()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_PERMISSIONS_FOR_OUTPUT_DIRECTORY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidPermission.getMessage()); - } - } - - // Validate waitTime if provided - if (request.getWaitTime() != null && request.getWaitTime() <= 0) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidWaitTime.getMessage()); - } - if(request.getWaitTime() != null && request.getWaitTime() > 64) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.WaitTimeExceedsLimit.getMessage()); - } - } - static Object resolveUpdateId(HashMap data) { if (data.containsKey("skyflowId")) { return data.get("skyflowId"); } return data.get("skyflow_id"); } - - public static void validateGetDetectRunRequest(GetDetectRunRequest request) throws SkyflowException { - if (request == null) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRequestBody.getMessage()); - } - - String runId = request.getRunId(); - if (runId == null || runId.trim().isEmpty()) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidOrEmptyRunId.getMessage()); - } - } } diff --git a/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java b/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java index 8fc8ac66..c78fb6ba 100644 --- a/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java +++ b/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java @@ -1,453 +1,43 @@ package com.skyflow.vault.controller; -import com.google.gson.*; -import com.skyflow.VaultClient; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DeidentifyFileStatus; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.*; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.logs.ErrorLogs; -import com.skyflow.logs.InfoLogs; -import com.skyflow.utils.Constants; import com.skyflow.utils.Utils; -import com.skyflow.utils.logger.LogUtil; -import com.skyflow.utils.validations.Validations; -import com.skyflow.vault.detect.*; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.util.*; -public final class DetectController extends VaultClient { - Gson gson = new GsonBuilder() - .registerTypeAdapter(Optional.class, (JsonSerializer>) (src, typeOfSrc, context) -> - src.map(context::serialize).orElse(null)) - .serializeNulls() - .create(); - private static final JsonObject SKY_METADATA = Utils.getMetrics(); +/** + * Skyflow Detect operations for a skyvault vault, returned by {@code Skyflow.detect()} and + * {@code Skyflow.detect(vaultId)}. Every Detect V2 method ({@code deidentifyString}, + * {@code deidentifyFile}, {@code reidentifyString}, {@code getRun}, {@code checkGuardrails}) is + * inherited from {@link BaseDetectController} and shared with the flowvault SDK; this class only + * supplies the skyvault URL rule and SDK metrics. + * + *

For skyvault vaults a {@code VAULT_TOKEN} entity's {@code destination} is a {@code table.column} + * pair, and {@code RedactionLevel} rules use {@code entityName} and {@code redactionType}. + */ +public final class DetectController extends BaseDetectController { + private final String vaultUrlOverride; public DetectController(VaultConfig vaultConfig, Credentials credentials) { - super(vaultConfig, credentials); - } - - public DeidentifyTextResponse deidentifyText(DeidentifyTextRequest deidentifyTextRequest) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_TEXT_TRIGGERED.getLog()); - DeidentifyStringResponse deidentifyStringResponse = null; - DeidentifyTextResponse deidentifyTextResponse = null; - try { - // Validate the request - LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_TEXT_REQUEST.getLog()); - Validations.validateDeidentifyTextRequest(deidentifyTextRequest); - setBearerToken(); - - // Parse the request to DeidentifyStringRequest - String vaultId = super.getVaultConfig().getVaultId(); - DeidentifyStringRequest request = getDeidentifyStringRequest(deidentifyTextRequest, vaultId); - - // get SDK metrics and call the API to de-identify the string - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); - deidentifyStringResponse = super.getDetectTextApi().deidentifyString(request, requestOptions); - - // Parse the response to DeIdentifyTextResponse - deidentifyTextResponse = getDeIdentifyTextResponse(deidentifyStringResponse); - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_TEXT_REQUEST_RESOLVED.getLog()); - } catch (ApiClientApiException ex) { - String bodyString = extractBodyAsString(ex); - LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_TEXT_REQUEST_REJECTED.getLog()); - throw new SkyflowException(ex.statusCode(), ex, ex.headers(), bodyString); - } catch (ApiClientException ex) { - throw new SkyflowException(ex); - } - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_TEXT_SUCCESS.getLog()); - return deidentifyTextResponse; - } - - public ReidentifyTextResponse reidentifyText(ReidentifyTextRequest reidentifyTextRequest) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_TEXT_TRIGGERED.getLog()); - ReidentifyTextResponse reidentifyTextResponse = null; - try { - // Validate the request - LogUtil.printInfoLog(InfoLogs.VALIDATE_REIDENTIFY_TEXT_REQUEST.getLog()); - Validations.validateReidentifyTextRequest(reidentifyTextRequest); - setBearerToken(); - // Parse the request to ReidentifyTextRequest - String vaultId = super.getVaultConfig().getVaultId(); - ReidentifyStringRequest request = getReidentifyStringRequest(reidentifyTextRequest, vaultId); - - // Get SDK metrics and call the API to re-identify the string - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); - IdentifyResponse reidentifyStringResponse = super.getDetectTextApi().reidentifyString(request, requestOptions); - - // Parse the response to ReidentifyTextResponse - reidentifyTextResponse = new ReidentifyTextResponse(reidentifyStringResponse.getText()); - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_TEXT_REQUEST_RESOLVED.getLog()); - } catch (ApiClientApiException ex) { - String bodyString = extractBodyAsString(ex); - LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_TEXT_REQUEST_REJECTED.getLog()); - throw new SkyflowException(ex.statusCode(), ex, ex.headers(), bodyString); - } catch (ApiClientException ex) { - throw new SkyflowException(ex); - } - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_TEXT_SUCCESS.getLog()); - return reidentifyTextResponse; - } - - public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) throws SkyflowException { - DeidentifyFileResponse response; - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_TRIGGERED.getLog()); - try { - LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_FILE_REQUEST.getLog()); - Validations.validateDeidentifyFileRequest(request); - setBearerToken(); - - String vaultId = super.getVaultConfig().getVaultId(); - - File file; - if (request.getFileInput().getFilePath() != null) { - file = new File(request.getFileInput().getFilePath()); - } else { - file = request.getFileInput().getFile(); - } - String fileName = file.getName(); - String fileExtension = getFileExtension(fileName); - String base64Content; - - try { - base64Content = encodeFileToBase64(file); - } catch (IOException ioe) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FailedToEncodeFile.getMessage()); - } - - - com.skyflow.generated.rest.types.DeidentifyFileResponse apiResponse = processFileByType(fileExtension, base64Content, request, vaultId); - try { - response = pollForResults(apiResponse.getRunId().get(), request.getWaitTime()); - } catch (Exception ex) { - throw new SkyflowException(ErrorCode.SERVER_ERROR.getCode(), ErrorMessage.PollingForResultsFailed.getMessage()); - } - - if (DeidentifyFileStatus.SUCCESS.value().equalsIgnoreCase(response.getStatus())) { - String base64File = response.getFileBase64(); - if (base64File != null) { - byte[] decodedBytes = Base64.getDecoder().decode(base64File); - String outputDir = request.getOutputDirectory(); - String outputFileName = Constants.PROCESSED_FILE_NAME_PREFIX + getBaseFileName(fileName) + "." + response.getExtension(); - File outputFile; - if (outputDir != null && !outputDir.isEmpty()) { - outputFile = new File(outputDir, outputFileName); - } else { - outputFile = new File(outputFileName); - } - try { - java.nio.file.Files.write(outputFile.toPath(), decodedBytes); - } catch (IOException ioe) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FailedToSaveProcessedFile.getMessage()); - } - - } - - List entities = response.getEntities(); - if (entities != null && !entities.isEmpty()) { - FileEntityInfo entityInfo = entities.get(0); - String entityBase64 = entityInfo.getFile(); - String outputDir = request.getOutputDirectory(); - if (entityBase64 != null) { - byte[] entityDecodedBytes = Base64.getDecoder().decode(entityBase64); - String entityFileName = Constants.PROCESSED_FILE_NAME_PREFIX + getBaseFileName(fileName) + ".json"; - File entityFile; - if (outputDir != null && !outputDir.isEmpty()) { - entityFile = new File(outputDir, entityFileName); - } else { - entityFile = new File(entityFileName); - } - try { - java.nio.file.Files.write(entityFile.toPath(), entityDecodedBytes); - } catch (IOException ioe) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FailedToSaveProcessedFile.getMessage()); - } - } - } - } - } catch (ApiClientApiException e) { - String bodyString = extractBodyAsString(e); - LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); - } catch (ApiClientException e) { - throw new SkyflowException(e); - } - return response; - } - - private String getFileExtension(String fileName) { - return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); - } - - private String getBaseFileName(String fileName) { - int dotIndex = fileName.lastIndexOf('.'); - return dotIndex == -1 ? fileName : fileName.substring(0, dotIndex); - } - - private String encodeFileToBase64(File file) throws IOException { - byte[] fileContent = Files.readAllBytes(file.toPath()); - return Base64.getEncoder().encodeToString(fileContent); - } - - private DeidentifyFileResponse pollForResults(String runId, Integer maxWaitTime) throws Exception { - int currentWaitTime = 1; - maxWaitTime = maxWaitTime == null ? 64 : maxWaitTime; - - DetectRunsResponse response = null; - - while (true) { - try { - GetRunRequest getRunRequest = GetRunRequest.builder() - .vaultId(super.getVaultConfig().getVaultId()) - .build(); - - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); - response = super.getDetectFileAPi() - .getRun(runId, getRunRequest, requestOptions); - - DetectRunsResponseStatus status = response.getStatus().orElse(null); - - if (DeidentifyFileStatus.IN_PROGRESS.value().equalsIgnoreCase(String.valueOf(status))) { - if (currentWaitTime >= maxWaitTime) { - return new DeidentifyFileResponse(runId, DeidentifyFileStatus.IN_PROGRESS.value()); - } - - int nextWaitTime = currentWaitTime * 2; - int waitTime; - - if (nextWaitTime >= maxWaitTime) { - waitTime = maxWaitTime - currentWaitTime; - currentWaitTime = maxWaitTime; - } else { - waitTime = nextWaitTime; - currentWaitTime = nextWaitTime; - } - - Thread.sleep(waitTime * 1000); - - } else if (status == DetectRunsResponseStatus.SUCCESS || - status == DetectRunsResponseStatus.FAILED) { - return parseDeidentifyFileResponse(response, runId, status.toString()); - } - } catch (ApiClientApiException e) { - String bodyString = gson.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.GET_DETECT_RUN_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); - } catch (ApiClientException e) { - throw new SkyflowException(e); - } - } - - } - - private static synchronized DeidentifyFileResponse parseDeidentifyFileResponse(DetectRunsResponse response, - String runId, String status) throws SkyflowException { - - DeidentifiedFileOutput firstOutput = getFirstOutput(response); - - if (firstOutput == null) { - return new DeidentifyFileResponse( - null, - null, - response.getOutputType().map(Object::toString).orElse(null), - null, - null, - null, - response.getSize().orElse(null), - response.getDuration().orElse(null), - response.getPages().orElse(null), - response.getSlides().orElse(null), - getEntities(response), - runId, - response.getStatus().map(Enum::name).orElse(null) - ); - } - - Integer wordCount = null; - Integer charCount = null; - - WordCharacterCount wordCharacterCount = response.getWordCharacterCount().orElse(null); - if (wordCharacterCount != null) { - wordCount = wordCharacterCount.getWordCount().orElse(null); - charCount = wordCharacterCount.getCharacterCount().orElse(null); - } - - File processedFileObject = null; - FileInfo fileInfo = null; - Optional processedFileBase64 = Optional.of(firstOutput).flatMap(DeidentifiedFileOutput::getProcessedFile); - Optional - processedFileExtension = Optional.of(firstOutput).flatMap(DeidentifiedFileOutput::getProcessedFileExtension); - if (processedFileBase64.isPresent() && processedFileExtension.isPresent()) { - try { - byte[] decodedBytes = Base64.getDecoder().decode(processedFileBase64.get()); - String suffix = "." + processedFileExtension.get(); - String fileName = Constants.DEIDENTIFIED_FILE_PREFIX + suffix; - processedFileObject = new File(System.getProperty("java.io.tmpdir"), fileName); - Files.write(processedFileObject.toPath(), decodedBytes); - fileInfo = new FileInfo(processedFileObject); - processedFileObject.deleteOnExit(); - } catch (IOException ioe) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FailedToEncodeFile.getMessage()); - } - } - - String processedFileType = firstOutput.getProcessedFileType() - .map(Object::toString) - .orElse(DetectRunsResponseStatus.UNKNOWN.toString()); - - String fileExtension = processedFileExtension - .map(Object::toString) - .orElse(DetectRunsResponseStatus.UNKNOWN.toString()); - Float sizeInKb = response.getSize().orElse(null); - Float durationInSeconds = response.getDuration().orElse(null); - DeidentifyFileResponse deidentifyFileResponse = new DeidentifyFileResponse( - fileInfo, - firstOutput.getProcessedFile().orElse(null), - processedFileType, - fileExtension, - wordCount, - charCount, - sizeInKb, - durationInSeconds, - response.getPages().orElse(null), - response.getSlides().orElse(null), - getEntities(response), - runId, - status - ); - - return deidentifyFileResponse; - } - - private static synchronized DeidentifiedFileOutput getFirstOutput(DetectRunsResponse response) { - List outputs = response.getOutput().orElse(null); - return outputs != null && !outputs.isEmpty() ? outputs.get(0) : null; + this(vaultConfig, credentials, null); } - private static synchronized List getEntities(DetectRunsResponse response) { - List entities = new ArrayList<>(); - - List outputs = response.getOutput().orElse(null); - DeidentifiedFileOutput deidentifyFileOutput = outputs != null && !outputs.isEmpty() ? outputs.get(0) : null; - - if (deidentifyFileOutput != null) { - entities.add(new FileEntityInfo( - deidentifyFileOutput.getProcessedFile().orElse(null), - deidentifyFileOutput.getProcessedFileType().orElse(null), - deidentifyFileOutput.getProcessedFileExtension().orElse(null) - )); - } - - return entities; - } - - private String extractBodyAsString(ApiClientApiException e) { - return e.statusCode() == 500 - ? e.body().toString() - : gson.toJson(e.body()); + /** Test seam: points the controller at an explicit base URL instead of the cluster-derived one. */ + DetectController(VaultConfig vaultConfig, Credentials credentials, String vaultUrlOverride) { + super(vaultConfig, credentials); + this.vaultUrlOverride = vaultUrlOverride; } - - private com.skyflow.generated.rest.types.DeidentifyFileResponse processFileByType(String fileExtension, String base64Content, DeidentifyFileRequest request, String vaultId) throws SkyflowException { - switch (fileExtension.toLowerCase()) { - case "txt": - DeidentifyFileRequestDeidentifyText textFileRequest = - super.getDeidentifyTextFileRequest(request, vaultId, base64Content); - return super.getDetectFileAPi().deidentifyText(textFileRequest); - - case "mp3": - case "wav": - DeidentifyFileAudioRequestDeidentifyAudio audioRequest = - super.getDeidentifyAudioRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyAudio(audioRequest); - - case "pdf": - DeidentifyFileDocumentPdfRequestDeidentifyPdf pdfRequest = - super.getDeidentifyPdfRequest(request, vaultId, base64Content); - - return super.getDetectFileAPi().deidentifyPdf(pdfRequest); - - case "jpg": - case "jpeg": - case "png": - case "bmp": - case "tif": - case "tiff": - DeidentifyFileImageRequestDeidentifyImage imageRequest = - super.getDeidentifyImageRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyImage(imageRequest); - - case "ppt": - case "pptx": - DeidentifyFileRequestDeidentifyPresentation presentationRequest = - super.getDeidentifyPresentationRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyPresentation(presentationRequest); - - case "csv": - case "xls": - case "xlsx": - DeidentifyFileRequestDeidentifySpreadsheet spreadsheetRequest = - super.getDeidentifySpreadsheetRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifySpreadsheet(spreadsheetRequest); - - case "doc": - case "docx": - DeidentifyFileRequestDeidentifyDocument documentRequest = - super.getDeidentifyDocumentRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyDocument(documentRequest); - - case "json": - case "xml": - DeidentifyFileRequestDeidentifyStructuredText structuredTextRequest = - super.getDeidentifyStructuredTextRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyStructuredText(structuredTextRequest); - - default: - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest genericFileRequest = - super.getDeidentifyGenericFileRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyFile(genericFileRequest); + @Override + protected String resolveVaultUrl() throws SkyflowException { + if (vaultUrlOverride != null) { + return vaultUrlOverride; } + return Utils.getVaultURL(getVaultConfig().getClusterId(), getVaultConfig().getEnv()); } - public DeidentifyFileResponse getDetectRun(GetDetectRunRequest request) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.GET_DETECT_RUN_TRIGGERED.getLog()); - try { - LogUtil.printInfoLog(InfoLogs.VALIDATE_GET_DETECT_RUN_REQUEST.getLog()); - Validations.validateGetDetectRunRequest(request); - setBearerToken(); - String runId = request.getRunId(); - String vaultId = super.getVaultConfig().getVaultId(); - - GetRunRequest getRunRequest = - GetRunRequest.builder() - .vaultId(vaultId) - .build(); - - DetectRunsResponse apiResponse = - super.getDetectFileAPi().getRun(runId, getRunRequest); - - return parseDeidentifyFileResponse(apiResponse, runId, apiResponse.getStatus().toString()); - } catch (ApiClientApiException e) { - String bodyString = extractBodyAsString(e); - LogUtil.printErrorLog(ErrorLogs.GET_DETECT_RUN_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); - } catch (ApiClientException e) { - throw new SkyflowException(e); - } + @Override + protected String getSdkMetrics() { + return Utils.getMetrics().toString(); } } diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/AudioBleep.java b/skyvault/src/main/java/com/skyflow/vault/detect/AudioBleep.java deleted file mode 100644 index 1a75f93b..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/AudioBleep.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.skyflow.vault.detect; - -public class AudioBleep { - private final AudioBleepBuilder builder; - - private AudioBleep(AudioBleepBuilder builder) { - this.builder = builder; - } - - public static AudioBleepBuilder builder() { - return new AudioBleepBuilder(); - } - - public Double getGain() { - return this.builder.gain; - } - - public Double getFrequency() { - return this.builder.frequency; - } - - public Double getStartPadding() { - return this.builder.startPadding; - } - - public Double getStopPadding() { - return this.builder.stopPadding; - } - - public static final class AudioBleepBuilder { - private Double gain; - private Double frequency; - private Double startPadding; - private Double stopPadding; - - private AudioBleepBuilder() { - // Default constructor - } - - public AudioBleepBuilder gain(Double gain) { - this.gain = gain; - return this; - } - - public AudioBleepBuilder frequency(Double frequency) { - this.frequency = frequency; - return this; - } - - public AudioBleepBuilder startPadding(Double startPadding) { - this.startPadding = startPadding; - return this; - } - - public AudioBleepBuilder stopPadding(Double stopPadding) { - this.stopPadding = stopPadding; - return this; - } - - public AudioBleep build() { - return new AudioBleep(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DateTransformation.java b/skyvault/src/main/java/com/skyflow/vault/detect/DateTransformation.java deleted file mode 100644 index 819927d2..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DateTransformation.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.skyflow.enums.DetectEntities; - -import java.util.List; - -public class DateTransformation { - private final int max; - private final int min; - private final List entities; - - public DateTransformation(int max, int min, List entities) { - this.max = max; - this.min = min; - this.entities = entities; - } - - public int getMax() { - return max; - } - - public int getMin() { - return min; - } - - public List getEntities() { - return entities; - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java b/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java deleted file mode 100644 index 3ebc450e..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.DetectOutputTranscriptions; -import com.skyflow.enums.MaskingMethod; -import java.util.List; - -public class DeidentifyFileRequest { - private final DeidentifyFileRequestBuilder builder; - - private DeidentifyFileRequest(DeidentifyFileRequestBuilder builder) { - this.builder = builder; - } - - public static DeidentifyFileRequestBuilder builder() { - return new DeidentifyFileRequestBuilder(); - } - - public FileInput getFileInput() { - return this.builder.fileInput; - } - - public List getEntities() { - return this.builder.entities; - } - - public List getAllowRegexList() { - return this.builder.allowRegexList; - } - - public List getRestrictRegexList() { - return this.builder.restrictRegexList; - } - - public TokenFormat getTokenFormat() { - return this.builder.tokenFormat; - } - - public Transformations getTransformations() { - return this.builder.transformations; - } - - public Boolean getOutputProcessedImage() { - return this.builder.outputProcessedImage; - } - - public Boolean getOutputOcrText() { - return this.builder.outputOcrText; - } - - public MaskingMethod getMaskingMethod() { - return this.builder.maskingMethod; - } - - public Number getPixelDensity() { - return this.builder.pixelDensity; - } - - public Number getMaxResolution() { - return this.builder.maxResolution; - } - - public Boolean getOutputProcessedAudio() { - return this.builder.outputProcessedAudio; - } - - public DetectOutputTranscriptions getOutputTranscription() { - return this.builder.outputTranscription; - } - - public AudioBleep getBleep() { - return this.builder.bleep; - } - - public String getOutputDirectory() { - return this.builder.outputDirectory; - } - - public Integer getWaitTime() { - return this.builder.waitTime; - } - - public static final class DeidentifyFileRequestBuilder { - private List entities; - private List allowRegexList; - private List restrictRegexList; - private TokenFormat tokenFormat; - private Transformations transformations; - private Boolean outputProcessedImage; - private Boolean outputOcrText; - private MaskingMethod maskingMethod; - private Number pixelDensity; - private Number maxResolution; - private Boolean outputProcessedAudio; - private DetectOutputTranscriptions outputTranscription; - private AudioBleep bleep; - private FileInput fileInput; - private String outputDirectory; - private Integer waitTime; - - private DeidentifyFileRequestBuilder() { - // Set default values - this.outputProcessedImage = false; - this.outputOcrText = false; - this.outputProcessedAudio = false; - } - - public DeidentifyFileRequestBuilder file(FileInput fileInput) { - this.fileInput = fileInput; - return this; - } - - public DeidentifyFileRequestBuilder entities(List entities) { - this.entities = entities; - return this; - } - - public DeidentifyFileRequestBuilder allowRegexList(List allowRegexList) { - this.allowRegexList = allowRegexList; - return this; - } - - public DeidentifyFileRequestBuilder restrictRegexList(List restrictRegexList) { - this.restrictRegexList = restrictRegexList; - return this; - } - - public DeidentifyFileRequestBuilder tokenFormat(TokenFormat tokenFormat) { - this.tokenFormat = tokenFormat; - return this; - } - - public DeidentifyFileRequestBuilder transformations(Transformations transformations) { - this.transformations = transformations; - return this; - } - - public DeidentifyFileRequestBuilder outputProcessedImage(Boolean outputProcessedImage) { - this.outputProcessedImage = outputProcessedImage != null ? outputProcessedImage : false; - return this; - } - - public DeidentifyFileRequestBuilder outputOcrText(Boolean outputOcrText) { - this.outputOcrText = outputOcrText != null ? outputOcrText : false; - return this; - } - - public DeidentifyFileRequestBuilder maskingMethod(MaskingMethod maskingMethod) { - this.maskingMethod = maskingMethod; - return this; - } - - public DeidentifyFileRequestBuilder pixelDensity(Number pixelDensity) { - this.pixelDensity = pixelDensity; - return this; - } - - public DeidentifyFileRequestBuilder maxResolution(Number maxResolution) { - this.maxResolution = maxResolution; - return this; - } - - public DeidentifyFileRequestBuilder outputProcessedAudio(Boolean outputProcessedAudio) { - this.outputProcessedAudio = outputProcessedAudio != null ? outputProcessedAudio : false; - return this; - } - - public DeidentifyFileRequestBuilder outputTranscription(DetectOutputTranscriptions outputTranscription) { - this.outputTranscription = outputTranscription; - return this; - } - - public DeidentifyFileRequestBuilder bleep(AudioBleep bleep) { - this.bleep = bleep; - return this; - } - - public DeidentifyFileRequestBuilder outputDirectory(String outputDirectory) { - this.outputDirectory = outputDirectory; - return this; - } - - public DeidentifyFileRequestBuilder waitTime(Integer waitTime) { - this.waitTime = waitTime; - return this; - } - - public DeidentifyFileRequest build() { - return new DeidentifyFileRequest(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java b/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java deleted file mode 100644 index 08636d77..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.skyflow.vault.detect; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import java.util.List; - -public class DeidentifyFileResponse { - private final FileInfo file; - private final String fileBase64; - private final String type; - private final String extension; - private final Integer wordCount; - private final Integer charCount; - private final Float sizeInKb; - private final Float durationInSeconds; - private final Integer pageCount; - private final Integer slideCount; - private final List entities; - private final String runId; - private final String status; - - - public DeidentifyFileResponse(FileInfo file, String fileBase64, String type, String extension, - Integer wordCount, Integer charCount, Float sizeInKb, - Float durationInSeconds, Integer pageCount, Integer slideCount, - List entities, String runId, String status) { - this.file = file; - this.fileBase64 = fileBase64; - this.type = type; - this.extension = extension; - this.wordCount = wordCount; - this.charCount = charCount; - this.sizeInKb = sizeInKb; - this.durationInSeconds = durationInSeconds; - this.pageCount = pageCount; - this.slideCount = slideCount; - this.entities = entities; - this.runId = runId; - this.status = status; - } - - public DeidentifyFileResponse(String runId, String status) { - this(null, null, null, null, null, null, null, null, null, null, null, runId, status); - } - - public FileInfo getFile() { - return file; - } - - public String getFileBase64(){ - return fileBase64; - } - - public String getType() { - return type; - } - - public String getExtension() { - return extension; - } - - public Integer getWordCount() { - return wordCount; - } - - public Integer getCharCount() { - return charCount; - } - - public Float getSizeInKb() { - return sizeInKb; - } - - public Float getDurationInSeconds() { - return durationInSeconds; - } - - public Integer getPageCount() { - return pageCount; - } - - public Integer getSlideCount() { - return slideCount; - } - - public List getEntities() { - return entities; - } - - public String getRunId() { - return runId; - } - - public String getStatus() { - return status; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } - -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java b/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java deleted file mode 100644 index 5f57e3a9..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.skyflow.enums.DetectEntities; - -import java.util.List; - -public class DeidentifyTextRequest { - private final DeidentifyTextRequestBuilder builder; - - private DeidentifyTextRequest(DeidentifyTextRequestBuilder builder) { - this.builder = builder; - } - - public static DeidentifyTextRequestBuilder builder() { - return new DeidentifyTextRequestBuilder(); - } - - public String getText() { - return this.builder.text; - } - - public List getEntities() { - return this.builder.entities; - } - - public List getAllowRegexList() { - return this.builder.allowRegexList; - } - - public List getRestrictRegexList() { - return this.builder.restrictRegexList; - } - - public TokenFormat getTokenFormat() { - return this.builder.tokenFormat; - } - - public Transformations getTransformations() { - return this.builder.transformations; - } - - public static final class DeidentifyTextRequestBuilder { - private String text; - private List entities; - private List allowRegexList; - private List restrictRegexList; - private TokenFormat tokenFormat; - private Transformations transformations; - - private DeidentifyTextRequestBuilder() { - } - - public DeidentifyTextRequestBuilder text(String text) { - this.text = text; - return this; - } - - public DeidentifyTextRequestBuilder entities(List entities) { - this.entities = entities; - return this; - } - - public DeidentifyTextRequestBuilder allowRegexList(List allowRegexList) { - this.allowRegexList = allowRegexList; - return this; - } - - public DeidentifyTextRequestBuilder restrictRegexList(List restrictRegexList) { - this.restrictRegexList = restrictRegexList; - return this; - } - - public DeidentifyTextRequestBuilder tokenFormat(TokenFormat tokenFormat) { - this.tokenFormat = tokenFormat; - return this; - } - - public DeidentifyTextRequestBuilder transformations(Transformations transformations) { - this.transformations = transformations; - return this; - } - - public DeidentifyTextRequest build() { - return new DeidentifyTextRequest(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java b/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java deleted file mode 100644 index 6b6118e0..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import java.util.List; - -public class DeidentifyTextResponse { - private final String processedText; - private final List entities; - private final int wordCount; - private final int charCount; - - public DeidentifyTextResponse(String processedText, List entities, int wordCount, int charCount) { - this.processedText = processedText; - this.entities = entities; - this.wordCount = wordCount; - this.charCount = charCount; - } - - public String getProcessedText() { - return processedText; - } - - public List getEntities() { - return entities; - } - - public int getWordCount() { - return wordCount; - } - - public int getCharCount() { - return charCount; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } - -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/EntityInfo.java b/skyvault/src/main/java/com/skyflow/vault/detect/EntityInfo.java deleted file mode 100644 index 4a84acf9..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/EntityInfo.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.skyflow.vault.detect; - - -import java.util.Map; - -public class EntityInfo { - private final String token; - private final String value; - private final TextIndex textIndex; - private final TextIndex processedIndex; - private final String entity; - private final Map scores; - - public EntityInfo(String token, String value, TextIndex textIndex, TextIndex processedIndex, String entity, java.util.Map scores) { - this.token = token; - this.value = value; - this.textIndex = textIndex; - this.processedIndex = processedIndex; - this.entity = entity; - this.scores = scores; - } - - public String getToken() { - return token; - } - - public String getValue() { - return value; - } - - public TextIndex getTextIndex() { - return textIndex; - } - - public TextIndex getProcessedIndex() { - return processedIndex; - } - - public String getEntity() { - return entity; - } - - public Map getScores() { - return scores; - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java b/skyvault/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java deleted file mode 100644 index 1c41e6ac..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileExtension; -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileType; - -public class FileEntityInfo { - private final String file; - private final String type; - private final String extension; - - public FileEntityInfo(String file, DeidentifiedFileOutputProcessedFileType type, DeidentifiedFileOutputProcessedFileExtension extension) { - this.file = file; - this.type = String.valueOf(type); - this.extension = String.valueOf(extension); - } - - public String getFile() { return file; } - public String getType() { return type; } - public String getExtension() { return extension; } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/FileInfo.java b/skyvault/src/main/java/com/skyflow/vault/detect/FileInfo.java deleted file mode 100644 index 2f13c4f2..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/FileInfo.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.skyflow.vault.detect; - -import java.io.File; - -public class FileInfo { - private String name; - private long size; - private String type; - private long lastModified; - - public FileInfo(File file) { - this.name = file.getName(); - this.size = file.length(); - this.type = ""; - this.lastModified = file.lastModified(); - } - - public String getName() { - return name; - } - - public long getSize() { - return size; - } - - public String getType() { - return type; - } - - public long getLastModified() { - return lastModified; - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/FileInput.java b/skyvault/src/main/java/com/skyflow/vault/detect/FileInput.java deleted file mode 100644 index 3ff1a77e..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/FileInput.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.skyflow.vault.detect; - -import java.io.File; - -public class FileInput { - private final FileInputBuilder builder; - - private FileInput(FileInputBuilder builder) { - this.builder = builder; - } - - public static FileInputBuilder builder() { - return new FileInputBuilder(); - } - - public File getFile() { - return this.builder.file; - } - - public String getFilePath() { - return this.builder.filePath; - } - - public static final class FileInputBuilder { - private File file; - private String filePath; - - private FileInputBuilder() { - // Default constructor - } - - public FileInputBuilder file(File file) { - this.file = file; - return this; - } - - public FileInputBuilder filePath(String filePath) { - this.filePath = filePath; - return this; - } - - public FileInput build() { - return new FileInput(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java b/skyvault/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java deleted file mode 100644 index cebec9f2..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.skyflow.vault.detect; - -public class GetDetectRunRequest { - private final String runId; - - private GetDetectRunRequest(GetDetectRunRequestBuilder builder) { - this.runId = builder.runId; - } - - public static GetDetectRunRequestBuilder builder() { - return new GetDetectRunRequestBuilder(); - } - - public String getRunId() { - return this.runId; - } - - public static final class GetDetectRunRequestBuilder { - private String runId; - - private GetDetectRunRequestBuilder() { - } - - public GetDetectRunRequestBuilder runId(String runId) { - this.runId = runId; - return this; - } - - public GetDetectRunRequest build() { - return new GetDetectRunRequest(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java b/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java deleted file mode 100644 index cc0e216a..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.skyflow.enums.DetectEntities; - -import java.util.List; - -public class ReidentifyTextRequest { - private final ReidentifyTextRequestBuilder builder; - - private ReidentifyTextRequest(ReidentifyTextRequestBuilder builder) { - this.builder = builder; - } - - public static ReidentifyTextRequestBuilder builder() { - return new ReidentifyTextRequestBuilder(); - } - - public String getText() { - return this.builder.text; - } - - public List getRedactedEntities() { - return this.builder.redactedEntities; - } - - public List getMaskedEntities() { - return this.builder.maskedEntities; - } - - public List getPlainTextEntities() { - return this.builder.plainTextEntities; - } - - public static final class ReidentifyTextRequestBuilder { - private String text; - private List redactedEntities; - private List maskedEntities; - private List plainTextEntities; - - private ReidentifyTextRequestBuilder() { - } - - public ReidentifyTextRequestBuilder text(String text) { - this.text = text; - return this; - } - - public ReidentifyTextRequestBuilder redactedEntities(List redactedEntities) { - this.redactedEntities = redactedEntities; - return this; - } - - public ReidentifyTextRequestBuilder maskedEntities(List maskedEntities) { - this.maskedEntities = maskedEntities; - return this; - } - - public ReidentifyTextRequestBuilder plainTextEntities(List plainTextEntities) { - this.plainTextEntities = plainTextEntities; - return this; - } - - public ReidentifyTextRequest build() { - return new ReidentifyTextRequest(this); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java b/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java deleted file mode 100644 index 3a517968..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class ReidentifyTextResponse { - private final String processedText; - - public ReidentifyTextResponse(String processedText) { - this.processedText = processedText; - } - - public String getProcessedText() { - return processedText; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/TextIndex.java b/skyvault/src/main/java/com/skyflow/vault/detect/TextIndex.java deleted file mode 100644 index 6fe99c1d..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/TextIndex.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class TextIndex { - private final Integer start; - private final Integer end; - - public TextIndex(Integer start, Integer end) { - this.start = start; - this.end = end; - } - - public int getStart() { - return start; - } - - public int getEnd() { - return end; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/TokenFormat.java b/skyvault/src/main/java/com/skyflow/vault/detect/TokenFormat.java deleted file mode 100644 index 8809d0a3..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/TokenFormat.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.TokenType; - -import java.util.List; - - -public class TokenFormat { - private final TokenFormatBuilder builder; - - private TokenFormat(TokenFormatBuilder builder) { - this.builder = builder; - } - - public static TokenFormatBuilder builder() { - return new TokenFormatBuilder(); - } - - public TokenType getDefault() { - return this.builder.defaultType; - } - - public List getVaultToken() { - return this.builder.vaultToken; - } - - public List getEntityUniqueCounter() { - return this.builder.entityUniqueCounter; - } - - public List getEntityOnly() { - return this.builder.entityOnly; - } - - public static final class TokenFormatBuilder { - private TokenType defaultType; - private List vaultToken; - private List entityUniqueCounter; - private List entityOnly; - - private TokenFormatBuilder() { - this.defaultType = TokenType.ENTITY_UNIQUE_COUNTER; - } - - public TokenFormatBuilder defaultType(TokenType defaultType) { - this.defaultType = defaultType != null ? defaultType : TokenType.ENTITY_UNIQUE_COUNTER; - return this; - } - - public TokenFormatBuilder vaultToken(List vaultToken) { - this.vaultToken = vaultToken; - return this; - } - - public TokenFormatBuilder entityUniqueCounter(List entityUniqueCounter) { - this.entityUniqueCounter = entityUniqueCounter; - return this; - } - - public TokenFormatBuilder entityOnly(List entityOnly) { - this.entityOnly = entityOnly; - return this; - } - - public TokenFormat build() { - return new TokenFormat(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/Transformations.java b/skyvault/src/main/java/com/skyflow/vault/detect/Transformations.java deleted file mode 100644 index 2e219101..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/Transformations.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.skyflow.vault.detect; - - -public class Transformations { - private final DateTransformation shiftDates; - - public Transformations(DateTransformation shiftDates) { - this.shiftDates = shiftDates; - } - - public DateTransformation getShiftDates() { - return shiftDates; - } -} diff --git a/skyvault/src/test/java/com/skyflow/VaultClientTests.java b/skyvault/src/test/java/com/skyflow/VaultClientTests.java index 312e2892..85db62a8 100644 --- a/skyvault/src/test/java/com/skyflow/VaultClientTests.java +++ b/skyvault/src/test/java/com/skyflow/VaultClientTests.java @@ -7,26 +7,17 @@ import com.skyflow.enums.*; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.resources.files.FilesClient; import com.skyflow.generated.rest.types.*; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.strings.StringsClient; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; import com.skyflow.generated.rest.resources.tokens.TokensClient; import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.UpdateRequest; -import com.skyflow.vault.detect.*; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.Transformations; import com.skyflow.vault.tokens.ColumnValue; import com.skyflow.vault.tokens.DetokenizeData; import com.skyflow.vault.tokens.DetokenizeRequest; @@ -112,28 +103,6 @@ public void testVaultClientGetRecordsAPI() { } } - @Test - public void testVaultClientDetectAPI() { - try { - FilesClient filesClient = vaultClient.getDetectFileAPi(); - Assert.assertNotNull(filesClient); - } catch (Exception e) { - e.printStackTrace(); - Assert.fail(INVALID_EXCEPTION_THROWN + e.getMessage()); - } - } - - @Test - public void testVaultClientDetectTextAPI() { - try { - StringsClient stringsClient = vaultClient.getDetectTextApi(); - Assert.assertNotNull(stringsClient); - } catch (Exception e) { - e.printStackTrace(); - Assert.fail(INVALID_EXCEPTION_THROWN + e.getMessage()); - } - } - @Test public void testVaultClientGetTokensAPI() { try { @@ -369,566 +338,8 @@ public void testSetBearerTokenWithEnvCredentials() { } } - @Test - public void testGetDeIdentifyTextResponse() { - List entities = new ArrayList<>(); - Locations location = Locations.builder() - .startIndex(2) - .endIndex(10) - .startIndexProcessed(3) - .endIndexProcessed(8) - .build(); - - StringResponseEntities detectedEntity = StringResponseEntities.builder() - .token("token123") - .value("value123") - .location(location) - .build(); - entities.add(detectedEntity); - - DeidentifyStringResponse response = DeidentifyStringResponse.builder() - .processedText("processed text") - .wordCount(2) - .characterCount(13) - .entities(entities) - .build(); - - - DeidentifyTextResponse result = vaultClient.getDeIdentifyTextResponse(response); - - Assert.assertNotNull(result); - Assert.assertEquals("processed text", result.getProcessedText()); - Assert.assertEquals(2, result.getWordCount()); - Assert.assertEquals(13, result.getCharCount()); - Assert.assertNotNull(result.getEntities()); - Assert.assertEquals(1, result.getEntities().size()); - Assert.assertEquals("token123", result.getEntities().get(0).getToken()); - Assert.assertEquals("value123", result.getEntities().get(0).getValue()); - Assert.assertEquals(2, result.getEntities().get(0).getTextIndex().getStart()); - Assert.assertEquals(10, result.getEntities().get(0).getTextIndex().getEnd()); - Assert.assertEquals(3, result.getEntities().get(0).getProcessedIndex().getStart()); - Assert.assertEquals(8, result.getEntities().get(0).getProcessedIndex().getEnd()); - } - - @Test - public void testGetDeidentifyStringRequest() { - - List detectEntitiesList = new ArrayList<>(); - detectEntitiesList.add(DetectEntities.NAME); - - List vaultTokenList = new ArrayList<>(); - vaultTokenList.add(DetectEntities.SSN); - - - List entityOnlyList = new ArrayList<>(); - entityOnlyList.add(DetectEntities.DOB); - - List entityUniqueCounterList = new ArrayList<>(); - entityUniqueCounterList.add(DetectEntities.NAME); - - - List restrictRegexList = new ArrayList<>(); - restrictRegexList.add("([0-9]{3}-[0-9]{2}-[0-9]{4})"); - - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) - .entityOnly(entityOnlyList) - .entityUniqueCounter(entityUniqueCounterList) - .build(); - - - List detectEntitiesTransformationList = new ArrayList<>(); - detectEntitiesTransformationList.add(DetectEntities.DOB); - detectEntitiesTransformationList.add(DetectEntities.DATE); - - DateTransformation dateTransformation = new DateTransformation(20, 5, detectEntitiesTransformationList); - Transformations transformations = new Transformations(dateTransformation); - - - DeidentifyTextRequest req = DeidentifyTextRequest.builder() - .text("Sensitive data to deidentify, like Name: Joy SSN 123-45-6789 and DOB 01-01-2000.") - .entities(detectEntitiesList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); - - } - - @Test - public void testDeidentifyFileRequestBuilderAndGetters() { - File file = new File("testfile.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DetectEntities entity = DetectEntities.NAME; - String allowRegex = "^[A-Za-z]+$"; - String restrictRegex = "\\d+"; - TokenFormat tokenFormat = TokenFormat.builder().vaultToken(Collections.singletonList(entity)).build(); - Boolean outputProcessedImage = true; - Boolean outputOcrText = true; - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; - Double pixelDensity = 300.0; - Double maxResolution = 1024.0; - Boolean outputProcessedAudio = false; - DetectOutputTranscriptions outputTranscription = DetectOutputTranscriptions.TRANSCRIPTION; - AudioBleep bleep = AudioBleep.builder().gain(20.0).build(); - String outputDirectory = "/tmp"; - Integer waitTime = 10; - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Arrays.asList(entity)) - .allowRegexList(Collections.singletonList(allowRegex)) - .restrictRegexList(Collections.singletonList(restrictRegex)) - .tokenFormat(tokenFormat) - .outputProcessedImage(outputProcessedImage) - .outputOcrText(outputOcrText) - .maskingMethod(maskingMethod) - .pixelDensity(pixelDensity) - .maxResolution(maxResolution) - .outputProcessedAudio(outputProcessedAudio) - .outputTranscription(outputTranscription) - .bleep(bleep) - .outputDirectory(outputDirectory) - .waitTime(waitTime) - .build(); - - Assert.assertEquals(file, request.getFileInput().getFile()); - Assert.assertEquals(1, request.getEntities().size()); - Assert.assertEquals(allowRegex, request.getAllowRegexList().get(0)); - Assert.assertEquals(restrictRegex, request.getRestrictRegexList().get(0)); - Assert.assertEquals(tokenFormat, request.getTokenFormat()); - Assert.assertEquals(outputProcessedImage, request.getOutputProcessedImage()); - Assert.assertEquals(outputOcrText, request.getOutputOcrText()); - Assert.assertEquals(maskingMethod, request.getMaskingMethod()); - Assert.assertEquals(pixelDensity, request.getPixelDensity()); - Assert.assertEquals(maxResolution, request.getMaxResolution()); - Assert.assertEquals(outputProcessedAudio, request.getOutputProcessedAudio()); - Assert.assertEquals(outputTranscription, request.getOutputTranscription()); - Assert.assertEquals(bleep, request.getBleep()); - Assert.assertEquals(outputDirectory, request.getOutputDirectory()); - Assert.assertEquals(waitTime, request.getWaitTime()); - } - - @Test - public void testDeidentifyFileRequestBuilderDefaults() { - DeidentifyFileRequest request = DeidentifyFileRequest.builder().build(); - Assert.assertNull(request.getEntities()); - Assert.assertNull(request.getAllowRegexList()); - Assert.assertNull(request.getRestrictRegexList()); - Assert.assertNull(request.getTokenFormat()); - Assert.assertNull(request.getTransformations()); - Assert.assertEquals(false, request.getOutputProcessedImage()); - Assert.assertEquals(false, request.getOutputOcrText()); - Assert.assertNull(request.getMaskingMethod()); - Assert.assertNull(request.getPixelDensity()); - Assert.assertNull(request.getMaxResolution()); - Assert.assertEquals(false, request.getOutputProcessedAudio()); - Assert.assertNull(request.getOutputTranscription()); - Assert.assertNull(request.getBleep()); - Assert.assertNull(request.getOutputDirectory()); - Assert.assertNull(request.getWaitTime()); - } - - @Test - public void testGetDeidentifyImageRequest() { - File file = new File("test.jpg"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME, DetectEntities.DOB); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .outputProcessedImage(true) - .outputOcrText(true) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "jpg"; - - DeidentifyFileImageRequestDeidentifyImage imageRequest = vaultClient.getDeidentifyImageRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, imageRequest.getVaultId()); - Assert.assertEquals(base64Content, imageRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), imageRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifyPresentationRequest() { - File file = new File("test.pptx"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "pptx"; - - DeidentifyFileRequestDeidentifyPresentation presRequest = vaultClient.getDeidentifyPresentationRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, presRequest.getVaultId()); - Assert.assertEquals(base64Content, presRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), presRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifySpreadsheetRequest() { - File file = new File("test.csv"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "csv"; - - DeidentifyFileRequestDeidentifySpreadsheet spreadsheetRequest = vaultClient.getDeidentifySpreadsheetRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, spreadsheetRequest.getVaultId()); - Assert.assertEquals(base64Content, spreadsheetRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), spreadsheetRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifyStructuredTextRequest() { - File file = new File("test.json"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "json"; - - DeidentifyFileRequestDeidentifyStructuredText structuredTextRequest = vaultClient.getDeidentifyStructuredTextRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, structuredTextRequest.getVaultId()); - Assert.assertEquals(base64Content, structuredTextRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), structuredTextRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifyDocumentRequest() { - File file = new File("test.docx"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "docx"; - - DeidentifyFileRequestDeidentifyDocument documentRequest = vaultClient.getDeidentifyDocumentRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, documentRequest.getVaultId()); - Assert.assertEquals(base64Content, documentRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), documentRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifyPdfRequest() { - File file = new File("test.pdf"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .pixelDensity(200) - .maxResolution(300) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - - DeidentifyFileDocumentPdfRequestDeidentifyPdf pdfRequest = vaultClient.getDeidentifyPdfRequest(request, vaultId, base64Content); - - Assert.assertEquals(vaultId, pdfRequest.getVaultId()); - Assert.assertEquals(base64Content, pdfRequest.getFile().getBase64()); - } - - @Test - public void testGetDeidentifyAudioRequest() throws SkyflowException { - File file = new File("test.mp3"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - AudioBleep bleep = AudioBleep.builder().frequency(1000.0).gain(10.0).startPadding(1.0).stopPadding(1.0).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .bleep(bleep) - .outputProcessedAudio(true) - .outputTranscription(DetectOutputTranscriptions.TRANSCRIPTION) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String dataFormat = "mp3"; - - DeidentifyFileAudioRequestDeidentifyAudio audioRequest = vaultClient.getDeidentifyAudioRequest(request, vaultId, base64Content, dataFormat); - - Assert.assertEquals(vaultId, audioRequest.getVaultId()); - Assert.assertEquals(base64Content, audioRequest.getFile().getBase64()); - Assert.assertEquals(dataFormat, audioRequest.getFile().getDataFormat().toString()); - } - - @Test - public void testGetDeidentifyTextFileRequest() { - File file = new File("test.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME, DetectEntities.DOB); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - - DeidentifyFileRequestDeidentifyText textRequest = - vaultClient.getDeidentifyTextFileRequest(request, vaultId, base64Content); - - Assert.assertEquals(vaultId, textRequest.getVaultId()); - Assert.assertEquals(base64Content, textRequest.getFile().getBase64()); - } - - @Test - public void testGetDeidentifyStringRequest_AllTokenFormatFields() throws Exception { - List entities = Arrays.asList(DetectEntities.DOB); - List vaultToken = Collections.singletonList(DetectEntities.SSN); - List entityOnly = Collections.singletonList(DetectEntities.DOB); - List entityUniqueCounter = Collections.singletonList(DetectEntities.NAME); - - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultToken) - .entityOnly(entityOnly) - .entityUniqueCounter(entityUniqueCounter) - .build(); - - List allowRegex = Collections.singletonList("a.*"); - List restrictRegex = Collections.singletonList("b.*"); - - DateTransformation dateTransformation = new DateTransformation(10, 5, entities); - Transformations transformations = new Transformations(dateTransformation); - - DeidentifyTextRequest req = DeidentifyTextRequest.builder() - .text("Sensitive data") - .entities(entities) - .allowRegexList(allowRegex) - .restrictRegexList(restrictRegex) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); - - DeidentifyStringRequest result = vaultClient.getDeidentifyStringRequest(req, "vaultId"); - Assert.assertNotNull(result); - Assert.assertEquals("vaultId", result.getVaultId()); - Assert.assertEquals("Sensitive data", result.getText()); - Assert.assertTrue(result.getAllowRegex().isPresent()); - Assert.assertTrue(result.getRestrictRegex().isPresent()); - Assert.assertTrue(result.getTransformations().isPresent()); - } - - @Test - public void testGetDeidentifyStringRequest_NullTokenFormatAndEntities() throws Exception { - DeidentifyTextRequest req = DeidentifyTextRequest.builder() - .text("No entities or tokenFormat") - .build(); - - DeidentifyStringRequest result = vaultClient.getDeidentifyStringRequest(req, "vaultId"); - Assert.assertNotNull(result); - Assert.assertEquals("vaultId", result.getVaultId()); - Assert.assertEquals("No entities or tokenFormat", result.getText()); - } - - @Test - public void testGetReidentifyStringRequest_AllFields() throws Exception { - List masked = Arrays.asList(DetectEntities.NAME, DetectEntities.DOB); - List plaintext = Collections.singletonList(DetectEntities.SSN); - List redacted = Collections.singletonList(DetectEntities.DATE); - - ReidentifyTextRequest req = ReidentifyTextRequest.builder() - .text("Sensitive data") - .maskedEntities(masked) - .plainTextEntities(plaintext) - .redactedEntities(redacted) - .build(); - - ReidentifyStringRequest result = vaultClient.getReidentifyStringRequest(req, "vaultId"); - Assert.assertNotNull(result); - Assert.assertEquals("vaultId", result.getVaultId().get()); - Assert.assertEquals("Sensitive data", result.getText().get()); - Assert.assertNotNull(result.getFormat()); - } - - @Test - public void testGetReidentifyStringRequest_NullFields() throws Exception { - ReidentifyTextRequest req = ReidentifyTextRequest.builder() - .text("No entities") - .build(); - - ReidentifyStringRequest result = vaultClient.getReidentifyStringRequest(req, "vaultId"); - Assert.assertNotNull(result); - Assert.assertEquals("vaultId", result.getVaultId().get()); - Assert.assertEquals("No entities", result.getText().get()); - Assert.assertNotNull(result.getFormat()); - } - - @Test - public void testGetTransformations_NullInput() throws Exception { - // Should return null if input is null - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("getTransformations", Transformations.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, new Object[]{null}); - Assert.assertNull(result); - } - - @Test - public void testGetTransformations_NullShiftDates() throws Exception { - Transformations transformations = new Transformations(null); - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("getTransformations", Transformations.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, transformations); - Assert.assertNull(result); - } - - @Test - public void testGetTransformations_EmptyEntities() throws Exception { - DateTransformation dateTransformation = new DateTransformation(10, 5, new ArrayList<>()); - Transformations transformations = new Transformations(dateTransformation); - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("getTransformations", Transformations.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, transformations); - Assert.assertNotNull(result); - // Should have empty entityTypes list - com.skyflow.generated.rest.types.Transformations restTransform = (com.skyflow.generated.rest.types.Transformations) result; - Assert.assertTrue(restTransform.getShiftDates().get().getEntityTypes().get().isEmpty()); - } - - @Test - public void testGetTransformations_WithEntities() throws Exception { - List entities = Arrays.asList(DetectEntities.DOB, DetectEntities.DATE); - DateTransformation dateTransformation = new DateTransformation(20, 5, entities); - Transformations transformations = new Transformations(dateTransformation); - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("getTransformations", Transformations.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, transformations); - Assert.assertNotNull(result); - com.skyflow.generated.rest.types.Transformations restTransform = (com.skyflow.generated.rest.types.Transformations) result; - Assert.assertEquals(2, restTransform.getShiftDates().get().getEntityTypes().get().size()); - } - - @Test - public void testGetDeidentifyGenericFileRequest_AllFields() throws SkyflowException { - File file = new File("test.custom"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME, DetectEntities.DOB); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .allowRegexList(Arrays.asList("a.*")) - .restrictRegexList(Arrays.asList("b.*")) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String fileExtension = "txt"; - - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest genericRequest = - vaultClient.getDeidentifyGenericFileRequest(request, vaultId, base64Content, fileExtension); - - Assert.assertEquals(vaultId, genericRequest.getVaultId()); - Assert.assertEquals(base64Content, genericRequest.getFile().getBase64()); - Assert.assertNotNull(genericRequest.getEntityTypes()); - Assert.assertNotNull(genericRequest.getTokenType()); - Assert.assertTrue(genericRequest.getAllowRegex().isPresent()); - Assert.assertTrue(genericRequest.getRestrictRegex().isPresent()); - } - // --- unsupported file extension must throw SkyflowException, not raw IllegalArgumentException --- - @Test - public void testGetDeidentifyGenericFileRequest_UnsupportedExtensionThrowsSkyflowException() { - File file = new File("test.xyz"); - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - - try { - vaultClient.getDeidentifyGenericFileRequest(request, "vault123", "base64string", "xyz"); - Assert.fail("Should have thrown an exception"); - } catch (SkyflowException e) { - Assert.assertNotNull(e.getMessage()); - } catch (IllegalArgumentException e) { - Assert.fail("should throw SkyflowException, not raw IllegalArgumentException: " + e); - } - } - - @Test - public void testMapAudioDataFormat_mp3() throws Exception { - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("mapAudioDataFormat", String.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, "mp3"); - Assert.assertEquals(FileDataDeidentifyAudioDataFormat.MP_3, result); - } - - @Test - public void testMapAudioDataFormat_wav() throws Exception { - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("mapAudioDataFormat", String.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, "wav"); - Assert.assertEquals(FileDataDeidentifyAudioDataFormat.WAV, result); - } - - @Test - public void testMapAudioDataFormat_invalid() throws Exception { - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("mapAudioDataFormat", String.class); - method.setAccessible(true); - try { - method.invoke(vaultClient, "ogg"); - Assert.fail("Should throw SkyflowException for invalid audio type"); - } catch (Exception e) { - Throwable cause = e.getCause(); - Assert.assertTrue(cause instanceof SkyflowException); - } - } - // Fields moved to base classes (e.g. common.BaseVaultClient) aren't found by // getDeclaredField on the subclass, so walk up the hierarchy. private java.lang.reflect.Field findDeclaredField(Class clazz, String fieldName) throws NoSuchFieldException { @@ -958,67 +369,6 @@ public void testGetFileForFileUpload_withFileObject() { } } - @Test - public void testGetDeidentifyImageRequest_withMaskingMethod() { - try { - java.io.File file = new java.io.File("test.jpg"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .maskingMethod(MaskingMethod.BLACKBOX) - .outputProcessedImage(true) - .build(); - - DeidentifyFileImageRequestDeidentifyImage imageRequest = - vaultClient.getDeidentifyImageRequest(request, vaultID, "base64content", "jpg"); - - Assert.assertNotNull(imageRequest); - Assert.assertTrue(imageRequest.getMaskingMethod().isPresent()); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - - @Test - public void testGetDeIdentifyTextResponse_withEntityScores() { - Locations location = Locations.builder() - .startIndex(0) - .endIndex(5) - .startIndexProcessed(0) - .endIndexProcessed(5) - .build(); - - Map scores = new HashMap<>(); - scores.put("EMAIL_ADDRESS", 0.95); - - StringResponseEntities entity = StringResponseEntities.builder() - .location(location) - .token("tok") - .value("val") - .entityType("EMAIL_ADDRESS") - .entityScores(scores) - .build(); - - DeidentifyStringResponse deidentifyResponse = DeidentifyStringResponse.builder() - .entities(Collections.singletonList(entity)) - .processedText("processed text") - .wordCount(2) - .characterCount(13) - .build(); - - DeidentifyTextResponse result = vaultClient.getDeIdentifyTextResponse(deidentifyResponse); - - Assert.assertNotNull(result); - Assert.assertEquals(1, result.getEntities().size()); - // Entity scores map lambda was invoked → getScores() should have the score - Assert.assertEquals(0.95, result.getEntities().get(0).getScores().get("EMAIL_ADDRESS"), 0.001); - } - @Test public void testUpdateExecutorInHTTP_interceptorAddsAuthorizationHeader() { try { @@ -1085,101 +435,4 @@ public void testGetFileForFileUpload_withNoFileInput_returnsNull() { } } - @Test - public void testGetDeidentifyImageRequest_withEntityOnlyNull_andEntityUniqueCounterNonEmpty() { - try { - java.io.File file = new java.io.File("test.jpg"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder() - .entityUniqueCounter(entities) - .build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - DeidentifyFileImageRequestDeidentifyImage imageRequest = - vaultClient.getDeidentifyImageRequest(request, vaultID, "base64content", "jpg"); - - Assert.assertNotNull(imageRequest); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - - @Test - public void testGetDeidentifyImageRequest_withEmptyEntityOnlyList() { - try { - java.io.File file = new java.io.File("test.jpg"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder() - .entityOnly(Collections.emptyList()) - .entityUniqueCounter(Collections.emptyList()) - .build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - DeidentifyFileImageRequestDeidentifyImage imageRequest = - vaultClient.getDeidentifyImageRequest(request, vaultID, "base64content", "jpg"); - Assert.assertNotNull(imageRequest); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - - @Test - public void testGetDeidentifyGenericFileRequest_withEmptyEntityLists() { - try { - java.io.File file = new java.io.File("test.pdf"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder() - .entityOnly(Collections.emptyList()) - .entityUniqueCounter(Collections.emptyList()) - .build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest result = - vaultClient.getDeidentifyGenericFileRequest(request, vaultID, "base64content", "pdf"); - Assert.assertNotNull(result); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - - @Test - public void testGetDeidentifyGenericFileRequest_withNullFileExtension() { - // Covers the `fileExtension != null ? ... : null` false branch at line 779. - // The ternary evaluates null, which is then passed to FileData.builder().dataFormat(null) - // which throws — confirming the null branch of the ternary was exercised. - java.io.File file = new java.io.File("test.pdf"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .build(); - - try { - vaultClient.getDeidentifyGenericFileRequest(request, vaultID, "base64content", null); - Assert.fail("Expected exception from null dataFormat"); - } catch (Exception e) { - // null fileExtension → ternary false branch → null passed to dataFormat() → throws - Assert.assertNotNull(e.getMessage()); - } - } } diff --git a/skyvault/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java b/skyvault/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java deleted file mode 100644 index 6d70a17c..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class DeidentifyFileStatusTest { - - @Test - public void testInProgress() { - Assert.assertEquals("IN_PROGRESS", DeidentifyFileStatus.IN_PROGRESS.value()); - } - - @Test - public void testFailed() { - Assert.assertEquals("FAILED", DeidentifyFileStatus.FAILED.value()); - } - - @Test - public void testSuccess() { - Assert.assertEquals("SUCCESS", DeidentifyFileStatus.SUCCESS.value()); - } - - @Test - public void testUnknown() { - Assert.assertEquals("UNKNOWN", DeidentifyFileStatus.UNKNOWN.value()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/enums/DetectEntitiesTest.java b/skyvault/src/test/java/com/skyflow/enums/DetectEntitiesTest.java deleted file mode 100644 index 2bb29f0c..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/DetectEntitiesTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class DetectEntitiesTest { - - @Test - public void testGetDetectEntities() { - Assert.assertEquals("account_number", DetectEntities.ACCOUNT_NUMBER.getDetectEntities()); - Assert.assertEquals("account_number", DetectEntities.ACCOUNT_NUMBER.toString()); - } - - @Test - public void testAll() { - Assert.assertEquals("all", DetectEntities.ALL.getDetectEntities()); - } - - @Test - public void testName() { - Assert.assertEquals("name", DetectEntities.NAME.getDetectEntities()); - Assert.assertEquals("name", DetectEntities.NAME.toString()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java b/skyvault/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java deleted file mode 100644 index 6df404ed..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class DetectOutputTranscriptionsTest { - - @Test - public void testDiarizedTranscription() { - Assert.assertEquals("diarized_transcription", DetectOutputTranscriptions.DIARIZED_TRANSCRIPTION.getDetectOutputTranscriptions()); - Assert.assertEquals("diarized_transcription", DetectOutputTranscriptions.DIARIZED_TRANSCRIPTION.toString()); - } - - @Test - public void testMedicalDiarizedTranscription() { - Assert.assertEquals("medical_diarized_transcription", DetectOutputTranscriptions.MEDICAL_DIARIZED_TRANSCRIPTION.getDetectOutputTranscriptions()); - Assert.assertEquals("medical_diarized_transcription", DetectOutputTranscriptions.MEDICAL_DIARIZED_TRANSCRIPTION.toString()); - } - - @Test - public void testMedicalTranscription() { - Assert.assertEquals("medical_transcription", DetectOutputTranscriptions.MEDICAL_TRANSCRIPTION.getDetectOutputTranscriptions()); - Assert.assertEquals("medical_transcription", DetectOutputTranscriptions.MEDICAL_TRANSCRIPTION.toString()); - } - - @Test - public void testTranscription() { - Assert.assertEquals("transcription", DetectOutputTranscriptions.TRANSCRIPTION.getDetectOutputTranscriptions()); - Assert.assertEquals("transcription", DetectOutputTranscriptions.TRANSCRIPTION.toString()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/enums/MaskingMethodTest.java b/skyvault/src/test/java/com/skyflow/enums/MaskingMethodTest.java deleted file mode 100644 index f675189e..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/MaskingMethodTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class MaskingMethodTest { - - @Test - public void testBlackbox() { - Assert.assertEquals("blackbox", MaskingMethod.BLACKBOX.getMaskingMethod()); - Assert.assertEquals("blackbox", MaskingMethod.BLACKBOX.toString()); - } - - @Test - public void testBlur() { - Assert.assertEquals("blur", MaskingMethod.BLUR.getMaskingMethod()); - Assert.assertEquals("blur", MaskingMethod.BLUR.toString()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/enums/TokenTypeTest.java b/skyvault/src/test/java/com/skyflow/enums/TokenTypeTest.java deleted file mode 100644 index 4f5c0901..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/TokenTypeTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class TokenTypeTest { - - @Test - public void testVaultToken() { - Assert.assertEquals("vault_token", TokenType.VAULT_TOKEN.getTokenType()); - Assert.assertEquals("vault_token", TokenType.VAULT_TOKEN.toString()); - } - - @Test - public void testEntityUniqueCounter() { - Assert.assertEquals("entity_unq_counter", TokenType.ENTITY_UNIQUE_COUNTER.getTokenType()); - Assert.assertEquals("entity_unq_counter", TokenType.ENTITY_UNIQUE_COUNTER.toString()); - } - - @Test - public void testEntityOnly() { - Assert.assertEquals("entity_only", TokenType.ENTITY_ONLY.getTokenType()); - Assert.assertEquals("entity_only", TokenType.ENTITY_ONLY.toString()); - } - - @Test - public void testGetDefault() { - Assert.assertEquals(TokenType.ENTITY_UNIQUE_COUNTER.getTokenType(), TokenType.VAULT_TOKEN.getDefault()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java deleted file mode 100644 index f0347eeb..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java +++ /dev/null @@ -1,466 +0,0 @@ -package com.skyflow.vault.controller; - -import com.skyflow.config.BaseVaultConfig; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.types.DeidentifiedFileOutput; -import com.skyflow.generated.rest.types.DetectRunsResponse; -import com.skyflow.generated.rest.types.DetectRunsResponseStatus; -import com.skyflow.vault.detect.AudioBleep; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.FileInput; -import com.skyflow.vault.detect.GetDetectRunRequest; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.File; -import java.lang.reflect.Method; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Collections; - -public class DetectControllerFileTests { - private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; - private static String vaultID = null; - private static String clusterID = null; - private static VaultConfig vaultConfig = null; - private static DetectController detectController = null; - - @BeforeClass - public static void setup() { - vaultID = "vault123"; - clusterID = "cluster123"; - - Credentials credentials = new Credentials(); - credentials.setToken("valid-token"); - - vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(vaultID); - vaultConfig.setClusterId(clusterID); - vaultConfig.setEnv(com.skyflow.enums.Env.DEV); - vaultConfig.setCredentials(credentials); - - detectController = new DetectController(vaultConfig, credentials); - } - - @Test - public void testUnreadableFileInDeidentifyFileRequest() { - try { - File file = new File("unreadable.txt") { - @Override - public boolean exists() { return true; } - @Override - public boolean isFile() { return true; } - @Override - public boolean canRead() { return false; } - }; - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException | RuntimeException e) { - // Depending on implementation, could be SkyflowException or RuntimeException - Assert.assertTrue(e.getMessage().contains("not readable") || e.getMessage().contains("unreadable.txt")); - } - } - - @Test - public void testNullEntitiesInDeidentifyFileRequest() { - try { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(new ArrayList<>()) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testNullRequest() { - try { - detectController.deidentifyFile(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputBothFileAndFilePathNull() { - try { - FileInput fileInput = FileInput.builder().build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for both file and filePath being null"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputBothFileAndFilePathProvided() { - try { - java.io.File file = java.io.File.createTempFile("test", ".txt"); - String filePath = file.getAbsolutePath(); - FileInput fileInput = FileInput.builder().file(file).filePath(filePath).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for both file and filePath being provided"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.BothFileAndFilePathProvided.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputEmptyFilePath() { - try { - FileInput fileInput = FileInput.builder().filePath("").build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for empty filePath"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.InvalidFilePath.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputNonExistentFile() { - try { - java.io.File file = new java.io.File("nonexistent.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for non-existent file"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.FileNotFoundToDeidentify.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputUnreadableFile() { - try { - java.io.File file = new java.io.File("unreadable.txt") { - @Override - public boolean exists() { return true; } - @Override - public boolean isFile() { return true; } - @Override - public boolean canRead() { return false; } - }; - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for unreadable file"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.FileNotReadableToDeidentify.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testNonExistentFileInDeidentifyFileRequest() { - try { - File file = new File("nonexistent.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testInvalidPixelDensity() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .pixelDensity(-1) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidMaxResolution() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .maxResolution(-1) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidBleepFrequency() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - AudioBleep bleep = AudioBleep.builder().build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .bleep(bleep) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidOutputDirectory() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .outputDirectory("not/a/real/dir") - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidWaitTime() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(-1) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testWaitTimeExceedsLimit() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(100) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testNullGetDetectRunRequest() { - try { - detectController.getDetectRun(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testEmptyRunIdInGetDetectRunRequest() { - try { - GetDetectRunRequest request = GetDetectRunRequest.builder().build(); - detectController.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testNullRunIdInGetDetectRunRequest() { - try { - GetDetectRunRequest request = GetDetectRunRequest.builder().runId(null).build(); - detectController.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testInvalidBleepGain() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - AudioBleep bleep = AudioBleep.builder().frequency(440.0).gain(-1.0).startPadding(0.1).stopPadding(0.1).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .bleep(bleep) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidBleepStartPadding() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - AudioBleep bleep = AudioBleep.builder().frequency(440.0).gain(0.5).startPadding(-0.1).stopPadding(0.1).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .bleep(bleep) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidBleepStopPadding() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - AudioBleep bleep = AudioBleep.builder().frequency(440.0).gain(0.5).startPadding(0.1).stopPadding(-0.1).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .bleep(bleep) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testOutputDirectoryNotDirectory() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - File notADir = File.createTempFile("notadir", ".txt"); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .outputDirectory(notADir.getAbsolutePath()) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - notADir.delete(); - } - - @Test - public void testOutputDirectoryNotWritable() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - File dir = Files.createTempDirectory("notwritabledir").toFile(); - dir.setWritable(false); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .outputDirectory(dir.getAbsolutePath()) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } finally { - dir.setWritable(true); - file.delete(); - dir.delete(); - } - } - - // C1 regression: the dead statement response.getEntities().get(0) has been removed. - // The short-form constructor produces null entities; the guarded block at the call site - // handles that safely. - @Test - public void testDeidentifyFileResponseNullEntitiesDoesNotThrow() { - DeidentifyFileResponse response = new DeidentifyFileResponse("run-id", "IN_PROGRESS"); - Assert.assertNull("Entities must be null from short-form constructor", response.getEntities()); - } - - // C2: getFirstOutput must return null (not throw NoSuchElementException) when output is absent. - @Test - public void testGetFirstOutputReturnsNullWhenOutputAbsent() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder().build(); - Method method = DetectController.class.getDeclaredMethod("getFirstOutput", DetectRunsResponse.class); - method.setAccessible(true); - DeidentifiedFileOutput result = (DeidentifiedFileOutput) method.invoke(null, response); - Assert.assertNull("getFirstOutput must return null when output Optional is absent", result); - } - - // C2: getFirstOutput must return null when output list is present but empty. - @Test - public void testGetFirstOutputReturnsNullWhenOutputListEmpty() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder() - .output(Collections.emptyList()) - .build(); - Method method = DetectController.class.getDeclaredMethod("getFirstOutput", DetectRunsResponse.class); - method.setAccessible(true); - DeidentifiedFileOutput result = (DeidentifiedFileOutput) method.invoke(null, response); - Assert.assertNull("getFirstOutput must return null when output list is empty", result); - } - - // C3: parseDeidentifyFileResponse must not throw when processedFileExtension is absent; - // it should fall back to the UNKNOWN sentinel value. - @Test - public void testParseDeidentifyFileResponseFallsBackWhenExtensionAbsent() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .output(Collections.singletonList(DeidentifiedFileOutput.builder().build())) - .build(); - - Method method = DetectController.class.getDeclaredMethod( - "parseDeidentifyFileResponse", DetectRunsResponse.class, String.class, String.class); - method.setAccessible(true); - DeidentifyFileResponse result = (DeidentifyFileResponse) method.invoke(null, response, "run-id", "SUCCESS"); - - Assert.assertNotNull("Response must not be null", result); - Assert.assertEquals("Extension must fall back to UNKNOWN when absent", - DetectRunsResponseStatus.UNKNOWN.toString(), result.getExtension()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index b6c504af..b31002ef 100644 --- a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -1,1138 +1,632 @@ package com.skyflow.vault.controller; import com.skyflow.Skyflow; -import com.skyflow.VaultClient; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DetectEntities; +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentificationType; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.Entity; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.GuardrailsValidation; +import com.skyflow.detect.PollOptions; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ReidentifyStringResponse; import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.HttpStatus; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.ApiClient; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.resources.files.FilesClient; -import com.skyflow.generated.rest.resources.files.requests.GetRunRequest; -import com.skyflow.generated.rest.resources.strings.StringsClient; -import com.skyflow.generated.rest.types.DeidentifiedFileOutput; -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileExtension; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; -import com.skyflow.generated.rest.types.DetectRunsResponseOutputType; -import com.skyflow.generated.rest.types.DetectRunsResponseStatus; -import com.skyflow.generated.rest.types.IdentifyResponse; -import com.skyflow.generated.rest.types.WordCharacterCount; -import com.skyflow.utils.Constants; -import com.skyflow.utils.Utils; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.DeidentifyTextResponse; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.GetDetectRunRequest; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.ReidentifyTextResponse; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; -import org.mockito.Mockito; +import org.junit.rules.TemporaryFolder; import java.io.File; -import java.lang.reflect.Field; import java.nio.file.Files; import java.util.Base64; -import java.util.Collections; - -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.FileInput; -import com.skyflow.vault.detect.TokenFormat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; +import java.util.Arrays; +import java.util.Collections; public class DetectControllerTests { - private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; - private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; - private static String vaultID = null; - private static String clusterID = null; - private static VaultConfig vaultConfig = null; - private static Skyflow skyflowClient = null; - - @BeforeClass - public static void setup() throws SkyflowException { - vaultID = "vault123"; - clusterID = "cluster123"; - - Credentials credentials = new Credentials(); - credentials.setToken("valid-token"); - - vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(vaultID); - vaultConfig.setClusterId(clusterID); - vaultConfig.setEnv(Env.DEV); - vaultConfig.setCredentials(credentials); - - skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.DEBUG) - .addVaultConfig(vaultConfig) - .build(); - } - - // ─── helper: build a DetectController with a mocked ApiClient ───────────── - private static DetectController createDetectControllerWithMock(ApiClient mockApiClient) throws Exception { - Credentials creds = new Credentials(); - creds.setApiKey("sky-ab123-abcd1234cdef1234abcd4321cdef4321"); + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + private static VaultConfig vaultConfig(String vaultId) { VaultConfig config = new VaultConfig(); - config.setVaultId(vaultID); - config.setClusterId(clusterID); - config.setEnv(Env.DEV); - - DetectController controller = new DetectController(config, creds); - Field f = VaultClient.class.getDeclaredField("apiClient"); - f.setAccessible(true); - f.set(controller, mockApiClient); - return controller; + config.setVaultId(vaultId); + config.setClusterId("cluster123"); + config.setEnv(Env.PROD); + return config; } - // ─── deidentifyText — validation ────────────────────────────────────────── - @Test - public void testNullTextInRequestInDeidentifyStringMethod() { + public void detectAccessorResolvesConfiguredVaults() throws SkyflowException { + Skyflow client = Skyflow.builder() + .addVaultConfig(vaultConfig("vault-a")) + .addVaultConfig(vaultConfig("vault-b")) + .build(); + Assert.assertNotNull(client.detect()); + Assert.assertSame(client.detect(), client.detect("vault-a")); + Assert.assertNotSame(client.detect("vault-a"), client.detect("vault-b")); try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text(null).build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); + client.detect("vault-c"); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidTextInDeIdentify.getMessage(), Constants.SDK_PREFIX), - e.getMessage() - ); - Assert.assertNull(e.getRequestId()); - Assert.assertNull(e.getGrpcCode()); - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } @Test - public void testEmptyTextInRequestInDeidentifyStringMethod() { + public void detectAccessorFollowsVaultConfigRemoval() throws SkyflowException { + Skyflow client = Skyflow.builder().addVaultConfig(vaultConfig("vault-a")).build(); + client.removeVaultConfig("vault-a"); try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("").build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); + client.detect(); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidTextInDeIdentify.getMessage(), Constants.SDK_PREFIX), - e.getMessage() - ); - Assert.assertNull(e.getRequestId()); - Assert.assertNull(e.getGrpcCode()); - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } - // ─── deidentifyText — happy path ────────────────────────────────────────── - @Test - public void testDeidentifyTextHappyPath() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - DeidentifyStringResponse fakeResponse = DeidentifyStringResponse.builder() - .processedText("hello [REDACTED]") - .wordCount(2) - .characterCount(16) - .build(); - - when(mockStringsClient.deidentifyString(any(), any())).thenReturn(fakeResponse); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("hello world").build(); - + public void deidentifyStringValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); try { - DeidentifyTextResponse response = controller.deidentifyText(request); - Assert.assertNotNull(response); - Assert.assertEquals("hello [REDACTED]", response.getProcessedText()); - Assert.assertEquals(2, response.getWordCount()); - Assert.assertEquals(16, response.getCharCount()); + controller.deidentifyString(DeidentifyStringRequest.builder().text(" ").configurationId("cfg").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidTextInDeidentifyString.getMessage(), e.getMessage()); } } - // ─── deidentifyText — API error path ────────────────────────────────────── - @Test - public void testDeidentifyTextApiError() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - int expectedStatusCode = 403; - when(mockStringsClient.deidentifyString(any(), any())) - .thenThrow(new ApiClientApiException("Forbidden", expectedStatusCode, "access denied")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("hello world").build(); - + public void reidentifyStringValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); try { - controller.deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); + controller.reidentifyString(ReidentifyStringRequest.builder().text(" ").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidTextInReidentifyString.getMessage(), e.getMessage()); } } + /** + * Null credentials would make the SDK fall back to SKYFLOW_CREDENTIALS from the environment or a + * .env file, which CI provides, so the outcome would depend on the machine. An explicitly empty + * {@link Credentials} is rejected by validation the same way everywhere, before any network call. + */ @Test - public void testDeidentifyTextApiError500() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - int expectedStatusCode = 500; - when(mockStringsClient.deidentifyString(any(), any())) - .thenThrow(new ApiClientApiException("Internal Server Error", expectedStatusCode, "server error body")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("some text").build(); - + public void missingCredentialsSurfaceAsSkyflowExceptionWithoutNetworkCall() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), emptyCredentials()); try { - controller.deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); + controller.reidentifyString(ReidentifyStringRequest.builder().text("[NAME_1]").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); } } - @Test - public void testDeidentifyTextApiClientException() throws Exception { - // Network-level failure (no HTTP response), as opposed to ApiClientApiException's - // rejected-with-a-status-code failure above. - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - when(mockStringsClient.deidentifyString(any(), any())) - .thenThrow(new ApiClientException("Network error executing HTTP request")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("hello world").build(); - - try { - controller.deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertTrue(e.getCause() instanceof ApiClientException); - } + /** Credentials with no path, string, token or API key set. */ + private static Credentials emptyCredentials() { + return new Credentials(); } - // ─── reidentifyText — validation ────────────────────────────────────────── - - @Test - public void testNullTextInRequestInReidentifyStringMethod() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text(null).build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidTextInReIdentify.getMessage(), Constants.SDK_PREFIX), - e.getMessage() - ); - Assert.assertNull(e.getRequestId()); - Assert.assertNull(e.getGrpcCode()); - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); - } + /** API-key credentials resolve without a token exchange, so the only network call is the Detect request. */ + private static Credentials apiKeyCredentials() { + Credentials credentials = new Credentials(); + credentials.setApiKey("sky-abcde-0123456789abcdef0123456789abcdef"); + return credentials; } - @Test - public void testEmptyTextInRequestInReidentifyStringMethod() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("").build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidTextInReIdentify.getMessage(), Constants.SDK_PREFIX), - e.getMessage() - ); - Assert.assertNull(e.getRequestId()); - Assert.assertNull(e.getGrpcCode()); - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); - } + private static DetectController controllerFor(MockWebServer server) { + VaultConfig config = vaultConfig("vault-1"); + DetectController controller = new DetectController(config, apiKeyCredentials(), server.url("").toString()); + controller.setCommonHttpConfig(null, 0, null, null); + return controller; } - // ─── reidentifyText — happy path ────────────────────────────────────────── - - @Test - public void testReidentifyTextHappyPath() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - IdentifyResponse fakeResponse = IdentifyResponse.builder().text("original text").build(); - when(mockStringsClient.reidentifyString(any(), any())).thenReturn(fakeResponse); + // ─── Detect V2 methods, exercised through the skyvault controller ────────── + // These prove the skyvault wiring (cluster-derived vault URL, API-key credentials, + // skyvault SDK metrics header) end to end, not just the shared base logic. - DetectController controller = createDetectControllerWithMock(mockApiClient); - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("tokenized text").build(); + private static final String API_KEY = "sky-abcde-0123456789abcdef0123456789abcdef"; - try { - ReidentifyTextResponse response = controller.reidentifyText(request); - Assert.assertNotNull(response); - Assert.assertEquals("original text", response.getProcessedText()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); - } + private static void assertCommonHeaders(RecordedRequest recorded, String method, String path) { + Assert.assertEquals(method, recorded.getMethod()); + Assert.assertEquals(path, recorded.getPath()); + Assert.assertEquals("Bearer " + API_KEY, recorded.getHeader("Authorization")); + String metrics = recorded.getHeader("sky-metadata"); + Assert.assertNotNull(metrics); + Assert.assertTrue(metrics, metrics.contains("skyflow-java@")); } - // ─── reidentifyText — API error path ────────────────────────────────────── - @Test - public void testReidentifyTextApiError() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - int expectedStatusCode = 401; - when(mockStringsClient.reidentifyString(any(), any())) - .thenThrow(new ApiClientApiException("Unauthorized", expectedStatusCode, "unauthorized body")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("some text").build(); - + public void deidentifyStringRoundTripWithStoredConfiguration() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + server.enqueue(new MockResponse().setResponseCode(200).setHeader("Content-Type", "application/json") + .setBody("{\"processedText\":\"My name is [NAME_1].\"," + + "\"entities\":[{\"token\":\"NAME_1\",\"value\":\"John Doe\",\"entityType\":\"NAME\"," + + "\"location\":{\"startIndex\":11,\"endIndex\":19,\"startIndexProcessed\":11,\"endIndexProcessed\":19}," + + "\"entityScores\":{\"NAME\":0.98}}]," + + "\"metrics\":{\"wordCount\":4,\"characterCount\":20}}")); + + DeidentifyStringResponse response = controllerFor(server).deidentifyString(DeidentifyStringRequest.builder() + .text("My name is John Doe.").configurationId("cfg-123").build()); + + Assert.assertEquals("My name is [NAME_1].", response.getProcessedText()); + Assert.assertEquals(1, response.getEntities().size()); + Assert.assertEquals("NAME_1", response.getEntities().get(0).getToken()); + Assert.assertEquals("John Doe", response.getEntities().get(0).getValue()); + Assert.assertEquals("NAME", response.getEntities().get(0).getEntityType()); + Assert.assertEquals(Integer.valueOf(11), response.getEntities().get(0).getLocation().getStartIndex()); + Assert.assertEquals(Integer.valueOf(19), response.getEntities().get(0).getLocation().getEndIndexProcessed()); + Assert.assertEquals(0.98, response.getEntities().get(0).getEntityScores().get("NAME"), 1e-9); + Assert.assertEquals(Integer.valueOf(4), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/deidentify/string"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"My name is John Doe.\"")); + Assert.assertTrue(body, body.contains("\"configurationId\":\"cfg-123\"")); + Assert.assertFalse(body, body.contains("\"configuration\":")); + } finally { + server.shutdown(); } } @Test - public void testReidentifyTextApiError500() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - int expectedStatusCode = 500; - when(mockStringsClient.reidentifyString(any(), any())) - .thenThrow(new ApiClientApiException("Internal Server Error", expectedStatusCode, "server error body")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("some text").build(); - + public void deidentifyStringRoundTripWithInlineConfigurationScopedToVault() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"processedText\":\"[NAME_1]\"}")); + + DeidentifyStringResponse response = controllerFor(server).deidentifyString(DeidentifyStringRequest.builder() + .text("John") + .configuration(DetectConfiguration.builder() + .detect(Detect.builder().entities(Collections.singletonList( + Entity.builder().entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination("names").build())).build()) + .build()) + .build()); + + Assert.assertEquals("[NAME_1]", response.getProcessedText()); + Assert.assertTrue(response.getEntities().isEmpty()); + Assert.assertNull(response.getMetrics()); + + String body = server.takeRequest().getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"configuration\":{")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); // injected by the controller + Assert.assertTrue(body, body.contains("\"entityType\":\"NAME\"")); + Assert.assertTrue(body, body.contains("\"deidentificationType\":\"VAULT_TOKEN\"")); + Assert.assertTrue(body, body.contains("\"destination\":\"names\"")); + Assert.assertFalse(body, body.contains("configurationId")); + } finally { + server.shutdown(); } } @Test - public void testReidentifyTextApiClientException() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - when(mockStringsClient.reidentifyString(any(), any())) - .thenThrow(new ApiClientException("Network error executing HTTP request")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("some text").build(); - + public void reidentifyStringRoundTrip() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertTrue(e.getCause() instanceof ApiClientException); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"processedText\":\"My name is J**n D*e.\",\"metrics\":{\"wordCount\":5}}")); + + ReidentifyStringResponse response = controllerFor(server).reidentifyString(ReidentifyStringRequest.builder() + .text("My name is [NAME_1].") + .redactionLevel(Collections.singletonList( + RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask").build())) + .build()); + + Assert.assertEquals("My name is J**n D*e.", response.getProcessedText()); + Assert.assertEquals(Integer.valueOf(5), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/reidentify/string"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"My name is [NAME_1].\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"tokenGroupName\":\"names\"")); + Assert.assertTrue(body, body.contains("\"redactionPattern\":\"mask\"")); + } finally { + server.shutdown(); } } - // ─── getDetectRun — validation ──────────────────────────────────────────── - @Test - public void testNullRunIdInGetDetectRunRequest() { + public void getRunRoundTripQueriesByIdScopedToVault() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - GetDetectRunRequest request = GetDetectRunRequest.builder().runId(null).build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\"," + + "\"output\":[{\"processedFile\":\"UERG\",\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"pdf\"}]," + + "\"metrics\":{\"pages\":3}}")); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"status\":\"FAILED\",\"message\":\"unsupported file\"}")); + + DetectController controller = controllerFor(server); + GetRunResponse done = controller.getRun(GetRunRequest.builder().runId(" run-42 ").build()); + Assert.assertEquals("run-42", done.getRunId()); + Assert.assertEquals(DetectRunStatus.SUCCESS, done.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, done.getOutputType()); + Assert.assertEquals("UERG", done.getOutput().get(0).getProcessedFile()); + Assert.assertEquals("REDACTED_FILE", done.getOutput().get(0).getProcessedFileType()); + Assert.assertEquals(FileDataFormat.PDF, done.getOutput().get(0).getProcessedFileExtension()); + Assert.assertEquals(Integer.valueOf(3), done.getMetrics().getPages()); + Assert.assertNull(done.getMessage()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "GET", "/v2/detect/runs/run-42?vaultId=vault-1"); + Assert.assertEquals(0L, recorded.getBodySize()); + + GetRunResponse failed = controller.getRun(GetRunRequest.builder().runId("run-43").build()); + Assert.assertEquals(DetectRunStatus.FAILED, failed.getStatus()); + Assert.assertEquals("unsupported file", failed.getMessage()); + Assert.assertTrue(failed.getOutput().isEmpty()); + Assert.assertNull(failed.getOutputType()); + Assert.assertEquals("/v2/detect/runs/run-43?vaultId=vault-1", server.takeRequest().getPath()); + } finally { + server.shutdown(); } } @Test - public void testEmptyRunIdInGetDetectRunRequest() { + public void checkGuardrailsRoundTrip() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("").build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"text\":\"tell me about politics\",\"validation\":\"FAILED\",\"toxic\":false,\"deniedTopic\":true}")); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"text\":\"hello\",\"validation\":\"PASSED\"}")); + + DetectController controller = controllerFor(server); + CheckGuardrailsResponse blocked = controller.checkGuardrails(CheckGuardrailsRequest.builder() + .text("tell me about politics").checkToxicity(true).denyTopics(Arrays.asList("politics", "religion")).build()); + Assert.assertEquals("tell me about politics", blocked.getText()); + Assert.assertEquals(GuardrailsValidation.FAILED, blocked.getValidation()); + Assert.assertEquals(Boolean.FALSE, blocked.getToxic()); + Assert.assertEquals(Boolean.TRUE, blocked.getDeniedTopic()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/guardrails"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"tell me about politics\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"checkToxicity\":true")); + Assert.assertTrue(body, body.contains("\"denyTopics\":[\"politics\",\"religion\"]")); + + CheckGuardrailsResponse passed = controller.checkGuardrails(CheckGuardrailsRequest.builder().text("hello").build()); + Assert.assertEquals(GuardrailsValidation.PASSED, passed.getValidation()); + Assert.assertNull(passed.getToxic()); + Assert.assertNull(passed.getDeniedTopic()); + String minimal = server.takeRequest().getBody().readUtf8(); + Assert.assertFalse(minimal, minimal.contains("checkToxicity")); + Assert.assertFalse(minimal, minimal.contains("denyTopics")); + } finally { + server.shutdown(); } } - // ─── getDetectRun — happy path (no output list) ─────────────────────────── - @Test - public void testGetDetectRunHappyPathNoOutput() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - DetectRunsResponse fakeRunsResponse = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(10.5f) - .duration(1.2f) - .build(); - - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenReturn(fakeRunsResponse); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-123").build(); - + public void apiErrorsOnInheritedMethodsMapToSkyflowException() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - DeidentifyFileResponse response = controller.getDetectRun(request); - Assert.assertNotNull(response); - Assert.assertEquals("run-123", response.getRunId()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(404).setHeader("x-request-id", "req-404") + .setBody("{\"error\":{\"grpc_code\":5,\"http_code\":404,\"message\":\"run not found\",\"http_status\":\"Not Found\",\"details\":[]}}")); + try { + controllerFor(server).getRun(GetRunRequest.builder().runId("missing").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(404, e.getHttpCode()); + Assert.assertEquals("run not found", e.getMessage()); + Assert.assertEquals("req-404", e.getRequestId()); + Assert.assertEquals(Integer.valueOf(5), e.getGrpcCode()); + } + } finally { + server.shutdown(); } } - // ─── getDetectRun — API error path ──────────────────────────────────────── - - @Test - public void testGetDetectRunApiError() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - int expectedStatusCode = 404; - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenThrow(new ApiClientApiException("Not Found", expectedStatusCode, "run not found")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-999").build(); - - try { - controller.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + // ─── reidentifyFile (shared, inherited from BaseDetectController) ───────── + + @Test + public void reidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + ReidentifyFileRequest[] bad = { + null, + ReidentifyFileRequest.builder().value("Zm9v").build(), + ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value(" ").build(), + }; + BaseErrorMessage[] expected = { + BaseErrorMessage.ReidentifyFileRequestNull, + BaseErrorMessage.InvalidDataSourceInReidentifyFile, + BaseErrorMessage.InvalidValueInReidentifyFile, + }; + for (int i = 0; i < bad.length; i++) { + try { + controller.reidentifyFile(bad[i]); + Assert.fail("expected SkyflowException for case " + i); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(expected[i].getMessage(), e.getMessage()); + } } } @Test - public void testGetDetectRunApiClientException() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenThrow(new ApiClientException("Network error executing HTTP request")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-abc").build(); - + public void reidentifyFileMissingCredentialsSurfaceWithoutNetworkCall() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), emptyCredentials()); try { - controller.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); + controller.reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertTrue(e.getCause() instanceof ApiClientException); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); } } @Test - public void testDeidentifyFilePollingApiClientException() throws Exception { - // Covers pollForResults' own catch(ApiClientException) — the network-error path hit while - // polling getRun, as opposed to the request-time ApiClientApiException covered elsewhere - // (see the sibling ApiClientApiException test above). deidentifyFile's own - // catch (Exception ex) around the pollForResults() call re-wraps whatever it throws into a - // fixed PollingForResultsFailed SkyflowException, so that — not the original cause — is - // what actually surfaces here; pollForResults' catch(ApiClientException) still executes - // (and is covered) on the way there. - File tmpFile = File.createTempFile("test-detect", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content for txt".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-123").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenThrow(new ApiClientException("Network error executing HTTP request")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .build(); - + public void reidentifyFileSendsScopedRequestAndMapsResponse() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.PollingForResultsFailed.getMessage(), e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(200).setHeader("Content-Type", "application/json") + .setBody("{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\"," + + "\"output\":[{\"processedFile\":\"SGVsbG8=\",\"processedFileType\":\"REIDENTIFIED_FILE\"," + + "\"processedFileExtension\":\"txt\"}]," + + "\"metrics\":{\"size\":0.5,\"wordCount\":3,\"characterCount\":12}}")); + + ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64) + .value("W05BTUVfMV0=") + .dataFormat(FileDataFormat.TXT) + .redactionLevel(Arrays.asList( + RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask").build())) + .build()); + + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(1, response.getOutput().size()); + Assert.assertEquals("SGVsbG8=", response.getOutput().get(0).getProcessedFile()); + Assert.assertEquals("REIDENTIFIED_FILE", response.getOutput().get(0).getProcessedFileType()); + Assert.assertEquals(FileDataFormat.TXT, response.getOutput().get(0).getProcessedFileExtension()); + Assert.assertEquals(Integer.valueOf(3), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + Assert.assertEquals("POST", recorded.getMethod()); + Assert.assertEquals("/v2/detect/reidentify/file", recorded.getPath()); + Assert.assertEquals("Bearer sky-abcde-0123456789abcdef0123456789abcdef", recorded.getHeader("Authorization")); + Assert.assertNotNull(recorded.getHeader("sky-metadata")); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"dataSource\":\"BASE64\"")); + Assert.assertTrue(body, body.contains("\"value\":\"W05BTUVfMV0=\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"dataFormat\":\"txt\"")); + Assert.assertTrue(body, body.contains("\"tokenGroupName\":\"names\"")); + Assert.assertTrue(body, body.contains("\"redactionPattern\":\"mask\"")); + } finally { + server.shutdown(); } } - // ─── helpers ───────────────────────────────────────────────────────────── - - private static DetectRunsResponse buildSuccessDetectRunsResponse() { - return DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(1.0f) - .duration(0.5f) - .build(); - } - - private DeidentifyFileResponse runDeidentifyFileForExtension( - String extension, FilesClient mockFilesClient) throws Exception { - return runDeidentifyFileForExtension(extension, mockFilesClient, null); - } - - private DeidentifyFileResponse runDeidentifyFileForExtension( - String extension, FilesClient mockFilesClient, TokenFormat tokenFormat) throws Exception { - File tmpFile = File.createTempFile("test-detect", "." + extension); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), ("content for " + extension).getBytes()); - - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest.DeidentifyFileRequestBuilder builder = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()); - if (tokenFormat != null) { - builder.tokenFormat(tokenFormat); - } - return controller.deidentifyFile(builder.build()); - } - @Test - public void testGetDetectRunApiError500() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - int expectedStatusCode = 500; - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenThrow(new ApiClientApiException("Internal Server Error", expectedStatusCode, "internal error body")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-abc").build(); - + public void reidentifyFileToleratesSparseAndUnknownResponseValues() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"SOMETHING_NEW\"}")); + ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").build()); + Assert.assertEquals(DetectRunStatus.UNKNOWN, response.getStatus()); + Assert.assertNull(response.getOutputType()); + Assert.assertTrue(response.getOutput().isEmpty()); + Assert.assertNull(response.getMetrics()); + String body = server.takeRequest().getBody().readUtf8(); + Assert.assertFalse(body, body.contains("dataFormat")); + Assert.assertFalse(body, body.contains("redactionLevel")); + } finally { + server.shutdown(); } } - // ─── deidentifyFile — validation ────────────────────────────────────────── - @Test - public void testDeidentifyFile_nullRequest() { + public void reidentifyFileMapsApiErrors() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).deidentifyFile(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyRequestBody.getMessage(), e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(400).setHeader("x-request-id", "req-9") + .setBody("{\"error\":{\"grpc_code\":3,\"http_code\":400,\"message\":\"unsupported format\"," + + "\"http_status\":\"Bad Request\",\"details\":[]}}")); + try { + controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.PRESIGNED_URL).value("https://example.com/f").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(400, e.getHttpCode()); + Assert.assertEquals("unsupported format", e.getMessage()); + Assert.assertEquals("req-9", e.getRequestId()); + Assert.assertEquals(Integer.valueOf(3), e.getGrpcCode()); + } + } finally { + server.shutdown(); } } + // ─── deidentifyFile (shared, inherited from BaseDetectController) ───────── + @Test - public void testDeidentifyFile_noFileOrPathProvided() { + public void deidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); try { - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().build()) - .build(); - skyflowClient.detect(vaultID).deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); + controller.deidentifyFile(DeidentifyFileRequest.builder().value("Zm9v").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage(), e.getMessage()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidDataSourceInDeidentifyFile.getMessage(), e.getMessage()); } } - // ─── deidentifyFile — happy path ────────────────────────────────────────── - - @Test - public void testDeidentifyFile_successWithTxtFileObject() throws Exception { - File tmpFile = File.createTempFile("test-detect", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "hello world".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-txt-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()).build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } - - @Test - public void testDeidentifyFile_successWithFilePath() throws Exception { - File tmpFile = File.createTempFile("test-detect-path", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-path-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().filePath(tmpFile.getAbsolutePath()).build()).build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } - - @Test - public void testDeidentifyFile_successWithOutputFile() throws Exception { - File tmpFile = File.createTempFile("test-detect-out", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - String b64 = Base64.getEncoder().encodeToString("processed content".getBytes()); - DeidentifiedFileOutput outputItem = DeidentifiedFileOutput.builder() - .processedFile(b64) - .processedFileExtension(DeidentifiedFileOutputProcessedFileExtension.TXT) - .build(); - DetectRunsResponse successWithOutput = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(1.0f).duration(0.5f) - .output(Collections.singletonList(outputItem)) - .build(); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-out-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(successWithOutput); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .outputDirectory(System.getProperty("java.io.tmpdir")) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } - - // ─── deidentifyFile — IN_PROGRESS timeout ───────────────────────────────── - - @Test - public void testDeidentifyFile_inProgressTimeout() throws Exception { - File tmpFile = File.createTempFile("test-detect-prog", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-prog-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(DetectRunsResponse.builder().status(DetectRunsResponseStatus.IN_PROGRESS).build()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .waitTime(1) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - Assert.assertEquals("IN_PROGRESS", response.getStatus()); - } - - // ─── deidentifyFile — error paths ───────────────────────────────────────── - @Test - public void testDeidentifyFile_nonExistentFilePath() { + public void deidentifyFileSubmitOnlyReturnsRunIdWithoutPolling() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - DetectController controller = createDetectControllerWithMock(Mockito.mock(ApiClient.class)); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().filePath("/nonexistent/path/file.txt").build()) - .build(); - controller.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertNotNull(e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-42\"}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").dataFormat(FileDataFormat.PDF) + .configurationId("cfg-1").build()); + + Assert.assertEquals("run-42", response.getRunId()); + Assert.assertNull(response.getStatus()); + Assert.assertTrue(response.getOutput().isEmpty()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/deidentify/file"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"dataSource\":\"SKYFLOW_ID\"")); + Assert.assertTrue(body, body.contains("\"value\":\"rec-1\"")); + Assert.assertTrue(body, body.contains("\"dataFormat\":\"pdf\"")); + Assert.assertTrue(body, body.contains("\"configurationId\":\"cfg-1\"")); + Assert.assertEquals("only the submit call was made", 1, server.getRequestCount()); + } finally { + server.shutdown(); } } @Test - public void testDeidentifyFile_processFileApiError() throws Exception { - File tmpFile = File.createTempFile("test-detect-err", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())) - .thenThrow(new ApiClientApiException("forbidden", 403, "access denied")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()).build(); + public void deidentifyFilePollsToSuccessAndWritesOutputsForLocalFile() throws Exception { + File input = folder.newFile("invoice.txt"); + Files.write(input.toPath(), "Pay John Doe".getBytes("UTF-8")); + File outDir = folder.newFolder("out"); + String redacted = Base64.getEncoder().encodeToString("Pay [NAME_1]".getBytes("UTF-8")); + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(403, e.getHttpCode()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-7\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"QUEUED\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\"," + + "\"output\":[{\"processedFile\":\"" + redacted + "\",\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"txt\"}," + + "{\"processedFile\":\"W10=\",\"processedFileType\":\"ENTITIES\",\"processedFileExtension\":\"json\"}]," + + "\"metrics\":{\"wordCount\":3}}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .file(input).configurationId("cfg-1") + .pollOptions(PollOptions.builder().waitTime(1).build()) // one real 1 s sleep at most + .outputDirectory(outDir.getPath()) + .build()); + + Assert.assertEquals("run-7", response.getRunId()); + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(2, response.getOutput().size()); + Assert.assertEquals(Integer.valueOf(3), response.getMetrics().getWordCount()); + Assert.assertEquals("Pay [NAME_1]", new String(Files.readAllBytes(new File(outDir, "processed-invoice.txt").toPath()), "UTF-8")); + Assert.assertEquals("[]", new String(Files.readAllBytes(new File(outDir, "processed-entities-invoice.json").toPath()), "UTF-8")); + + RecordedRequest submit = server.takeRequest(); + assertCommonHeaders(submit, "POST", "/v2/detect/deidentify/file"); + String body = submit.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"dataSource\":\"BASE64\"")); + Assert.assertTrue(body, body.contains("\"value\":\"" + Base64.getEncoder().encodeToString("Pay John Doe".getBytes("UTF-8")) + "\"")); + Assert.assertTrue(body, body.contains("\"dataFormat\":\"txt\"")); + Assert.assertEquals("/v2/detect/runs/run-7?vaultId=vault-1", server.takeRequest().getPath()); + Assert.assertEquals("/v2/detect/runs/run-7?vaultId=vault-1", server.takeRequest().getPath()); + } finally { + server.shutdown(); } } @Test - public void testDeidentifyFile_pollForResultsApiError() throws Exception { - File tmpFile = File.createTempFile("test-detect-poll", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-poll-err").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenThrow(new ApiClientApiException("unavailable", 503, "service unavailable")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()).build(); - + public void deidentifyFileReturnsRunIdWithStatusWhenBudgetRunsOut() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.PollingForResultsFailed.getMessage(), e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-8\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"IN_PROGRESS\"}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v") + .pollOptions(PollOptions.builder().maxAttempts(1).build()).build()); + + Assert.assertEquals("run-8", response.getRunId()); + Assert.assertEquals(DetectRunStatus.IN_PROGRESS, response.getStatus()); + Assert.assertTrue(response.getOutput().isEmpty()); + Assert.assertEquals(2, server.getRequestCount()); + } finally { + server.shutdown(); } } - // ─── processFileByType — all extensions ─────────────────────────────────── - - @Test - public void testDeidentifyFile_pdfExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyPdf(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-pdf").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("pdf", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_mp3Extension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyAudio(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-mp3").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("mp3", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_jpgExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyImage(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-jpg").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("jpg", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_pptExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyPresentation(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-ppt").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("ppt", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_csvExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifySpreadsheet(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-csv").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("csv", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_docExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyDocument(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-doc").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("doc", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_jsonExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyStructuredText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-json").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("json", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_defaultExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyFile(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-dcm").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("dcm", mockFilesClient)); - } - - // ─── parseDeidentifyFileResponse — wordCharacterCount branch L272-273 ───── - @Test - public void testGetDetectRun_withWordCharacterCount() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - DeidentifiedFileOutput outputItem = DeidentifiedFileOutput.builder().build(); - WordCharacterCount wordCharCount = WordCharacterCount.builder() - .wordCount(10) - .characterCount(55) - .build(); - - DetectRunsResponse fakeRunsResponse = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(5.0f) - .duration(0.5f) - .output(Collections.singletonList(outputItem)) - .wordCharacterCount(wordCharCount) - .build(); - - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenReturn(fakeRunsResponse); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-wc-001").build(); - + public void deidentifyFileSurfacesFailedRunMessage() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - DeidentifyFileResponse response = controller.getDetectRun(request); - Assert.assertNotNull(response); - Assert.assertEquals(10, (int) response.getWordCount()); - Assert.assertEquals(55, (int) response.getCharCount()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); - } - } - - // ─── deidentifyFile — processedFile present, no outputDirectory (lines 146, 168) ─── - - @Test - public void testDeidentifyFile_successWithProcessedFileNoOutputDir() throws Exception { - File tmpFile = File.createTempFile("test-detect-nodir", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - String b64 = Base64.getEncoder().encodeToString("processed content".getBytes()); - DeidentifiedFileOutput outputItem = DeidentifiedFileOutput.builder() - .processedFile(b64) - .processedFileExtension(DeidentifiedFileOutputProcessedFileExtension.TXT) - .build(); - DetectRunsResponse successWithOutput = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(1.0f).duration(0.5f) - .output(Collections.singletonList(outputItem)) - .build(); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-nodir-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(successWithOutput); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - // no outputDirectory → file written via new File(outputFileName) (line 146) - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } - - // ─── pollForResults — IN_PROGRESS retry then SUCCESS (lines 218-229) ───────── - - @Test - public void testDeidentifyFile_inProgressThenSuccess() throws Exception { - File tmpFile = File.createTempFile("test-detect-retry", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-retry-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(DetectRunsResponse.builder().status(DetectRunsResponseStatus.IN_PROGRESS).build()) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - // waitTime=2: first poll IN_PROGRESS → sleeps 1s → second poll SUCCESS - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .waitTime(2) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - Assert.assertFalse("IN_PROGRESS".equals(response.getStatus())); - } - - // ─── pollForResults — IN_PROGRESS retry (else branch, lines 225-226) ──────── - - @Test - public void testDeidentifyFile_inProgressElseBranchThenSuccess() throws Exception { - File tmpFile = File.createTempFile("test-detect-else", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-else-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(DetectRunsResponse.builder().status(DetectRunsResponseStatus.IN_PROGRESS).build()) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - // waitTime=3: currentWaitTime=1, nextWaitTime=2 < 3 → else branch (L225-226), sleep 2s - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .waitTime(3) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-9\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"FAILED\",\"message\":\"unsupported file\"}")); - // ─── parseDeidentifyFileResponse — processedFile present branch L283-291 ── + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v").pollOptions(PollOptions.builder().build()).build()); - @Test - public void testGetDetectRun_withProcessedFile() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - String base64Content = Base64.getEncoder().encodeToString("test file content".getBytes()); - DeidentifiedFileOutput outputItem = DeidentifiedFileOutput.builder() - .processedFile(base64Content) - .processedFileExtension(DeidentifiedFileOutputProcessedFileExtension.TXT) - .build(); - - DetectRunsResponse fakeRunsResponse = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(1.0f) - .duration(0.1f) - .output(Collections.singletonList(outputItem)) - .build(); - - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenReturn(fakeRunsResponse); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-file-001").build(); - - try { - DeidentifyFileResponse response = controller.getDetectRun(request); - Assert.assertNotNull(response); - Assert.assertEquals("run-file-001", response.getRunId()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); + Assert.assertEquals(DetectRunStatus.FAILED, response.getStatus()); + Assert.assertEquals("unsupported file", response.getMessage()); + Assert.assertEquals(2, server.getRequestCount()); + } finally { + server.shutdown(); } } - // ─── entityUniqueCounter branches in VaultClient request builders ───────── - - private static TokenFormat buildEntityUniqueCounterTokenFormat() { - return TokenFormat.builder() - .entityUniqueCounter(java.util.Collections.singletonList(DetectEntities.EMAIL_ADDRESS)) - .build(); - } - - @Test - public void testDeidentifyFile_txt_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-txt").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("txt", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_mp3_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyAudio(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-mp3").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("mp3", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_pdf_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyPdf(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-pdf").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("pdf", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_jpg_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyImage(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-jpg").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("jpg", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_csv_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifySpreadsheet(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-csv").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("csv", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_dcm_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyFile(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-dcm").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("dcm", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - // --- unsupported file extension must throw SkyflowException, not IllegalArgumentException --- - @Test - public void testDeidentifyFile_unsupportedExtensionThrowsSkyflowException() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); + public void deidentifyFileSubmitErrorMapsToSkyflowException() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - runDeidentifyFileForExtension("xyz", mockFilesClient); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertNotNull(e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(400).setHeader("x-request-id", "req-1") + .setBody("{\"error\":{\"grpc_code\":3,\"http_code\":400,\"message\":\"configuration not found\",\"http_status\":\"Bad Request\",\"details\":[]}}")); + try { + controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v").configurationId("missing").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(400, e.getHttpCode()); + Assert.assertEquals("configuration not found", e.getMessage()); + Assert.assertEquals("req-1", e.getRequestId()); + } + } finally { + server.shutdown(); } } - - // --- getEntities — output present but empty list must return empty list, not throw --- - - @Test - public void testGetEntities_emptyOutputListReturnsEmptyList() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .output(Collections.emptyList()) - .build(); - - java.lang.reflect.Method method = DetectController.class.getDeclaredMethod("getEntities", DetectRunsResponse.class); - method.setAccessible(true); - java.util.List result = (java.util.List) method.invoke(null, response); - - Assert.assertNotNull(result); - Assert.assertTrue("entities should be empty when output list is empty", result.isEmpty()); - } - - // --- parseDeidentifyFileResponse — FAILED run with absent optional fields must not throw --- - - @Test - public void testParseDeidentifyFileResponse_failedRunWithAbsentFieldsDoesNotThrow() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.FAILED) - .build(); - - java.lang.reflect.Method method = DetectController.class.getDeclaredMethod( - "parseDeidentifyFileResponse", DetectRunsResponse.class, String.class, String.class); - method.setAccessible(true); - DeidentifyFileResponse result = (DeidentifyFileResponse) method.invoke( - null, response, "run-failed-001", DetectRunsResponseStatus.FAILED.toString()); - - Assert.assertNotNull(result); - Assert.assertEquals("run-failed-001", result.getRunId()); - } - - // --- getBaseFileName — filename with no extension must not throw StringIndexOutOfBoundsException --- - - @Test - public void testGetBaseFileName_withExtensionStripsIt() throws Exception { - java.lang.reflect.Method method = DetectController.class.getDeclaredMethod("getBaseFileName", String.class); - method.setAccessible(true); - DetectController controller = createDetectControllerWithMock(Mockito.mock(ApiClient.class)); - String result = (String) method.invoke(controller, "photo.png"); - Assert.assertEquals("photo", result); - } - - @Test - public void testGetBaseFileName_withoutExtensionReturnsWholeName() throws Exception { - java.lang.reflect.Method method = DetectController.class.getDeclaredMethod("getBaseFileName", String.class); - method.setAccessible(true); - DetectController controller = createDetectControllerWithMock(Mockito.mock(ApiClient.class)); - String result = (String) method.invoke(controller, "noextension"); - Assert.assertEquals("noextension", result); - } - - // --- pollForResults — one poll response with absent status must not throw; loop continues --- - - @Test - public void testDeidentifyFile_pollAbsentStatusThenSuccess() throws Exception { - File tmpFile = File.createTempFile("test-detect-absentstatus", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-absent-status").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(DetectRunsResponse.builder().build()) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } } diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java b/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java deleted file mode 100644 index 99442682..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.DetectOutputTranscriptions; -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.validations.Validations; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.util.Arrays; -import java.util.Collections; - -public class DeidentifyFileRequestTest { - - @Test - public void testBuilderAndGetters() { - File file = new File("test.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DetectEntities entity = DetectEntities.DOB; - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; - DetectOutputTranscriptions transcription = DetectOutputTranscriptions.TRANSCRIPTION; - String outputDir = "/tmp/output"; - int waitTime = 42; - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Arrays.asList(entity)) - .allowRegexList(Arrays.asList("a.*")) - .restrictRegexList(Arrays.asList("b.*")) - .maskingMethod(maskingMethod) - .outputProcessedImage(true) - .outputOcrText(true) - .outputProcessedAudio(true) - .outputTranscription(transcription) - .outputDirectory(outputDir) - .waitTime(waitTime) - .build(); - - Assert.assertEquals(entity, request.getEntities().get(0)); - Assert.assertEquals("a.*", request.getAllowRegexList().get(0)); - Assert.assertEquals("b.*", request.getRestrictRegexList().get(0)); - Assert.assertEquals(maskingMethod, request.getMaskingMethod()); - Assert.assertTrue(request.getOutputProcessedImage()); - Assert.assertTrue(request.getOutputOcrText()); - Assert.assertTrue(request.getOutputProcessedAudio()); - Assert.assertEquals(transcription, request.getOutputTranscription()); - Assert.assertEquals(outputDir, request.getOutputDirectory()); - Assert.assertEquals(Integer.valueOf(waitTime), request.getWaitTime()); - } - - @Test - public void testBuilderDefaults() { - DeidentifyFileRequest request = DeidentifyFileRequest.builder().build(); - Assert.assertFalse(request.getOutputProcessedImage()); - Assert.assertFalse(request.getOutputOcrText()); - Assert.assertFalse(request.getOutputProcessedAudio()); - Assert.assertNull(request.getOutputDirectory()); - Assert.assertNull(request.getWaitTime()); - } - - @Test - public void testBuilderWithFilePath() { - String filePath = "/tmp/test.txt"; - FileInput fileInput = FileInput.builder().filePath(filePath).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Collections.singletonList(DetectEntities.DOB)) - .build(); - - Assert.assertEquals(filePath, request.getFileInput().getFilePath()); - Assert.assertNull(request.getFileInput().getFile()); - } - - @Test - public void testBuilderWithFileAndFilePath() { - File file = new File("test.txt"); - String filePath = "/tmp/test.txt"; - FileInput fileInput = FileInput.builder().file(file).filePath(filePath).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Collections.singletonList(DetectEntities.DOB)) - .build(); - - Assert.assertEquals(file, request.getFileInput().getFile()); - Assert.assertEquals(filePath, request.getFileInput().getFilePath()); - } - - @Test - public void testBuilderWithNullFileAndFilePath() { - FileInput fileInput = FileInput.builder().build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Collections.singletonList(DetectEntities.DOB)) - .build(); - - Assert.assertNull(request.getFileInput().getFile()); - Assert.assertNull(request.getFileInput().getFilePath()); - } - - @Test - public void testValidateDeidentifyFileRequestWithNullFileInputThrowsSkyflowException() { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .entities(Collections.singletonList(DetectEntities.DOB)) - .build(); - try { - Validations.validateDeidentifyFileRequest(request); - Assert.fail("Should have thrown an exception"); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage(), e.getMessage()); - } - } - - @Test - public void testBuilderNullBooleansFallToFalse() { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .outputProcessedImage(null) - .outputOcrText(null) - .outputProcessedAudio(null) - .build(); - Assert.assertFalse(request.getOutputProcessedImage()); - Assert.assertFalse(request.getOutputOcrText()); - Assert.assertFalse(request.getOutputProcessedAudio()); - } - - @Test - public void testBuilderWithTokenFormatTransformationsPixelDensityMaxResolutionBleep() { - TokenFormat tf = TokenFormat.builder().build(); - Transformations tr = new Transformations(null); - AudioBleep bleep = AudioBleep.builder().frequency(800.0).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .tokenFormat(tf) - .transformations(tr) - .pixelDensity(150) - .maxResolution(1920) - .bleep(bleep) - .build(); - - Assert.assertEquals(tf, request.getTokenFormat()); - Assert.assertEquals(tr, request.getTransformations()); - Assert.assertEquals(150, request.getPixelDensity().intValue()); - Assert.assertEquals(1920, request.getMaxResolution().intValue()); - Assert.assertEquals(bleep, request.getBleep()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java b/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java deleted file mode 100644 index d3946719..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileExtension; -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileType; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.util.Collections; - -public class DeidentifyFileResponseTest { - - @Test - public void testAllGettersAndToString() { - File fileObject = new File("test-path.txt"); - String file = "test-path.txt"; - String type = "pdf"; - String extension = ".pdf"; - Integer wordCount = 100; - Integer charCount = 500; - Float sizeInKb = 123.45F; - Float durationInSeconds = 12.3F; - Integer pageCount = 5; - Integer slideCount = 0; - FileEntityInfo entityInfo = new FileEntityInfo("PERSON", DeidentifiedFileOutputProcessedFileType.ENTITIES, DeidentifiedFileOutputProcessedFileExtension.PDF); - java.util.List entities = Collections.singletonList(entityInfo); - String runId = "run-123"; - String status = "SUCCESS"; - FileInfo fileInfo = new FileInfo(fileObject); - - DeidentifyFileResponse response = new DeidentifyFileResponse( - fileInfo, file, type, extension, wordCount, charCount, sizeInKb, - durationInSeconds, pageCount, slideCount, entities, runId, status - ); - - Assert.assertEquals(type, response.getType()); - Assert.assertEquals(extension, response.getExtension()); - Assert.assertEquals(wordCount, response.getWordCount()); - Assert.assertEquals(charCount, response.getCharCount()); - Assert.assertEquals(sizeInKb, response.getSizeInKb()); - Assert.assertEquals(durationInSeconds, response.getDurationInSeconds()); - Assert.assertEquals(pageCount, response.getPageCount()); - Assert.assertEquals(slideCount, response.getSlideCount()); - Assert.assertEquals(entities, response.getEntities()); - Assert.assertEquals(runId, response.getRunId()); - Assert.assertEquals(status, response.getStatus()); - - // toString should return a JSON string containing all fields - String json = response.toString(); - Assert.assertTrue(json.contains(file)); - Assert.assertTrue(json.contains(type)); - Assert.assertTrue(json.contains(extension)); - Assert.assertTrue(json.contains(runId)); - Assert.assertTrue(json.contains(status)); - Assert.assertTrue(json.contains("PERSON")); - Assert.assertEquals(fileInfo, response.getFile()); - Assert.assertEquals(file, response.getFileBase64()); - } - - @Test - public void testShortConstructorAndGetters() { - DeidentifyFileResponse response = new DeidentifyFileResponse("run-456", "PENDING"); - Assert.assertEquals("run-456", response.getRunId()); - Assert.assertEquals("PENDING", response.getStatus()); - Assert.assertNull(response.getFile()); - Assert.assertNull(response.getFileBase64()); - Assert.assertNull(response.getWordCount()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java b/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java deleted file mode 100644 index 193a898e..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java +++ /dev/null @@ -1,299 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.validations.Validations; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - -import static com.skyflow.errors.ErrorMessage.InvalidTextInDeIdentify; - -public class DeidentifyTextTests { - - private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; - private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; - - private static final String text = "Sensitive data to deidentify"; - private static final List detectEntities = new ArrayList<>(); - private static final List allowRegexList = new ArrayList<>(); - private static final List restrictRegexList = new ArrayList<>(); - private static final TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(detectEntities) - .entityUniqueCounter(detectEntities) - .entityOnly(detectEntities) - .build(); - - private static Transformations transformations = null; - - - @BeforeClass - public static void setup() { - detectEntities.add(DetectEntities.NAME); - detectEntities.add(DetectEntities.DOB); - - allowRegexList.add("^[A-Za-z]+$"); - restrictRegexList.add("([0-9]{3}-[0-9]{2}-[0-9]{4})"); - - transformations = new Transformations( - new DateTransformation(20, 5, detectEntities) - ); - } - - - @Test - public void testValidInputInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(detectEntities) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); - - Validations.validateDeidentifyTextRequest(request); - Assert.assertEquals(detectEntities, request.getEntities()); - Assert.assertEquals(allowRegexList, request.getAllowRegexList()); - Assert.assertEquals(restrictRegexList, request.getRestrictRegexList()); - Assert.assertEquals(tokenFormat, request.getTokenFormat()); - Assert.assertEquals(transformations, request.getTransformations()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - - @Test - public void testNullRequestInDeidentifyTextRequestValidations() { - try { - Validations.validateDeidentifyTextRequest(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.DeidentifyTextRequestNull.getMessage(), e.getMessage()); - } - } - - @Test - public void testNullTextInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text(null).build(); - Validations.validateDeidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(InvalidTextInDeIdentify.getMessage(), e.getMessage()); - } - } - - @Test - public void testEmptyTextInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("").build(); - Validations.validateDeidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(InvalidTextInDeIdentify.getMessage(), e.getMessage()); - } - } - - @Test - public void testEmptyEntitiesInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(new ArrayList<>()) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertTrue(request.getEntities().isEmpty()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - - @Test - public void testNoEntitiesInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("").build(); - Validations.validateDeidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - - @Test - public void testEmptyAllowRegexListInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .allowRegexList(new ArrayList<>()) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertTrue(request.getAllowRegexList().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testEmptyRestrictRegexListInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .restrictRegexList(new ArrayList<>()) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertTrue(request.getRestrictRegexList().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - - @Test - public void testNullTokenFormatInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(detectEntities) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(null) - .build(); - Validations.validateDeidentifyTextRequest(request); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testNoTransformationsInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(detectEntities) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertNull(request.getTransformations()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testNullOrEmptyTransformationsInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(detectEntities) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .transformations(null) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertNull(request.getTransformations()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testDeidentifyResponse() { - try { - List entityInfos = new ArrayList<>(); - int wordCount = 5; - int charCount = 30; - DeidentifyTextResponse response = new DeidentifyTextResponse(text, entityInfos, wordCount, charCount); - Assert.assertEquals(text, response.getProcessedText()); - Assert.assertEquals(wordCount, response.getWordCount()); - Assert.assertEquals(charCount, response.getCharCount()); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testDeidentifyResponseGetEntitiesAndToString() { - TextIndex ti = new TextIndex(0, 4); - TextIndex pi = new TextIndex(5, 9); - java.util.Map scores = new java.util.HashMap<>(); - scores.put("confidence", 0.95); - EntityInfo ei = new EntityInfo("tok1", "John", ti, pi, "NAME", scores); - - List entities = new ArrayList<>(); - entities.add(ei); - - DeidentifyTextResponse response = new DeidentifyTextResponse(text, entities, 1, 10); - Assert.assertEquals(entities, response.getEntities()); - String json = response.toString(); - Assert.assertNotNull(json); - Assert.assertTrue(json.contains(text)); - } - - @Test - public void testTextIndex() { - TextIndex ti = new TextIndex(3, 7); - Assert.assertEquals(3, ti.getStart()); - Assert.assertEquals(7, ti.getEnd()); - String json = ti.toString(); - Assert.assertNotNull(json); - Assert.assertTrue(json.contains("3")); - } - - @Test - public void testEntityInfoGetters() { - TextIndex ti = new TextIndex(0, 4); - TextIndex pi = new TextIndex(5, 9); - java.util.Map scores = new java.util.HashMap<>(); - scores.put("confidence", 0.9); - EntityInfo ei = new EntityInfo("tok1", "Alice", ti, pi, "NAME", scores); - Assert.assertEquals("tok1", ei.getToken()); - Assert.assertEquals("Alice", ei.getValue()); - Assert.assertEquals(ti, ei.getTextIndex()); - Assert.assertEquals(pi, ei.getProcessedIndex()); - Assert.assertEquals("NAME", ei.getEntity()); - Assert.assertEquals(scores, ei.getScores()); - } - - @Test - public void testTokenFormatGetters() { - TokenFormat tf = TokenFormat.builder() - .vaultToken(detectEntities) - .entityUniqueCounter(detectEntities) - .entityOnly(detectEntities) - .build(); - Assert.assertEquals(detectEntities, tf.getVaultToken()); - Assert.assertEquals(detectEntities, tf.getEntityUniqueCounter()); - Assert.assertEquals(detectEntities, tf.getEntityOnly()); - Assert.assertNotNull(tf.getDefault()); - } - - @Test - public void testTokenFormatDefaultTypeNull() { - TokenFormat tf = TokenFormat.builder().defaultType(null).build(); - Assert.assertEquals(com.skyflow.enums.TokenType.ENTITY_UNIQUE_COUNTER, tf.getDefault()); - } - - @Test - public void testTokenFormatDefaultTypeNonNull() { - TokenFormat tf = TokenFormat.builder() - .defaultType(com.skyflow.enums.TokenType.VAULT_TOKEN) - .build(); - Assert.assertEquals(com.skyflow.enums.TokenType.VAULT_TOKEN, tf.getDefault()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java b/skyvault/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java deleted file mode 100644 index d77ddb6f..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileExtension; -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileType; -import org.junit.Assert; -import org.junit.Test; - -public class FileEntityInfoTest { - - @Test - public void testConstructorAndGetters() { - String file = "entity.pdf"; - DeidentifiedFileOutputProcessedFileType type = DeidentifiedFileOutputProcessedFileType.ENTITIES; - String extension = "pdf"; - - FileEntityInfo info = new FileEntityInfo(file, type, DeidentifiedFileOutputProcessedFileExtension.PDF); - - Assert.assertEquals(file, info.getFile()); - Assert.assertEquals(type.toString(), info.getType()); - Assert.assertEquals(extension, info.getExtension()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/FileInfoTest.java b/skyvault/src/test/java/com/skyflow/vault/detect/FileInfoTest.java deleted file mode 100644 index 29a81f6a..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/FileInfoTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.skyflow.vault.detect; - -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; - -public class FileInfoTest { - - @Test - public void testFileInfoFields() throws IOException { - // Create a temp file - File tempFile = File.createTempFile("testfileinfo", ".txt"); - tempFile.deleteOnExit(); - - // Write some content to ensure size > 0 - FileWriter writer = new FileWriter(tempFile); - writer.write("Hello Skyflow!"); - writer.close(); - - FileInfo fileInfo = new FileInfo(tempFile); - - Assert.assertEquals(tempFile.getName(), fileInfo.getName()); - Assert.assertEquals(tempFile.length(), fileInfo.getSize()); - Assert.assertEquals("", fileInfo.getType()); - Assert.assertEquals(tempFile.lastModified(), fileInfo.getLastModified()); - } - - @Test - public void testFileInfoWithNonExistentFile() { - File fakeFile = new File("nonexistentfile.txt"); - FileInfo fileInfo = new FileInfo(fakeFile); - - Assert.assertEquals("nonexistentfile.txt", fileInfo.getName()); - Assert.assertEquals(0, fileInfo.getSize()); - Assert.assertEquals("", fileInfo.getType()); - Assert.assertEquals(0, fileInfo.getLastModified()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java b/skyvault/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java deleted file mode 100644 index 8ed9716a..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.validations.Validations; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - -import static com.skyflow.errors.ErrorMessage.InvalidTextInReIdentify; - -public class ReidentifyTextTests { - - private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; - private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; - - private static final String text = "Sensitive data to reidentify"; - private static final List redactedEntities = new ArrayList<>(); - private static final List maskedEntities = new ArrayList<>(); - private static final List plainTextEntities = new ArrayList<>(); - - @BeforeClass - public static void setup() { - redactedEntities.add(DetectEntities.NAME); - redactedEntities.add(DetectEntities.DOB); - - maskedEntities.add(DetectEntities.USERNAME); - - plainTextEntities.add(DetectEntities.PHONE_NUMBER); - } - - @Test - public void testValidInputInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(text) - .redactedEntities(redactedEntities) - .maskedEntities(maskedEntities) - .plainTextEntities(plainTextEntities) - .build(); - - Validations.validateReidentifyTextRequest(request); - Assert.assertEquals(text, request.getText()); - Assert.assertEquals(redactedEntities, request.getRedactedEntities()); - Assert.assertEquals(maskedEntities, request.getMaskedEntities()); - Assert.assertEquals(plainTextEntities, request.getPlainTextEntities()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testNullRequestInReidentifyTextRequestValidations() { - try { - Validations.validateReidentifyTextRequest(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.ReidentifyTextRequestNull.getMessage(), e.getMessage()); - } - } - - @Test - public void testNoTextInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder().build(); - Validations.validateReidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testNullTextInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(null) - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(InvalidTextInReIdentify.getMessage(), e.getMessage()); - } - } - - @Test - public void testEmptyTextInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text("") - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(InvalidTextInReIdentify.getMessage(), e.getMessage()); - } - } - - - @Test - public void testEmptyRedactedEntitiesInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(text) - .redactedEntities(new ArrayList<>()) - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.assertTrue(request.getRedactedEntities().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - - @Test - public void testEmptyMaskedEntitiesInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(text) - .maskedEntities(new ArrayList<>()) - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.assertTrue(request.getMaskedEntities().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testEmptyPlainTextEntitiesInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(text) - .plainTextEntities(new ArrayList<>()) - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.assertTrue(request.getPlainTextEntities().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - - @Test - public void testReidentifyResponse() { - try { - ReidentifyTextResponse response = new ReidentifyTextResponse(text); - Assert.assertEquals(text, response.getProcessedText()); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testReidentifyResponseToString() { - ReidentifyTextResponse response = new ReidentifyTextResponse(text); - String json = response.toString(); - Assert.assertNotNull(json); - Assert.assertTrue(json.contains(text)); - } -} \ No newline at end of file From b1f2d6062a3445b666d9e73697d3340e99a93428 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 12:21:08 +0530 Subject: [PATCH 10/13] SK-3175 fix ci check --- .../java/com/skyflow/utils/UtilsTests.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/skyvault/src/test/java/com/skyflow/utils/UtilsTests.java b/skyvault/src/test/java/com/skyflow/utils/UtilsTests.java index d1e1c725..7ac13ec7 100644 --- a/skyvault/src/test/java/com/skyflow/utils/UtilsTests.java +++ b/skyvault/src/test/java/com/skyflow/utils/UtilsTests.java @@ -76,8 +76,12 @@ public void testGetMetrics() { @Test public void testGetMetricsWithException() { + // Clearing System Properties explicitly to throw exception. They are restored afterwards: the JDK's + // socket layer reads os.name on first use, and a null value breaks every later test that opens a socket. + String osName = System.getProperty("os.name"); + String osVersion = System.getProperty("os.version"); + String javaVersion = System.getProperty("java.version"); try { - // Clearing System Properties explicitly to throw exception System.clearProperty("os.name"); System.clearProperty("os.version"); System.clearProperty("java.version"); @@ -89,6 +93,18 @@ public void testGetMetricsWithException() { Assert.assertTrue(metrics.get(Constants.SDK_METRIC_CLIENT_OS_DETAILS).getAsString().isEmpty()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); + } finally { + restoreProperty("os.name", osName); + restoreProperty("os.version", osVersion); + restoreProperty("java.version", javaVersion); + } + } + + private static void restoreProperty(String key, String value) { + if (value == null) { + System.clearProperty(key); + } else { + System.setProperty(key, value); } } } From 92b5b16a0d28f04bb005f31abdb003e8f3863de3 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 13:50:33 +0530 Subject: [PATCH 11/13] SK-3175 updated skyvault generated code --- .../com/skyflow/generated/rest/ApiClient.java | 60 +- .../generated/rest/ApiClientBuilder.java | 238 ++- .../generated/rest/AsyncApiClient.java | 61 +- .../generated/rest/AsyncApiClientBuilder.java | 238 ++- .../generated/rest/AsyncRawApiClient.java | 110 ++ .../skyflow/generated/rest/RawApiClient.java | 90 + .../rest/core/ApiClientApiException.java | 7 +- .../rest/core/ApiClientHttpResponse.java | 3 +- .../generated/rest/core/ClientOptions.java | 165 +- .../generated/rest/core/ConsoleLogger.java | 52 + .../rest/core/DateTimeDeserializer.java | 22 +- .../generated/rest/core/DoubleSerializer.java | 43 + .../generated/rest/core/Environment.java | 5 +- .../generated/rest/core/FileStream.java | 5 +- .../skyflow/generated/rest/core/ILogger.java | 38 + .../rest/core/InputStreamRequestBody.java | 14 +- .../generated/rest/core/LogConfig.java | 98 + .../skyflow/generated/rest/core/LogLevel.java | 36 + .../skyflow/generated/rest/core/Logger.java | 97 + .../rest/core/LoggingInterceptor.java | 104 ++ .../rest/core/NullableNonemptyFilter.java | 5 +- .../generated/rest/core/ObjectMappers.java | 11 +- .../rest/core/QueryStringMapper.java | 7 +- .../generated/rest/core/RequestOptions.java | 59 +- .../rest/core/ResponseBodyInputStream.java | 3 +- .../rest/core/ResponseBodyReader.java | 3 +- .../ResponseDecompressionInterceptor.java | 56 + .../generated/rest/core/RetryInterceptor.java | 195 +- .../core/Rfc2822DateTimeDeserializer.java | 25 + .../skyflow/generated/rest/core/SseEvent.java | 114 ++ .../generated/rest/core/SseEventParser.java | 228 +++ .../skyflow/generated/rest/core/Stream.java | 510 +++++- .../generated/rest/core/WrappedAlias.java | 8 + .../rest/errors/BadRequestError.java | 11 +- .../generated/rest/errors/ForbiddenError.java | 33 + .../rest/errors/InternalServerError.java | 2 +- .../generated/rest/errors/NotFoundError.java | 11 +- .../rest/errors/TooManyRequestsError.java | 33 + .../rest/errors/UnauthorizedError.java | 11 +- .../rest/requests/PatchV2VaultsIdRequest.java | 69 + .../resources/audit/AsyncAuditClient.java | 46 - .../resources/audit/AsyncRawAuditClient.java | 284 --- .../rest/resources/audit/AuditClient.java | 44 - .../rest/resources/audit/RawAuditClient.java | 267 --- .../AuditServiceListAuditEventsRequest.java | 1579 ----------------- ...AuditEventsRequestFilterOpsActionType.java | 56 - ...entsRequestFilterOpsContextAccessType.java | 28 - ...ventsRequestFilterOpsContextActorType.java | 26 - ...EventsRequestFilterOpsContextAuthMode.java | 28 - ...ditEventsRequestFilterOpsResourceType.java | 80 - ...eListAuditEventsRequestSortOpsOrderBy.java | 24 - .../binlookup/AsyncBinLookupClient.java | 53 - .../binlookup/AsyncRawBinLookupClient.java | 105 -- .../resources/binlookup/BinLookupClient.java | 50 - .../binlookup/RawBinLookupClient.java | 87 - .../binlookup/requests/V1BinListRequest.java | 180 -- .../resources/files/AsyncFilesClient.java | 185 +- .../resources/files/AsyncRawFilesClient.java | 993 +---------- .../rest/resources/files/FilesClient.java | 175 +- .../rest/resources/files/RawFilesClient.java | 782 +------- ...entifyFileAudioRequestDeidentifyAudio.java | 663 ------- ...fyFileDocumentPdfRequestDeidentifyPdf.java | 479 ----- ...entifyFileImageRequestDeidentifyImage.java | 524 ------ .../files/requests/DeidentifyFileRequest.java | 385 ---- ...identifyFileRequestDeidentifyDocument.java | 387 ---- ...tifyFileRequestDeidentifyPresentation.java | 388 ---- ...ntifyFileRequestDeidentifySpreadsheet.java | 388 ---- ...fyFileRequestDeidentifyStructuredText.java | 389 ---- .../DeidentifyFileRequestDeidentifyText.java | 386 ---- .../files/requests/FileDeleteRequest.java | 191 ++ .../files/requests/FileUploadRequest.java | 191 ++ .../files/requests/GetRunRequest.java | 90 - .../ReidentifyFileRequestReidentifyFile.java | 166 -- .../requests/UploadFileRequestV2.java} | 136 +- ...RequestDeidentifyAudioEntityTypesItem.java | 160 -- ...estDeidentifyAudioOutputTranscription.java | 28 - ...dfRequestDeidentifyPdfEntityTypesItem.java | 160 -- ...RequestDeidentifyImageEntityTypesItem.java | 160 -- ...geRequestDeidentifyImageMaskingMethod.java | 24 - ...uestDeidentifyDocumentEntityTypesItem.java | 160 -- ...DeidentifyPresentationEntityTypesItem.java | 160 -- ...tDeidentifySpreadsheetEntityTypesItem.java | 160 -- ...identifyStructuredTextEntityTypesItem.java | 160 -- ...eRequestDeidentifyTextEntityTypesItem.java | 160 -- .../DeidentifyFileRequestEntityTypesItem.java | 160 -- .../guardrails/AsyncGuardrailsClient.java | 44 - .../guardrails/AsyncRawGuardrailsClient.java | 114 -- .../guardrails/GuardrailsClient.java | 41 - .../guardrails/RawGuardrailsClient.java | 91 - .../requests/DetectGuardrailsRequest.java | 228 --- .../resources/query/AsyncQueryClient.java | 29 +- .../resources/query/AsyncRawQueryClient.java | 109 +- .../rest/resources/query/QueryClient.java | 26 +- .../rest/resources/query/RawQueryClient.java | 94 +- .../query/requests/ExecuteQueryRequest.java | 160 ++ .../query/requests/GetQueryRequest.java | 128 ++ .../QueryServiceExecuteQueryBody.java | 96 - .../records/AsyncRawRecordsClient.java | 967 +++++----- .../resources/records/AsyncRecordsClient.java | 264 +-- .../resources/records/RawRecordsClient.java | 831 ++++----- .../rest/resources/records/RecordsClient.java | 252 +-- .../requests/BatchOperationRequest.java | 153 ++ ...Body.java => BulkDeleteRecordRequest.java} | 48 +- .../records/requests/DeleteRecordRequest.java | 69 + .../records/requests/DeleteRequest.java | 263 +++ .../FileServiceUploadFileRequest.java | 96 - ...Request.java => GetRecordByIdRequest.java} | 116 +- ...ordRequest.java => GetRecordsRequest.java} | 166 +- .../records/requests/GetRequest.java | 499 ++++++ ...cordBody.java => InsertRecordRequest.java} | 101 +- .../records/requests/InsertRequest.java | 260 +++ .../RecordServiceBatchOperationBody.java | 151 -- ...cordBody.java => UpdateRecordRequest.java} | 75 +- .../records/requests/UpdateRequest.java | 273 +++ .../types/GetRecordByIdRequestRedaction.java | 108 ++ .../types/GetRecordsRequestOrderBy.java | 95 + .../types/GetRecordsRequestRedaction.java | 106 ++ .../types/InsertRecordRequestByot.java | 95 + ...ordServiceBulkGetRecordRequestOrderBy.java | 26 - ...dServiceBulkGetRecordRequestRedaction.java | 28 - ...ecordServiceGetRecordRequestRedaction.java | 28 - .../types/UpdateRecordRequestByot.java | 95 + .../types/UpdateRequestUpdateType.java | 84 + .../strings/AsyncRawStringsClient.java | 210 --- .../resources/strings/AsyncStringsClient.java | 68 - .../resources/strings/RawStringsClient.java | 166 -- .../rest/resources/strings/StringsClient.java | 64 - .../requests/DeidentifyStringRequest.java | 394 ---- .../requests/ReidentifyStringRequest.java | 151 -- ...eidentifyStringRequestEntityTypesItem.java | 160 -- .../tokens/AsyncRawTokensClient.java | 194 +- .../resources/tokens/AsyncTokensClient.java | 52 +- .../resources/tokens/RawTokensClient.java | 164 +- .../rest/resources/tokens/TokensClient.java | 48 +- .../tokens/requests/DeleteTokenRequest.java | 189 ++ ...izePayload.java => DetokenizePayload.java} | 77 +- .../tokens/requests/DetokenizeRequest.java | 238 +++ .../requests/GetTokensFromValuesRequest.java | 191 ++ .../tokens/requests/TokenizePayload.java | 124 ++ .../tokens/requests/TokenizeRequest.java | 191 ++ .../tokens/requests/V1TokenizePayload.java | 95 - .../types/AuditEventAuditResourceType.java | 80 - .../rest/types/AuditEventContext.java | 435 ----- .../generated/rest/types/AuditEventData.java | 96 - .../rest/types/AuditEventHttpInfo.java | 125 -- ...ponse.java => BatchOperationResponse.java} | 51 +- .../generated/rest/types/BatchRecord.java | 594 +++++++ .../rest/types/BatchRecordMethod.java | 93 +- .../rest/types/BatchRecordRedaction.java | 103 ++ ...nse.java => BulkDeleteRecordResponse.java} | 47 +- .../rest/types/BulkGetRecordResponse.java | 112 ++ .../rest/types/ColumnRedactions.java | 160 ++ .../rest/types/ContextAccessType.java | 26 - .../generated/rest/types/ContextAuthMode.java | 28 - .../rest/types/DeidentifiedFileOutput.java | 160 -- ...ifiedFileOutputProcessedFileExtension.java | 60 - ...identifiedFileOutputProcessedFileType.java | 34 - .../rest/types/DeidentifyFileResponse.java | 96 - .../rest/types/DeidentifyStringResponse.java | 186 -- ...esponse.java => DeleteRecordResponse.java} | 41 +- .../generated/rest/types/DeleteResponse.java | 122 ++ .../rest/types/DeleteResponseObject.java | 204 +++ .../rest/types/DeleteTokenResponse.java | 122 ++ .../rest/types/DeleteTokenResponseObject.java | 171 ++ .../rest/types/DetectGuardrailsResponse.java | 231 --- .../DetectGuardrailsResponseValidation.java | 24 - .../rest/types/DetectRunsResponse.java | 348 ---- .../types/DetectRunsResponseOutputType.java | 24 - .../rest/types/DetectRunsResponseStatus.java | 28 - .../rest/types/DetokenizeRecordRequest.java | 174 ++ .../DetokenizeRecordRequestRedaction.java | 108 ++ ...nse.java => DetokenizeRecordResponse.java} | 47 +- .../DetokenizeRecordResponseValueType.java | 153 +- .../rest/types/DetokenizeResponse.java | 113 ++ .../rest/types/DetokenizeResponseObject.java | 335 ++++ .../generated/rest/types/ErrorResponse.java | 38 +- .../rest/types/ErrorResponseError.java | 57 +- .../types/ExecuteQueryRecordResponse.java | 111 ++ .../rest/types/ExecuteQueryResponse.java | 137 ++ .../types/ExecuteQueryResponseMetadata.java | 112 ++ ...{V1FieldRecords.java => FieldRecords.java} | 41 +- .../generated/rest/types/FileData.java | 140 -- .../rest/types/FileDataDataFormat.java | 62 - .../rest/types/FileDataDeidentifyAudio.java | 141 -- .../FileDataDeidentifyAudioDataFormat.java | 24 - .../types/FileDataDeidentifyDocument.java | 141 -- .../FileDataDeidentifyDocumentDataFormat.java | 26 - .../rest/types/FileDataDeidentifyImage.java | 141 -- .../FileDataDeidentifyImageDataFormat.java | 32 - .../rest/types/FileDataDeidentifyPdf.java | 116 -- .../types/FileDataDeidentifyPresentation.java | 143 -- ...eDataDeidentifyPresentationDataFormat.java | 24 - .../types/FileDataDeidentifySpreadsheet.java | 143 -- ...leDataDeidentifySpreadsheetDataFormat.java | 26 - .../FileDataDeidentifyStructuredText.java | 143 -- ...ataDeidentifyStructuredTextDataFormat.java | 24 - .../rest/types/FileDataDeidentifyText.java | 116 -- .../rest/types/FileDataReidentifyFile.java | 141 -- .../FileDataReidentifyFileDataFormat.java | 36 - .../rest/types/FileDeleteRecord.java | 280 +++ .../rest/types/FileDeleteResponse.java | 122 ++ .../rest/types/FileDeleteResponseObject.java | 295 +++ .../generated/rest/types/FileMetadata.java | 173 ++ .../rest/types/FileUploadColumn.java | 171 ++ .../rest/types/FileUploadRecord.java | 235 +++ .../rest/types/FileUploadResponse.java | 122 ++ .../rest/types/FileUploadResponseObject.java | 286 +++ .../skyflow/generated/rest/types/Format.java | 153 -- .../rest/types/FormatMaskedItem.java | 160 -- .../rest/types/FormatPlaintextItem.java | 160 -- .../rest/types/FormatRedactedItem.java | 160 -- .../generated/rest/types/GetFieldRecords.java | 171 ++ .../rest/types/GetQueryResponse.java | 112 ++ .../generated/rest/types/GetRequestData.java | 324 ++++ .../generated/rest/types/GetResponse.java | 122 ++ .../GetTokensFromValuesRequestObject.java | 151 ++ .../types/GetTokensFromValuesResponse.java | 123 ++ .../rest/types/GoogleProtobufValue.java | 42 + .../generated/rest/types/GooglerpcStatus.java | 135 -- .../rest/types/IdentifyResponse.java | 108 -- .../rest/types/InsertRecordData.java | 176 ++ .../rest/types/InsertRecordResponse.java | 113 ++ .../generated/rest/types/InsertResponse.java | 122 ++ .../generated/rest/types/Locations.java | 188 -- .../generated/rest/types/ProtobufAny.java | 90 - ...perties.java => RecordMetaProperties.java} | 41 +- .../rest/types/RecordResponseObject.java | 448 +++++ .../rest/types/RedactionEnumRedaction.java | 28 - .../rest/types/ReidentifiedFileOutput.java | 160 -- ...ifiedFileOutputProcessedFileExtension.java | 60 - .../rest/types/ReidentifyFileResponse.java | 150 -- .../ReidentifyFileResponseOutputType.java | 24 - .../types/ReidentifyFileResponseStatus.java | 28 - .../rest/types/RequestActionType.java | 56 - .../generated/rest/types/ShiftDates.java | 153 -- .../rest/types/ShiftDatesEntityTypesItem.java | 26 - .../rest/types/StringResponseEntities.java | 212 --- .../rest/types/TokenGroupRedactions.java | 140 ++ .../rest/types/TokenTypeMapping.java | 185 -- .../rest/types/TokenTypeMappingDefault.java | 26 - .../types/TokenTypeMappingEntityOnlyItem.java | 160 -- .../TokenTypeMappingEntityUnqCounterItem.java | 160 -- .../types/TokenTypeMappingVaultTokenItem.java | 160 -- .../rest/types/TokenizeRecordRequest.java | 203 +++ .../rest/types/TokenizeRecordResponse.java | 128 ++ .../rest/types/TokenizeRequestObject.java | 212 +++ .../rest/types/TokenizeResponse.java | 122 ++ .../rest/types/TokenizeResponseObject.java | 321 ++++ .../generated/rest/types/Transformations.java | 90 - .../generated/rest/types/UniqueValue.java | 121 ++ .../rest/types/UpdateRecordData.java | 279 +++ .../types/UpdateRecordDataUpdateType.java | 84 + ...esponse.java => UpdateRecordResponse.java} | 41 +- .../generated/rest/types/UpdateResponse.java | 122 ++ ...esponse.java => UploadFileResponseV2.java} | 65 +- .../skyflow/generated/rest/types/Upsert.java | 154 ++ .../rest/types/UpsertUpdateType.java | 83 + .../rest/types/V1AuditAfterOptions.java | 125 -- .../rest/types/V1AuditEventResponse.java | 182 -- .../generated/rest/types/V1AuditResponse.java | 118 -- .../rest/types/V1AuditResponseEvent.java | 229 --- .../types/V1AuditResponseEventRequest.java | 330 ---- .../generated/rest/types/V1BatchRecord.java | 377 ---- .../rest/types/V1BinListResponse.java | 93 - .../rest/types/V1BulkGetRecordResponse.java | 93 - .../skyflow/generated/rest/types/V1Byot.java | 26 - .../skyflow/generated/rest/types/V1Card.java | 357 ---- .../rest/types/V1DeleteFileResponse.java | 125 -- .../rest/types/V1DetokenizeRecordRequest.java | 121 -- .../rest/types/V1DetokenizeResponse.java | 94 - .../rest/types/V1FileAvScanStatus.java | 38 - .../rest/types/V1GetAuthTokenResponse.java | 125 -- .../types/V1GetFileScanStatusResponse.java | 91 - .../rest/types/V1GetQueryResponse.java | 93 - .../rest/types/V1InsertRecordResponse.java | 94 - .../generated/rest/types/V1MemberType.java | 26 - .../rest/types/V1TokenizeRecordRequest.java | 125 -- .../rest/types/V1TokenizeRecordResponse.java | 96 - .../rest/types/V1TokenizeResponse.java | 94 - .../rest/types/V1VaultFieldMapping.java | 158 -- .../rest/types/V1VaultSchemaConfig.java | 150 -- .../rest/types/WordCharacterCount.java | 125 -- 282 files changed, 17197 insertions(+), 25062 deletions(-) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/AsyncRawApiClient.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/RawApiClient.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/ConsoleLogger.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/DoubleSerializer.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/ILogger.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/LogConfig.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/LogLevel.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/Logger.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/LoggingInterceptor.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseDecompressionInterceptor.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/Rfc2822DateTimeDeserializer.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/SseEvent.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/SseEventParser.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/WrappedAlias.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/errors/ForbiddenError.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/errors/TooManyRequestsError.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/requests/PatchV2VaultsIdRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileDeleteRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileUploadRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/{records/requests/UploadFileV2Request.java => files/requests/UploadFileRequestV2.java} (60%) delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/ExecuteQueryRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/GetQueryRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BatchOperationRequest.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceBulkDeleteRecordBody.java => BulkDeleteRecordRequest.java} (60%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRecordRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceGetRecordRequest.java => GetRecordByIdRequest.java} (57%) rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceBulkGetRecordRequest.java => GetRecordsRequest.java} (59%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRequest.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceInsertRecordBody.java => InsertRecordRequest.java} (63%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceUpdateRecordBody.java => UpdateRecordRequest.java} (58%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordByIdRequestRedaction.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestOrderBy.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestRedaction.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/InsertRecordRequestByot.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRecordRequestByot.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRequestUpdateType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DeleteTokenRequest.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/{V1DetokenizePayload.java => DetokenizePayload.java} (61%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizeRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/GetTokensFromValuesRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizePayload.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizeRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1BatchOperationResponse.java => BatchOperationResponse.java} (61%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecord.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordRedaction.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1BulkDeleteRecordResponse.java => BulkDeleteRecordResponse.java} (61%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/BulkGetRecordResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ColumnRedactions.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1DeleteRecordResponse.java => DeleteRecordResponse.java} (70%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponseObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponseObject.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequestRedaction.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1DetokenizeRecordResponse.java => DetokenizeRecordResponse.java} (75%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponseObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryRecordResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponseMetadata.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1FieldRecords.java => FieldRecords.java} (73%) delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileData.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteRecord.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponseObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileMetadata.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadColumn.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadRecord.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponseObject.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/Format.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetFieldRecords.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetQueryResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetRequestData.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesRequestObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GoogleProtobufValue.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordData.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/InsertResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/Locations.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1RecordMetaProperties.java => RecordMetaProperties.java} (70%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/RecordResponseObject.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenGroupRedactions.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRequestObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponseObject.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/Transformations.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UniqueValue.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordData.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordDataUpdateType.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1UpdateRecordResponse.java => UpdateRecordResponse.java} (70%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateResponse.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{UploadFileV2Response.java => UploadFileResponseV2.java} (53%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/Upsert.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UpsertUpdateType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1Card.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/ApiClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/ApiClient.java index ab81f443..e59a5e6f 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/ApiClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/ApiClient.java @@ -4,24 +4,20 @@ package com.skyflow.generated.rest; import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.core.Suppliers; -import com.skyflow.generated.rest.resources.audit.AuditClient; -import com.skyflow.generated.rest.resources.binlookup.BinLookupClient; +import com.skyflow.generated.rest.requests.PatchV2VaultsIdRequest; import com.skyflow.generated.rest.resources.files.FilesClient; -import com.skyflow.generated.rest.resources.guardrails.GuardrailsClient; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; -import com.skyflow.generated.rest.resources.strings.StringsClient; import com.skyflow.generated.rest.resources.tokens.TokensClient; - +import java.util.Optional; import java.util.function.Supplier; -public class ApiClient { +public class ApiClient implements AutoCloseable { protected final ClientOptions clientOptions; - protected final Supplier auditClient; - - protected final Supplier binLookupClient; + private final RawApiClient rawClient; protected final Supplier recordsClient; @@ -31,28 +27,37 @@ public class ApiClient { protected final Supplier filesClient; - protected final Supplier stringsClient; - - protected final Supplier guardrailsClient; - public ApiClient(ClientOptions clientOptions) { this.clientOptions = clientOptions; - this.auditClient = Suppliers.memoize(() -> new AuditClient(clientOptions)); - this.binLookupClient = Suppliers.memoize(() -> new BinLookupClient(clientOptions)); + this.rawClient = new RawApiClient(clientOptions); this.recordsClient = Suppliers.memoize(() -> new RecordsClient(clientOptions)); this.tokensClient = Suppliers.memoize(() -> new TokensClient(clientOptions)); this.queryClient = Suppliers.memoize(() -> new QueryClient(clientOptions)); this.filesClient = Suppliers.memoize(() -> new FilesClient(clientOptions)); - this.stringsClient = Suppliers.memoize(() -> new StringsClient(clientOptions)); - this.guardrailsClient = Suppliers.memoize(() -> new GuardrailsClient(clientOptions)); } - public AuditClient audit() { - return this.auditClient.get(); + /** + * Get responses with HTTP metadata like headers + */ + public RawApiClient withRawResponse() { + return this.rawClient; + } + + public void patchV2VaultsId(Optional vaultId) { + this.rawClient.patchV2VaultsId(vaultId).body(); } - public BinLookupClient binLookup() { - return this.binLookupClient.get(); + public void patchV2VaultsId(Optional vaultId, RequestOptions requestOptions) { + this.rawClient.patchV2VaultsId(vaultId, requestOptions).body(); + } + + public void patchV2VaultsId(Optional vaultId, PatchV2VaultsIdRequest request) { + this.rawClient.patchV2VaultsId(vaultId, request).body(); + } + + public void patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + this.rawClient.patchV2VaultsId(vaultId, request, requestOptions).body(); } public RecordsClient records() { @@ -71,12 +76,13 @@ public FilesClient files() { return this.filesClient.get(); } - public StringsClient strings() { - return this.stringsClient.get(); - } - - public GuardrailsClient guardrails() { - return this.guardrailsClient.get(); + /** + * Releases resources owned by this client. See {@code ClientOptions.close()} for what is + * and is not released. + */ + @Override + public void close() { + this.clientOptions.close(); } public static ApiClientBuilder builder() { diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java b/skyvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java index 4f8f5f78..18cee274 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java @@ -5,15 +5,35 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.Environment; +import com.skyflow.generated.rest.core.LogConfig; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import okhttp3.OkHttpClient; -public final class ApiClientBuilder { - private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); +public class ApiClientBuilder { + private Optional timeout = Optional.empty(); + + private Optional maxRetries = Optional.empty(); + + private Optional initialRetryDelayMillis = Optional.empty(); + + private Optional maxRetryDelayMillis = Optional.empty(); + + private Optional retryJitterFactor = Optional.empty(); + + private final Map customHeaders = new HashMap<>(); private String token = null; private Environment environment = Environment.PRODUCTION; + private OkHttpClient httpClient; + + private Optional logging = Optional.empty(); + + private String identifier; + /** * Sets token */ @@ -36,7 +56,7 @@ public ApiClientBuilder url(String url) { * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. */ public ApiClientBuilder timeout(int timeout) { - this.clientOptionsBuilder.timeout(timeout); + this.timeout = Optional.of(timeout); return this; } @@ -44,7 +64,31 @@ public ApiClientBuilder timeout(int timeout) { * Sets the maximum number of retries for the client. Defaults to 2 retries. */ public ApiClientBuilder maxRetries(int maxRetries) { - this.clientOptionsBuilder.maxRetries(maxRetries); + this.maxRetries = Optional.of(maxRetries); + return this; + } + + /** + * Sets the initial delay (in milliseconds) used for exponential backoff between retries. Defaults to 1000 milliseconds. + */ + public ApiClientBuilder initialRetryDelayMillis(long initialRetryDelayMillis) { + this.initialRetryDelayMillis = Optional.of(initialRetryDelayMillis); + return this; + } + + /** + * Sets the maximum delay (in milliseconds) between retries. Defaults to 60000 milliseconds. + */ + public ApiClientBuilder maxRetryDelayMillis(long maxRetryDelayMillis) { + this.maxRetryDelayMillis = Optional.of(maxRetryDelayMillis); + return this; + } + + /** + * Sets the jitter factor (between 0 and 1) applied to retry delays. Defaults to 0.2. + */ + public ApiClientBuilder retryJitterFactor(double retryJitterFactor) { + this.retryJitterFactor = Optional.of(retryJitterFactor); return this; } @@ -52,13 +96,191 @@ public ApiClientBuilder maxRetries(int maxRetries) { * Sets the underlying OkHttp client */ public ApiClientBuilder httpClient(OkHttpClient httpClient) { - this.clientOptionsBuilder.httpClient(httpClient); + this.httpClient = httpClient; + return this; + } + + /** + * Configure logging for the SDK. Silent by default — no log output unless explicitly configured. + */ + public ApiClientBuilder logging(LogConfig logging) { + this.logging = Optional.of(logging); + return this; + } + + /** + * Add a custom header to be sent with all requests. + * For headers that need to be computed dynamically or conditionally, use the setAdditional() method override instead. + * + * @param name The header name + * @param value The header value + * @return This builder for method chaining + */ + public ApiClientBuilder addHeader(String name, String value) { + this.customHeaders.put(name, value); + return this; + } + + public ApiClientBuilder identifier(String identifier) { + this.identifier = identifier; return this; } + protected ClientOptions buildClientOptions() { + ClientOptions.Builder builder = ClientOptions.builder(); + setEnvironment(builder); + setAuthentication(builder); + setHttpClient(builder); + setTimeouts(builder); + setRetries(builder); + setLogging(builder); + for (Map.Entry header : this.customHeaders.entrySet()) { + builder.addHeader(header.getKey(), header.getValue()); + } + setAdditional(builder); + return builder.build(); + } + + /** + * Sets the environment configuration for the client. + * Override this method to modify URLs or add environment-specific logic. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setEnvironment(ClientOptions.Builder builder) { + if (this.identifier != null) { + String _identifier = this.identifier != null ? this.identifier : "{{vault_uri}}"; + String _urlTemplate = null; + if (this.environment == null) { + _urlTemplate = "https://{identifier}.vault.skyflowapis.com"; + } else if (this.environment.equals(Environment.PRODUCTION)) { + _urlTemplate = "https://{identifier}.vault.skyflowapis.com"; + } else if (this.environment.equals(Environment.SANDBOX)) { + _urlTemplate = "https://{identifier}.vault.skyflowapis-preview.com"; + } + if (_urlTemplate != null) { + this.environment = Environment.custom(_urlTemplate.replace("{identifier}", _identifier)); + } + } + builder.environment(this.environment); + } + + /** + * Override this method to customize authentication. + * This method is called during client options construction to set up authentication headers. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *

{@code
+     * @Override
+     * protected void setAuthentication(ClientOptions.Builder builder) {
+     *     super.setAuthentication(builder); // Keep existing auth
+     *     builder.addHeader("X-API-Key", this.apiKey);
+     * }
+     * }
+ */ + protected void setAuthentication(ClientOptions.Builder builder) { + if (this.token != null) { + builder.addHeader("Authorization", "Bearer " + this.token); + } + } + + /** + * Sets the request timeout configuration. + * Override this method to customize timeout behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setTimeouts(ClientOptions.Builder builder) { + if (this.timeout.isPresent()) { + builder.timeout(this.timeout.get()); + } + } + + /** + * Sets the retry configuration for failed requests. + * Override this method to implement custom retry strategies. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setRetries(ClientOptions.Builder builder) { + if (this.maxRetries.isPresent()) { + builder.maxRetries(this.maxRetries.get()); + } + if (this.initialRetryDelayMillis.isPresent()) { + builder.initialRetryDelayMillis(this.initialRetryDelayMillis.get()); + } + if (this.maxRetryDelayMillis.isPresent()) { + builder.maxRetryDelayMillis(this.maxRetryDelayMillis.get()); + } + if (this.retryJitterFactor.isPresent()) { + builder.retryJitterFactor(this.retryJitterFactor.get()); + } + } + + /** + * Sets the OkHttp client configuration. + * Override this method to customize HTTP client behavior (interceptors, connection pools, etc). + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setHttpClient(ClientOptions.Builder builder) { + if (this.httpClient != null) { + builder.httpClient(this.httpClient); + } + } + + /** + * Sets the logging configuration for the SDK. + * Override this method to customize logging behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setLogging(ClientOptions.Builder builder) { + if (this.logging.isPresent()) { + builder.logging(this.logging.get()); + } + } + + /** + * Override this method to add any additional configuration to the client. + * This method is called at the end of the configuration chain, allowing you to add + * custom headers, modify settings, or perform any other client customization. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAdditional(ClientOptions.Builder builder) {
+     *     builder.addHeader("X-Request-ID", () -> UUID.randomUUID().toString());
+     *     builder.addHeader("X-Client-Version", "1.0.0");
+     * }
+     * }
+ */ + protected void setAdditional(ClientOptions.Builder builder) {} + + /** + * Override this method to add custom validation logic before the client is built. + * This method is called at the beginning of the build() method to ensure the configuration is valid. + * Throw an exception to prevent client creation if validation fails. + * + * Example: + *
{@code
+     * @Override
+     * protected void validateConfiguration() {
+     *     super.validateConfiguration(); // Run parent validations
+     *     if (tenantId == null || tenantId.isEmpty()) {
+     *         throw new IllegalStateException("tenantId is required");
+     *     }
+     * }
+     * }
+ */ + protected void validateConfiguration() {} + public ApiClient build() { - this.clientOptionsBuilder.addHeader("Authorization", "Bearer " + this.token); - clientOptionsBuilder.environment(this.environment); - return new ApiClient(clientOptionsBuilder.build()); + validateConfiguration(); + return new ApiClient(buildClientOptions()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java index dc57df06..cb5c6188 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java @@ -4,24 +4,21 @@ package com.skyflow.generated.rest; import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.core.Suppliers; -import com.skyflow.generated.rest.resources.audit.AsyncAuditClient; -import com.skyflow.generated.rest.resources.binlookup.AsyncBinLookupClient; +import com.skyflow.generated.rest.requests.PatchV2VaultsIdRequest; import com.skyflow.generated.rest.resources.files.AsyncFilesClient; -import com.skyflow.generated.rest.resources.guardrails.AsyncGuardrailsClient; import com.skyflow.generated.rest.resources.query.AsyncQueryClient; import com.skyflow.generated.rest.resources.records.AsyncRecordsClient; -import com.skyflow.generated.rest.resources.strings.AsyncStringsClient; import com.skyflow.generated.rest.resources.tokens.AsyncTokensClient; - +import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -public class AsyncApiClient { +public class AsyncApiClient implements AutoCloseable { protected final ClientOptions clientOptions; - protected final Supplier auditClient; - - protected final Supplier binLookupClient; + private final AsyncRawApiClient rawClient; protected final Supplier recordsClient; @@ -31,28 +28,37 @@ public class AsyncApiClient { protected final Supplier filesClient; - protected final Supplier stringsClient; - - protected final Supplier guardrailsClient; - public AsyncApiClient(ClientOptions clientOptions) { this.clientOptions = clientOptions; - this.auditClient = Suppliers.memoize(() -> new AsyncAuditClient(clientOptions)); - this.binLookupClient = Suppliers.memoize(() -> new AsyncBinLookupClient(clientOptions)); + this.rawClient = new AsyncRawApiClient(clientOptions); this.recordsClient = Suppliers.memoize(() -> new AsyncRecordsClient(clientOptions)); this.tokensClient = Suppliers.memoize(() -> new AsyncTokensClient(clientOptions)); this.queryClient = Suppliers.memoize(() -> new AsyncQueryClient(clientOptions)); this.filesClient = Suppliers.memoize(() -> new AsyncFilesClient(clientOptions)); - this.stringsClient = Suppliers.memoize(() -> new AsyncStringsClient(clientOptions)); - this.guardrailsClient = Suppliers.memoize(() -> new AsyncGuardrailsClient(clientOptions)); } - public AsyncAuditClient audit() { - return this.auditClient.get(); + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawApiClient withRawResponse() { + return this.rawClient; + } + + public CompletableFuture patchV2VaultsId(Optional vaultId) { + return this.rawClient.patchV2VaultsId(vaultId).thenApply(response -> response.body()); } - public AsyncBinLookupClient binLookup() { - return this.binLookupClient.get(); + public CompletableFuture patchV2VaultsId(Optional vaultId, RequestOptions requestOptions) { + return this.rawClient.patchV2VaultsId(vaultId, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture patchV2VaultsId(Optional vaultId, PatchV2VaultsIdRequest request) { + return this.rawClient.patchV2VaultsId(vaultId, request).thenApply(response -> response.body()); + } + + public CompletableFuture patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + return this.rawClient.patchV2VaultsId(vaultId, request, requestOptions).thenApply(response -> response.body()); } public AsyncRecordsClient records() { @@ -71,12 +77,13 @@ public AsyncFilesClient files() { return this.filesClient.get(); } - public AsyncStringsClient strings() { - return this.stringsClient.get(); - } - - public AsyncGuardrailsClient guardrails() { - return this.guardrailsClient.get(); + /** + * Releases resources owned by this client. See {@code ClientOptions.close()} for what is + * and is not released. + */ + @Override + public void close() { + this.clientOptions.close(); } public static AsyncApiClientBuilder builder() { diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java index 55a1c518..76fd8d42 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java @@ -5,15 +5,35 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.Environment; +import com.skyflow.generated.rest.core.LogConfig; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import okhttp3.OkHttpClient; -public final class AsyncApiClientBuilder { - private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); +public class AsyncApiClientBuilder { + private Optional timeout = Optional.empty(); + + private Optional maxRetries = Optional.empty(); + + private Optional initialRetryDelayMillis = Optional.empty(); + + private Optional maxRetryDelayMillis = Optional.empty(); + + private Optional retryJitterFactor = Optional.empty(); + + private final Map customHeaders = new HashMap<>(); private String token = null; private Environment environment = Environment.PRODUCTION; + private OkHttpClient httpClient; + + private Optional logging = Optional.empty(); + + private String identifier; + /** * Sets token */ @@ -36,7 +56,7 @@ public AsyncApiClientBuilder url(String url) { * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. */ public AsyncApiClientBuilder timeout(int timeout) { - this.clientOptionsBuilder.timeout(timeout); + this.timeout = Optional.of(timeout); return this; } @@ -44,7 +64,31 @@ public AsyncApiClientBuilder timeout(int timeout) { * Sets the maximum number of retries for the client. Defaults to 2 retries. */ public AsyncApiClientBuilder maxRetries(int maxRetries) { - this.clientOptionsBuilder.maxRetries(maxRetries); + this.maxRetries = Optional.of(maxRetries); + return this; + } + + /** + * Sets the initial delay (in milliseconds) used for exponential backoff between retries. Defaults to 1000 milliseconds. + */ + public AsyncApiClientBuilder initialRetryDelayMillis(long initialRetryDelayMillis) { + this.initialRetryDelayMillis = Optional.of(initialRetryDelayMillis); + return this; + } + + /** + * Sets the maximum delay (in milliseconds) between retries. Defaults to 60000 milliseconds. + */ + public AsyncApiClientBuilder maxRetryDelayMillis(long maxRetryDelayMillis) { + this.maxRetryDelayMillis = Optional.of(maxRetryDelayMillis); + return this; + } + + /** + * Sets the jitter factor (between 0 and 1) applied to retry delays. Defaults to 0.2. + */ + public AsyncApiClientBuilder retryJitterFactor(double retryJitterFactor) { + this.retryJitterFactor = Optional.of(retryJitterFactor); return this; } @@ -52,13 +96,191 @@ public AsyncApiClientBuilder maxRetries(int maxRetries) { * Sets the underlying OkHttp client */ public AsyncApiClientBuilder httpClient(OkHttpClient httpClient) { - this.clientOptionsBuilder.httpClient(httpClient); + this.httpClient = httpClient; + return this; + } + + /** + * Configure logging for the SDK. Silent by default — no log output unless explicitly configured. + */ + public AsyncApiClientBuilder logging(LogConfig logging) { + this.logging = Optional.of(logging); + return this; + } + + /** + * Add a custom header to be sent with all requests. + * For headers that need to be computed dynamically or conditionally, use the setAdditional() method override instead. + * + * @param name The header name + * @param value The header value + * @return This builder for method chaining + */ + public AsyncApiClientBuilder addHeader(String name, String value) { + this.customHeaders.put(name, value); + return this; + } + + public AsyncApiClientBuilder identifier(String identifier) { + this.identifier = identifier; return this; } + protected ClientOptions buildClientOptions() { + ClientOptions.Builder builder = ClientOptions.builder(); + setEnvironment(builder); + setAuthentication(builder); + setHttpClient(builder); + setTimeouts(builder); + setRetries(builder); + setLogging(builder); + for (Map.Entry header : this.customHeaders.entrySet()) { + builder.addHeader(header.getKey(), header.getValue()); + } + setAdditional(builder); + return builder.build(); + } + + /** + * Sets the environment configuration for the client. + * Override this method to modify URLs or add environment-specific logic. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setEnvironment(ClientOptions.Builder builder) { + if (this.identifier != null) { + String _identifier = this.identifier != null ? this.identifier : "{{vault_uri}}"; + String _urlTemplate = null; + if (this.environment == null) { + _urlTemplate = "https://{identifier}.vault.skyflowapis.com"; + } else if (this.environment.equals(Environment.PRODUCTION)) { + _urlTemplate = "https://{identifier}.vault.skyflowapis.com"; + } else if (this.environment.equals(Environment.SANDBOX)) { + _urlTemplate = "https://{identifier}.vault.skyflowapis-preview.com"; + } + if (_urlTemplate != null) { + this.environment = Environment.custom(_urlTemplate.replace("{identifier}", _identifier)); + } + } + builder.environment(this.environment); + } + + /** + * Override this method to customize authentication. + * This method is called during client options construction to set up authentication headers. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAuthentication(ClientOptions.Builder builder) {
+     *     super.setAuthentication(builder); // Keep existing auth
+     *     builder.addHeader("X-API-Key", this.apiKey);
+     * }
+     * }
+ */ + protected void setAuthentication(ClientOptions.Builder builder) { + if (this.token != null) { + builder.addHeader("Authorization", "Bearer " + this.token); + } + } + + /** + * Sets the request timeout configuration. + * Override this method to customize timeout behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setTimeouts(ClientOptions.Builder builder) { + if (this.timeout.isPresent()) { + builder.timeout(this.timeout.get()); + } + } + + /** + * Sets the retry configuration for failed requests. + * Override this method to implement custom retry strategies. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setRetries(ClientOptions.Builder builder) { + if (this.maxRetries.isPresent()) { + builder.maxRetries(this.maxRetries.get()); + } + if (this.initialRetryDelayMillis.isPresent()) { + builder.initialRetryDelayMillis(this.initialRetryDelayMillis.get()); + } + if (this.maxRetryDelayMillis.isPresent()) { + builder.maxRetryDelayMillis(this.maxRetryDelayMillis.get()); + } + if (this.retryJitterFactor.isPresent()) { + builder.retryJitterFactor(this.retryJitterFactor.get()); + } + } + + /** + * Sets the OkHttp client configuration. + * Override this method to customize HTTP client behavior (interceptors, connection pools, etc). + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setHttpClient(ClientOptions.Builder builder) { + if (this.httpClient != null) { + builder.httpClient(this.httpClient); + } + } + + /** + * Sets the logging configuration for the SDK. + * Override this method to customize logging behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setLogging(ClientOptions.Builder builder) { + if (this.logging.isPresent()) { + builder.logging(this.logging.get()); + } + } + + /** + * Override this method to add any additional configuration to the client. + * This method is called at the end of the configuration chain, allowing you to add + * custom headers, modify settings, or perform any other client customization. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAdditional(ClientOptions.Builder builder) {
+     *     builder.addHeader("X-Request-ID", () -> UUID.randomUUID().toString());
+     *     builder.addHeader("X-Client-Version", "1.0.0");
+     * }
+     * }
+ */ + protected void setAdditional(ClientOptions.Builder builder) {} + + /** + * Override this method to add custom validation logic before the client is built. + * This method is called at the beginning of the build() method to ensure the configuration is valid. + * Throw an exception to prevent client creation if validation fails. + * + * Example: + *
{@code
+     * @Override
+     * protected void validateConfiguration() {
+     *     super.validateConfiguration(); // Run parent validations
+     *     if (tenantId == null || tenantId.isEmpty()) {
+     *         throw new IllegalStateException("tenantId is required");
+     *     }
+     * }
+     * }
+ */ + protected void validateConfiguration() {} + public AsyncApiClient build() { - this.clientOptionsBuilder.addHeader("Authorization", "Bearer " + this.token); - clientOptionsBuilder.environment(this.environment); - return new AsyncApiClient(clientOptionsBuilder.build()); + validateConfiguration(); + return new AsyncApiClient(buildClientOptions()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncRawApiClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncRawApiClient.java new file mode 100644 index 00000000..da58025b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncRawApiClient.java @@ -0,0 +1,110 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.requests.PatchV2VaultsIdRequest; +import java.io.IOException; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; + +public class AsyncRawApiClient { + protected final ClientOptions clientOptions; + + public AsyncRawApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + public CompletableFuture> patchV2VaultsId(Optional vaultId) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build()); + } + + public CompletableFuture> patchV2VaultsId( + Optional vaultId, RequestOptions requestOptions) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build(), requestOptions); + } + + public CompletableFuture> patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request) { + return patchV2VaultsId(vaultId, request, null); + } + + public CompletableFuture> patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/vaults"); + if (vaultId.isPresent()) { + httpUrl.addPathSegment(vaultId.get()); + } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("PATCH", RequestBody.create("", null)) + .headers(Headers.of(clientOptions.headers(requestOptions))); + Request okhttpRequest = _requestBuilder.build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>(null, response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/RawApiClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/RawApiClient.java new file mode 100644 index 00000000..a39d00ca --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/RawApiClient.java @@ -0,0 +1,90 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.requests.PatchV2VaultsIdRequest; +import java.io.IOException; +import java.util.Optional; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; + +public class RawApiClient { + protected final ClientOptions clientOptions; + + public RawApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + public ApiClientHttpResponse patchV2VaultsId(Optional vaultId) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build()); + } + + public ApiClientHttpResponse patchV2VaultsId(Optional vaultId, RequestOptions requestOptions) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build(), requestOptions); + } + + public ApiClientHttpResponse patchV2VaultsId(Optional vaultId, PatchV2VaultsIdRequest request) { + return patchV2VaultsId(vaultId, request, null); + } + + public ApiClientHttpResponse patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/vaults"); + if (vaultId.isPresent()) { + httpUrl.addPathSegment(vaultId.get()); + } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("PATCH", RequestBody.create("", null)) + .headers(Headers.of(clientOptions.headers(requestOptions))); + Request okhttpRequest = _requestBuilder.build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>(null, response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java index be5247eb..c016a435 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java @@ -3,12 +3,11 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Response; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import okhttp3.Response; /** * This exception type will be thrown for any non-2XX API responses. @@ -68,7 +67,7 @@ public Map> headers() { @Override public String toString() { - return "ApiClientApiException{" + "message: " + getMessage() + ", statusCode: " + statusCode + ", body: " + body - + "}"; + return "ApiClientApiException{" + "message: " + getMessage() + ", statusCode: " + statusCode + ", body: " + + ObjectMappers.stringify(body) + "}"; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java index c743352c..9c81f1f5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java @@ -3,12 +3,11 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Response; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import okhttp3.Response; public final class ApiClientHttpResponse { diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java index da41fb25..3f3a7dc6 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java @@ -3,13 +3,12 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.OkHttpClient; - import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; +import okhttp3.OkHttpClient; public final class ClientOptions { private final Environment environment; @@ -20,14 +19,32 @@ public final class ClientOptions { private final OkHttpClient httpClient; + private final boolean ownsHttpClient; + private final int timeout; + private final int maxRetries; + + private final Optional initialRetryDelayMillis; + + private final Optional maxRetryDelayMillis; + + private final Optional retryJitterFactor; + + private final Optional logging; + private ClientOptions( Environment environment, Map headers, Map> headerSuppliers, OkHttpClient httpClient, - int timeout) { + boolean ownsHttpClient, + int timeout, + int maxRetries, + Optional initialRetryDelayMillis, + Optional maxRetryDelayMillis, + Optional retryJitterFactor, + Optional logging) { this.environment = environment; this.headers = new HashMap<>(); this.headers.putAll(headers); @@ -35,12 +52,18 @@ private ClientOptions( { put("X-Fern-Language", "JAVA"); put("X-Fern-SDK-Name", "com.skyflow.fern:api-sdk"); - put("X-Fern-SDK-Version", "0.0.385"); + put("X-Fern-SDK-Version", "0.0.98"); } }); this.headerSuppliers = headerSuppliers; this.httpClient = httpClient; + this.ownsHttpClient = ownsHttpClient; this.timeout = timeout; + this.maxRetries = maxRetries; + this.initialRetryDelayMillis = initialRetryDelayMillis; + this.maxRetryDelayMillis = maxRetryDelayMillis; + this.retryJitterFactor = retryJitterFactor; + this.logging = logging; } public Environment environment() { @@ -82,11 +105,50 @@ public OkHttpClient httpClientWithTimeout(RequestOptions requestOptions) { .build(); } + public int maxRetries() { + return this.maxRetries; + } + + public Optional initialRetryDelayMillis() { + return this.initialRetryDelayMillis; + } + + public Optional maxRetryDelayMillis() { + return this.maxRetryDelayMillis; + } + + public Optional retryJitterFactor() { + return this.retryJitterFactor; + } + + /** + * Releases resources owned by this client. Only shuts down the underlying OkHttpClient's + * dispatcher executor and evicts its connection pool when this client created that + * OkHttpClient itself; an OkHttpClient supplied via httpClient is left running, since the + * caller owns its lifecycle. + *

+ * In-flight calls are not cancelled or awaited, and any request issued after this method + * returns fails with a {@code RejectedExecutionException}. Options derived from this one via + * {@code Builder.from(...)} share the same dispatcher and connection pool, so closing either + * releases them for both. Calling this method more than once has no further effect. + */ + public void close() { + if (!this.ownsHttpClient) { + return; + } + this.httpClient.dispatcher().executorService().shutdown(); + this.httpClient.connectionPool().evictAll(); + } + + public Optional logging() { + return this.logging; + } + public static Builder builder() { return new Builder(); } - public static final class Builder { + public static class Builder { private Environment environment; private final Map headers = new HashMap<>(); @@ -95,17 +157,29 @@ public static final class Builder { private int maxRetries = 2; + private Optional initialRetryDelayMillis = Optional.empty(); + + private Optional maxRetryDelayMillis = Optional.empty(); + + private Optional retryJitterFactor = Optional.empty(); + private Optional timeout = Optional.empty(); private OkHttpClient httpClient = null; + private boolean ownsHttpClient = true; + + private Optional logging = Optional.empty(); + public Builder environment(Environment environment) { this.environment = environment; return this; } public Builder addHeader(String key, String value) { - this.headers.put(key, value); + if (value != null) { + this.headers.put(key, value); + } return this; } @@ -138,8 +212,45 @@ public Builder maxRetries(int maxRetries) { return this; } + /** + * Override the initial delay (in milliseconds) used for exponential backoff between retries. Defaults to 1000 milliseconds. + */ + public Builder initialRetryDelayMillis(long initialRetryDelayMillis) { + this.initialRetryDelayMillis = Optional.of(initialRetryDelayMillis); + return this; + } + + /** + * Override the maximum delay (in milliseconds) between retries. Defaults to 60000 milliseconds. + */ + public Builder maxRetryDelayMillis(long maxRetryDelayMillis) { + this.maxRetryDelayMillis = Optional.of(maxRetryDelayMillis); + return this; + } + + /** + * Override the jitter factor (between 0 and 1) applied to retry delays. Defaults to 0.2. + */ + public Builder retryJitterFactor(double retryJitterFactor) { + this.retryJitterFactor = Optional.of(retryJitterFactor); + return this; + } + + /** + * Sets the underlying OkHttp client. The caller retains ownership of its lifecycle: + * close() will not shut down its dispatcher executor or evict its connection pool. + */ public Builder httpClient(OkHttpClient httpClient) { this.httpClient = httpClient; + this.ownsHttpClient = httpClient == null; + return this; + } + + /** + * Configure logging for the SDK. Silent by default — no log output unless explicitly configured. + */ + public Builder logging(LogConfig logging) { + this.logging = Optional.of(logging); return this; } @@ -159,13 +270,51 @@ public ClientOptions build() { .connectTimeout(0, TimeUnit.SECONDS) .writeTimeout(0, TimeUnit.SECONDS) .readTimeout(0, TimeUnit.SECONDS) - .addInterceptor(new RetryInterceptor(this.maxRetries)); + .addInterceptor(new RetryInterceptor( + this.maxRetries, + this.initialRetryDelayMillis, + this.maxRetryDelayMillis, + this.retryJitterFactor)); } + Logger logger = Logger.from(this.logging); + httpClientBuilder.addInterceptor(new LoggingInterceptor(logger)); + httpClientBuilder.addInterceptor(new ResponseDecompressionInterceptor()); + this.httpClient = httpClientBuilder.build(); this.timeout = Optional.of(httpClient.callTimeoutMillis() / 1000); - return new ClientOptions(environment, headers, headerSuppliers, httpClient, this.timeout.get()); + return new ClientOptions( + environment, + headers, + headerSuppliers, + httpClient, + this.ownsHttpClient, + this.timeout.get(), + this.maxRetries, + this.initialRetryDelayMillis, + this.maxRetryDelayMillis, + this.retryJitterFactor, + this.logging); + } + + /** + * Create a new Builder initialized with values from an existing ClientOptions + */ + public static Builder from(ClientOptions clientOptions) { + Builder builder = new Builder(); + builder.environment = clientOptions.environment(); + builder.timeout = Optional.of(clientOptions.timeout(null)); + builder.httpClient = clientOptions.httpClient(); + builder.ownsHttpClient = clientOptions.ownsHttpClient; + builder.headers.putAll(clientOptions.headers); + builder.headerSuppliers.putAll(clientOptions.headerSuppliers); + builder.maxRetries = clientOptions.maxRetries(); + builder.initialRetryDelayMillis = clientOptions.initialRetryDelayMillis(); + builder.maxRetryDelayMillis = clientOptions.maxRetryDelayMillis(); + builder.retryJitterFactor = clientOptions.retryJitterFactor(); + builder.logging = clientOptions.logging(); + return builder; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ConsoleLogger.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ConsoleLogger.java new file mode 100644 index 00000000..d3786dcc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ConsoleLogger.java @@ -0,0 +1,52 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.util.logging.Level; + +/** + * Default logger implementation that writes to the console using {@link java.util.logging.Logger}. + * + *

Uses the "fern" logger name with a simple format of "LEVEL - message". + */ +public final class ConsoleLogger implements ILogger { + + private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger("fern"); + + static { + if (logger.getHandlers().length == 0) { + java.util.logging.ConsoleHandler handler = new java.util.logging.ConsoleHandler(); + handler.setFormatter(new java.util.logging.SimpleFormatter() { + @Override + public String format(java.util.logging.LogRecord record) { + return record.getLevel() + " - " + record.getMessage() + System.lineSeparator(); + } + }); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + logger.setUseParentHandlers(false); + logger.setLevel(Level.ALL); + } + } + + @Override + public void debug(String message) { + logger.log(Level.FINE, message); + } + + @Override + public void info(String message) { + logger.log(Level.INFO, message); + } + + @Override + public void warn(String message) { + logger.log(Level.WARNING, message); + } + + @Override + public void error(String message) { + logger.log(Level.SEVERE, message); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java index a0a6d7c4..0f422bc2 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java @@ -8,18 +8,19 @@ import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; - import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalQueries; /** - * Custom deserializer that handles converting ISO8601 dates into {@link OffsetDateTime} objects. + * Custom deserializer that handles converting date-time strings into {@link OffsetDateTime} objects. + * Supports ISO 8601 format, space-separated variants, and RFC 1123 (RFC 2822) format. */ class DateTimeDeserializer extends JsonDeserializer { private static final SimpleModule MODULE; @@ -43,8 +44,21 @@ public OffsetDateTime deserialize(JsonParser parser, DeserializationContext cont if (token == JsonToken.VALUE_NUMBER_INT) { return OffsetDateTime.ofInstant(Instant.ofEpochSecond(parser.getValueAsLong()), ZoneOffset.UTC); } else { - TemporalAccessor temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest( - parser.getValueAsString(), OffsetDateTime::from, LocalDateTime::from); + String value = parser.getValueAsString(); + TemporalAccessor temporal; + try { + temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest(value, OffsetDateTime::from, LocalDateTime::from); + } catch (DateTimeParseException e) { + try { + // Fall back to space-separated format (e.g. "2025-02-15 10:30:00+00:00"). + temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest( + value.replace(' ', 'T'), OffsetDateTime::from, LocalDateTime::from); + } catch (DateTimeParseException e2) { + // Fall back to RFC 1123 format (e.g. "Thu, 07 May 2026 14:23:38 +0000"). + temporal = DateTimeFormatter.RFC_1123_DATE_TIME.parseBest( + value, OffsetDateTime::from, LocalDateTime::from); + } + } if (temporal.query(TemporalQueries.offset()) == null) { return LocalDateTime.from(temporal).atOffset(ZoneOffset.UTC); diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/DoubleSerializer.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/DoubleSerializer.java new file mode 100644 index 00000000..131d0a9a --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/DoubleSerializer.java @@ -0,0 +1,43 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; +import java.io.IOException; + +/** + * Custom serializer that writes integer-valued doubles without a decimal point. + * For example, {@code 24000.0} is serialized as {@code 24000} instead of {@code 24000.0}. + * Non-integer values like {@code 3.14} are serialized normally. + */ +class DoubleSerializer extends JsonSerializer { + private static final SimpleModule MODULE; + + static { + MODULE = new SimpleModule() + .addSerializer(Double.class, new DoubleSerializer()) + .addSerializer(double.class, new DoubleSerializer()); + } + + /** + * Gets a module wrapping this serializer as an adapter for the Jackson ObjectMapper. + * + * @return A {@link SimpleModule} to be plugged onto Jackson ObjectMapper. + */ + public static SimpleModule getModule() { + return MODULE; + } + + @Override + public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + if (value != null && value == Math.floor(value) && !Double.isInfinite(value) && !Double.isNaN(value)) { + gen.writeNumber(value.longValue()); + } else { + gen.writeNumber(value); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/Environment.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/Environment.java index c0adb233..93e13ce9 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/Environment.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/Environment.java @@ -4,9 +4,10 @@ package com.skyflow.generated.rest.core; public final class Environment { - public static final Environment PRODUCTION = new Environment("https://identifier.vault.skyflowapis.com"); + public static final Environment PRODUCTION = new Environment("https://%7B%7Bvault_uri%7D%7D.vault.skyflowapis.com"); - public static final Environment SANDBOX = new Environment("https://identifier.vault.skyflowapis-preview.com"); + public static final Environment SANDBOX = + new Environment("https://%7B%7Bvault_uri%7D%7D.vault.skyflowapis-preview.com"); private final String url; diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java index 2131b0a4..6b459431 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java @@ -3,13 +3,12 @@ */ package com.skyflow.generated.rest.core; +import java.io.InputStream; +import java.util.Objects; import okhttp3.MediaType; import okhttp3.RequestBody; import org.jetbrains.annotations.Nullable; -import java.io.InputStream; -import java.util.Objects; - /** * Represents a file stream with associated metadata for file uploads. */ diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ILogger.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ILogger.java new file mode 100644 index 00000000..a70ec8e6 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ILogger.java @@ -0,0 +1,38 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +/** + * Interface for custom logger implementations. + * + *

Implement this interface to provide a custom logging backend for the SDK. + * The SDK will call the appropriate method based on the log level. + * + *

Example: + *

{@code
+ * public class MyCustomLogger implements ILogger {
+ *     public void debug(String message) {
+ *         System.out.println("[DBG] " + message);
+ *     }
+ *     public void info(String message) {
+ *         System.out.println("[INF] " + message);
+ *     }
+ *     public void warn(String message) {
+ *         System.out.println("[WRN] " + message);
+ *     }
+ *     public void error(String message) {
+ *         System.out.println("[ERR] " + message);
+ *     }
+ * }
+ * }
+ */ +public interface ILogger { + void debug(String message); + + void info(String message); + + void warn(String message); + + void error(String message); +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java index 55c3c971..5351a5f8 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java @@ -3,18 +3,16 @@ */ package com.skyflow.generated.rest.core; +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; import okhttp3.MediaType; import okhttp3.RequestBody; -import okhttp3.internal.Util; import okio.BufferedSink; import okio.Okio; import okio.Source; import org.jetbrains.annotations.Nullable; -import java.io.IOException; -import java.io.InputStream; -import java.util.Objects; - /** * A custom implementation of OkHttp's RequestBody that wraps an InputStream. * This class allows streaming of data from an InputStream directly to an HTTP request body, @@ -69,12 +67,8 @@ public long contentLength() throws IOException { */ @Override public void writeTo(BufferedSink sink) throws IOException { - Source source = null; - try { - source = Okio.source(inputStream); + try (Source source = Okio.source(inputStream)) { sink.writeAll(source); - } finally { - Util.closeQuietly(Objects.requireNonNull(source)); } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/LogConfig.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/LogConfig.java new file mode 100644 index 00000000..7928e097 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/LogConfig.java @@ -0,0 +1,98 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +/** + * Configuration for SDK logging. + * + *

Use the builder to configure logging behavior: + *

{@code
+ * LogConfig config = LogConfig.builder()
+ *     .level(LogLevel.DEBUG)
+ *     .silent(false)
+ *     .build();
+ * }
+ * + *

Or with a custom logger: + *

{@code
+ * LogConfig config = LogConfig.builder()
+ *     .level(LogLevel.DEBUG)
+ *     .logger(new MyCustomLogger())
+ *     .silent(false)
+ *     .build();
+ * }
+ * + *

Defaults: + *

    + *
  • {@code level} — {@link LogLevel#INFO}
  • + *
  • {@code logger} — {@link ConsoleLogger} (writes to stderr via java.util.logging)
  • + *
  • {@code silent} — {@code true} (no output unless explicitly enabled)
  • + *
+ */ +public final class LogConfig { + + private final LogLevel level; + private final ILogger logger; + private final boolean silent; + + private LogConfig(LogLevel level, ILogger logger, boolean silent) { + this.level = level; + this.logger = logger; + this.silent = silent; + } + + public LogLevel level() { + return level; + } + + public ILogger logger() { + return logger; + } + + public boolean silent() { + return silent; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private LogLevel level = LogLevel.INFO; + private ILogger logger = new ConsoleLogger(); + private boolean silent = true; + + private Builder() {} + + /** + * Set the minimum log level. Only messages at this level or above will be logged. + * Defaults to {@link LogLevel#INFO}. + */ + public Builder level(LogLevel level) { + this.level = level; + return this; + } + + /** + * Set a custom logger implementation. Defaults to {@link ConsoleLogger}. + */ + public Builder logger(ILogger logger) { + this.logger = logger; + return this; + } + + /** + * Set whether logging is silent (disabled). Defaults to {@code true}. + * Set to {@code false} to enable log output. + */ + public Builder silent(boolean silent) { + this.silent = silent; + return this; + } + + public LogConfig build() { + return new LogConfig(level, logger, silent); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/LogLevel.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/LogLevel.java new file mode 100644 index 00000000..db72cd0a --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/LogLevel.java @@ -0,0 +1,36 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +/** + * Log levels for SDK logging configuration. + * Silent by default — no log output unless explicitly configured. + */ +public enum LogLevel { + DEBUG(1), + INFO(2), + WARN(3), + ERROR(4); + + private final int value; + + LogLevel(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + /** + * Parse a log level from a string (case-insensitive). + * + * @param level the level string (debug, info, warn, error) + * @return the corresponding LogLevel + * @throws IllegalArgumentException if the string does not match any level + */ + public static LogLevel fromString(String level) { + return LogLevel.valueOf(level.toUpperCase()); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/Logger.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/Logger.java new file mode 100644 index 00000000..a5603955 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/Logger.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +/** + * SDK logger that filters messages based on level and silent mode. + * + *

Silent by default — no log output unless explicitly configured. + * Create via {@link LogConfig} or directly: + *

{@code
+ * Logger logger = new Logger(LogLevel.DEBUG, new ConsoleLogger(), false);
+ * logger.debug("request sent");
+ * }
+ */ +public final class Logger { + + private static final Logger DEFAULT = new Logger(LogLevel.INFO, new ConsoleLogger(), true); + + private final LogLevel level; + private final ILogger logger; + private final boolean silent; + + public Logger(LogLevel level, ILogger logger, boolean silent) { + this.level = level; + this.logger = logger; + this.silent = silent; + } + + /** + * Returns a default silent logger (no output). + */ + public static Logger getDefault() { + return DEFAULT; + } + + /** + * Creates a Logger from a {@link LogConfig}. If config is {@code null}, returns the default silent logger. + */ + public static Logger from(LogConfig config) { + if (config == null) { + return DEFAULT; + } + return new Logger(config.level(), config.logger(), config.silent()); + } + + /** + * Creates a Logger from an {@code Optional}. If empty, returns the default silent logger. + */ + public static Logger from(java.util.Optional config) { + return config.map(Logger::from).orElse(DEFAULT); + } + + private boolean shouldLog(LogLevel messageLevel) { + return !silent && level.getValue() <= messageLevel.getValue(); + } + + public boolean isDebug() { + return shouldLog(LogLevel.DEBUG); + } + + public boolean isInfo() { + return shouldLog(LogLevel.INFO); + } + + public boolean isWarn() { + return shouldLog(LogLevel.WARN); + } + + public boolean isError() { + return shouldLog(LogLevel.ERROR); + } + + public void debug(String message) { + if (isDebug()) { + logger.debug(message); + } + } + + public void info(String message) { + if (isInfo()) { + logger.info(message); + } + } + + public void warn(String message) { + if (isWarn()) { + logger.warn(message); + } + } + + public void error(String message) { + if (isError()) { + logger.error(message); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/LoggingInterceptor.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/LoggingInterceptor.java new file mode 100644 index 00000000..407b7937 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/LoggingInterceptor.java @@ -0,0 +1,104 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +/** + * OkHttp interceptor that logs HTTP requests and responses. + * + *

Logs request method, URL, and headers (with sensitive values redacted) at debug level. + * Logs response status at debug level, and 4xx/5xx responses at error level. + * Does nothing if the logger is silent. + */ +public final class LoggingInterceptor implements Interceptor { + + private static final Set SENSITIVE_HEADERS = new HashSet<>(Arrays.asList( + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "proxy-authenticate", + "proxy-authorization", + "cookie", + "set-cookie", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token")); + + private final Logger logger; + + public LoggingInterceptor(Logger logger) { + this.logger = logger; + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + + if (logger.isDebug()) { + StringBuilder sb = new StringBuilder(); + sb.append("HTTP Request: ").append(request.method()).append(" ").append(request.url()); + sb.append(" headers={"); + boolean first = true; + for (String name : request.headers().names()) { + if (!first) { + sb.append(", "); + } + sb.append(name).append("="); + if (SENSITIVE_HEADERS.contains(name.toLowerCase())) { + sb.append("[REDACTED]"); + } else { + sb.append(request.header(name)); + } + first = false; + } + sb.append("}"); + sb.append(" has_body=").append(request.body() != null); + logger.debug(sb.toString()); + } + + Response response = chain.proceed(request); + + if (logger.isDebug()) { + StringBuilder sb = new StringBuilder(); + sb.append("HTTP Response: status=").append(response.code()); + sb.append(" url=").append(response.request().url()); + sb.append(" headers={"); + boolean first = true; + for (String name : response.headers().names()) { + if (!first) { + sb.append(", "); + } + sb.append(name).append("="); + if (SENSITIVE_HEADERS.contains(name.toLowerCase())) { + sb.append("[REDACTED]"); + } else { + sb.append(response.header(name)); + } + first = false; + } + sb.append("}"); + logger.debug(sb.toString()); + } + + if (response.code() >= 400 && logger.isError()) { + logger.error("HTTP Error: status=" + response.code() + " url=" + + response.request().url()); + } + + return response; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java index 98c33be4..a6cffd4d 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java @@ -14,6 +14,9 @@ public boolean equals(Object o) { } private boolean isOptionalEmpty(Object o) { - return o instanceof Optional && !((Optional) o).isPresent(); + if (o instanceof Optional) { + return !((Optional) o).isPresent(); + } + return false; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java index acec32b4..4f69f150 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java @@ -4,13 +4,13 @@ package com.skyflow.generated.rest.core; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - import java.io.IOException; public final class ObjectMappers { @@ -18,6 +18,7 @@ public final class ObjectMappers { .addModule(new Jdk8Module()) .addModule(new JavaTimeModule()) .addModule(DateTimeDeserializer.getModule()) + .addModule(DoubleSerializer.getModule()) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) .build(); @@ -34,4 +35,12 @@ public static String stringify(Object o) { return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()); } } + + public static Object parseErrorBody(String responseBodyString) { + try { + return JSON_MAPPER.readValue(responseBodyString, Object.class); + } catch (JsonProcessingException ignored) { + return responseBodyString; + } + } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java index c0687736..e9e18fb9 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java @@ -7,11 +7,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import okhttp3.HttpUrl; import okhttp3.MultipartBody; -import java.util.*; - public class QueryStringMapper { private static final ObjectMapper MAPPER = ObjectMappers.JSON_MAPPER; diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java index edc6d0ae..26b396e4 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java @@ -16,21 +16,33 @@ public final class RequestOptions { private final TimeUnit timeoutTimeUnit; + private final Optional maxRetries; + private final Map headers; private final Map> headerSuppliers; + private final Map queryParameters; + + private final Map> queryParameterSuppliers; + private RequestOptions( String token, Optional timeout, TimeUnit timeoutTimeUnit, + Optional maxRetries, Map headers, - Map> headerSuppliers) { + Map> headerSuppliers, + Map queryParameters, + Map> queryParameterSuppliers) { this.token = token; this.timeout = timeout; this.timeoutTimeUnit = timeoutTimeUnit; + this.maxRetries = maxRetries; this.headers = headers; this.headerSuppliers = headerSuppliers; + this.queryParameters = queryParameters; + this.queryParameterSuppliers = queryParameterSuppliers; } public Optional getTimeout() { @@ -41,6 +53,10 @@ public TimeUnit getTimeoutTimeUnit() { return timeoutTimeUnit; } + public Optional getMaxRetries() { + return maxRetries; + } + public Map getHeaders() { Map headers = new HashMap<>(); if (this.token != null) { @@ -53,21 +69,35 @@ public Map getHeaders() { return headers; } + public Map getQueryParameters() { + Map queryParameters = new HashMap<>(this.queryParameters); + this.queryParameterSuppliers.forEach((key, supplier) -> { + queryParameters.put(key, supplier.get()); + }); + return queryParameters; + } + public static Builder builder() { return new Builder(); } - public static final class Builder { + public static class Builder { private String token = null; private Optional timeout = Optional.empty(); private TimeUnit timeoutTimeUnit = TimeUnit.SECONDS; + private Optional maxRetries = Optional.empty(); + private final Map headers = new HashMap<>(); private final Map> headerSuppliers = new HashMap<>(); + private final Map queryParameters = new HashMap<>(); + + private final Map> queryParameterSuppliers = new HashMap<>(); + public Builder token(String token) { this.token = token; return this; @@ -84,6 +114,11 @@ public Builder timeout(Integer timeout, TimeUnit timeoutTimeUnit) { return this; } + public Builder maxRetries(Integer maxRetries) { + this.maxRetries = Optional.of(maxRetries); + return this; + } + public Builder addHeader(String key, String value) { this.headers.put(key, value); return this; @@ -94,8 +129,26 @@ public Builder addHeader(String key, Supplier value) { return this; } + public Builder addQueryParameter(String key, String value) { + this.queryParameters.put(key, value); + return this; + } + + public Builder addQueryParameter(String key, Supplier value) { + this.queryParameterSuppliers.put(key, value); + return this; + } + public RequestOptions build() { - return new RequestOptions(token, timeout, timeoutTimeUnit, headers, headerSuppliers); + return new RequestOptions( + token, + timeout, + timeoutTimeUnit, + maxRetries, + headers, + headerSuppliers, + queryParameters, + queryParameterSuppliers); } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java index 1bb0b5dc..d8df7715 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java @@ -3,10 +3,9 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Response; - import java.io.FilterInputStream; import java.io.IOException; +import okhttp3.Response; /** * A custom InputStream that wraps the InputStream from the OkHttp Response and ensures that the diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java index e6c1a525..ed894407 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java @@ -3,10 +3,9 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Response; - import java.io.FilterReader; import java.io.IOException; +import okhttp3.Response; /** * A custom Reader that wraps the Reader from the OkHttp Response and ensures that the diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseDecompressionInterceptor.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseDecompressionInterceptor.java new file mode 100644 index 00000000..d6938347 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseDecompressionInterceptor.java @@ -0,0 +1,56 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.io.IOException; +import java.util.zip.Inflater; +import okhttp3.Interceptor; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okio.GzipSource; +import okio.InflaterSource; +import okio.Okio; +import okio.Source; + +/** + * Decompresses gzip and deflate encoded response bodies. OkHttp only performs + * transparent decompression when it adds the Accept-Encoding header itself, so + * responses to requests with an explicitly set Accept-Encoding header would + * otherwise be returned as raw compressed bytes. + */ +public class ResponseDecompressionInterceptor implements Interceptor { + + @Override + public Response intercept(Chain chain) throws IOException { + return decompress(chain.proceed(chain.request())); + } + + private Response decompress(Response response) { + ResponseBody body = response.body(); + if (body == null) { + return response; + } + String encoding = response.header("Content-Encoding"); + if (encoding == null) { + return response; + } + Source decompressedSource; + if (encoding.equalsIgnoreCase("gzip") || encoding.equalsIgnoreCase("x-gzip")) { + decompressedSource = new GzipSource(body.source()); + } else if (encoding.equalsIgnoreCase("deflate")) { + decompressedSource = new InflaterSource(body.source(), new Inflater()); + } else { + return response; + } + ResponseBody decompressedBody = ResponseBody.create(body.contentType(), -1L, Okio.buffer(decompressedSource)); + return response.newBuilder() + .headers(response.headers() + .newBuilder() + .removeAll("Content-Encoding") + .removeAll("Content-Length") + .build()) + .body(decompressedBody) + .build(); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java index 7a28c3c9..7d89751d 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java @@ -3,37 +3,80 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Interceptor; -import okhttp3.Response; - import java.io.IOException; import java.time.Duration; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.Optional; import java.util.Random; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; public class RetryInterceptor implements Interceptor { - private static final Duration ONE_SECOND = Duration.ofSeconds(1); - private final ExponentialBackoff backoff; + private static final Duration DEFAULT_INITIAL_RETRY_DELAY = Duration.ofMillis(1000); + private static final Duration DEFAULT_MAX_RETRY_DELAY = Duration.ofMillis(60000); + private static final double DEFAULT_JITTER_FACTOR = 0.2; + + private final int maxRetries; + private final Duration initialRetryDelay; + private final Duration maxRetryDelay; + private final double jitterFactor; private final Random random = new Random(); public RetryInterceptor(int maxRetries) { - this.backoff = new ExponentialBackoff(maxRetries); + this(maxRetries, Optional.empty(), Optional.empty(), Optional.empty()); + } + + public RetryInterceptor( + int maxRetries, + Optional initialRetryDelayMillis, + Optional maxRetryDelayMillis, + Optional jitterFactor) { + initialRetryDelayMillis.ifPresent(delay -> { + if (delay < 0) { + throw new IllegalArgumentException("initialRetryDelayMillis must be non-negative"); + } + }); + maxRetryDelayMillis.ifPresent(delay -> { + if (delay < 0) { + throw new IllegalArgumentException("maxRetryDelayMillis must be non-negative"); + } + }); + jitterFactor.ifPresent(factor -> { + if (factor < 0 || factor > 1) { + throw new IllegalArgumentException("jitterFactor must be between 0 and 1"); + } + }); + this.maxRetries = maxRetries; + this.initialRetryDelay = initialRetryDelayMillis.map(Duration::ofMillis).orElse(DEFAULT_INITIAL_RETRY_DELAY); + this.maxRetryDelay = maxRetryDelayMillis.map(Duration::ofMillis).orElse(DEFAULT_MAX_RETRY_DELAY); + this.jitterFactor = jitterFactor.orElse(DEFAULT_JITTER_FACTOR); } @Override public Response intercept(Chain chain) throws IOException { - Response response = chain.proceed(chain.request()); + Request request = chain.request(); + int effectiveMaxRetries = resolveMaxRetries(request); + Response response = chain.proceed(request); if (shouldRetry(response.code())) { - return retryChain(response, chain); + return retryChain(response, chain, effectiveMaxRetries); } return response; } - private Response retryChain(Response response, Chain chain) throws IOException { - Optional nextBackoff = this.backoff.nextBackoff(); + private int resolveMaxRetries(Request request) { + MaxRetriesOverride override = request.tag(MaxRetriesOverride.class); + return override != null ? override.getValue() : this.maxRetries; + } + + private Response retryChain(Response response, Chain chain, int maxRetries) throws IOException { + ExponentialBackoff backoff = new ExponentialBackoff(maxRetries); + Optional nextBackoff = backoff.nextBackoff(response); while (nextBackoff.isPresent()) { try { Thread.sleep(nextBackoff.get().toMillis()); @@ -43,7 +86,7 @@ private Response retryChain(Response response, Chain chain) throws IOException { response.close(); response = chain.proceed(chain.request()); if (shouldRetry(response.code())) { - nextBackoff = this.backoff.nextBackoff(); + nextBackoff = backoff.nextBackoff(response); } else { return response; } @@ -52,10 +95,130 @@ private Response retryChain(Response response, Chain chain) throws IOException { return response; } + /** + * Calculates the retry delay from response headers, with fallback to exponential backoff. + * Priority: Retry-After > X-RateLimit-Reset > Exponential Backoff + */ + private Duration getRetryDelayFromHeaders(Response response, int retryAttempt) { + // Check for Retry-After header first (RFC 7231), with no jitter + String retryAfter = response.header("Retry-After"); + if (retryAfter != null) { + // Parse as number of seconds... + Optional secondsDelay = tryParseLong(retryAfter) + .map(seconds -> seconds * 1000) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, maxRetryDelay.toMillis())) + .map(Duration::ofMillis); + if (secondsDelay.isPresent()) { + return secondsDelay.get(); + } + + // ...or as an HTTP date; both are valid + Optional dateDelay = tryParseHttpDate(retryAfter) + .map(resetTime -> resetTime.toInstant().toEpochMilli() - System.currentTimeMillis()) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, maxRetryDelay.toMillis())) + .map(Duration::ofMillis); + if (dateDelay.isPresent()) { + return dateDelay.get(); + } + } + + // Then check for industry-standard X-RateLimit-Reset header, with positive jitter + String rateLimitReset = response.header("X-RateLimit-Reset"); + if (rateLimitReset != null) { + // Assume Unix timestamp in epoch seconds + Optional rateLimitDelay = tryParseLong(rateLimitReset) + .map(resetTimeSeconds -> (resetTimeSeconds * 1000) - System.currentTimeMillis()) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, maxRetryDelay.toMillis())) + .map(this::addPositiveJitter) + .map(Duration::ofMillis); + if (rateLimitDelay.isPresent()) { + return rateLimitDelay.get(); + } + } + + // Fall back to exponential backoff, with symmetric jitter + long initialDelayMillis = initialRetryDelay.toMillis(); + long maxDelayMillis = maxRetryDelay.toMillis(); + long cappedDelay; + if (retryAttempt >= Long.SIZE - 1 || initialDelayMillis > (maxDelayMillis >> retryAttempt)) { + // initialDelayMillis * 2^retryAttempt would exceed maxDelayMillis (or overflow) + cappedDelay = maxDelayMillis; + } else { + cappedDelay = Math.min(initialDelayMillis << retryAttempt, maxDelayMillis); // 2^retryAttempt + } + return Duration.ofMillis(addSymmetricJitter(cappedDelay)); + } + + /** + * Attempts to parse a string as a long, returning empty Optional on failure. + */ + private Optional tryParseLong(String value) { + if (value == null) { + return Optional.empty(); + } + try { + return Optional.of(Long.parseLong(value)); + } catch (NumberFormatException e) { + return Optional.empty(); + } + } + + /** + * Attempts to parse a string as an HTTP date (RFC 1123), returning empty Optional on failure. + */ + private Optional tryParseHttpDate(String value) { + if (value == null) { + return Optional.empty(); + } + try { + return Optional.of(ZonedDateTime.parse(value, DateTimeFormatter.RFC_1123_DATE_TIME)); + } catch (DateTimeParseException e) { + return Optional.empty(); + } + } + + /** + * Adds positive jitter (100-120% of original value) to prevent thundering herd. + * Used for X-RateLimit-Reset header delays. + */ + private long addPositiveJitter(long delayMs) { + double jitterMultiplier = 1.0 + (random.nextDouble() * jitterFactor); + return (long) (delayMs * jitterMultiplier); + } + + /** + * Adds symmetric jitter (90-110% of original value) to prevent thundering herd. + * Used for exponential backoff delays. + */ + private long addSymmetricJitter(long delayMs) { + double jitterMultiplier = 1.0 + ((random.nextDouble() - 0.5) * jitterFactor); + return (long) (delayMs * jitterMultiplier); + } + private static boolean shouldRetry(int statusCode) { return statusCode == 408 || statusCode == 429 || statusCode >= 500; } + /** + * Per-request override carried on the OkHttp {@link Request} as a tag. + * When present, the interceptor uses this value instead of the client-wide + * {@code maxRetries} configured at construction time. + */ + public static final class MaxRetriesOverride { + private final int value; + + public MaxRetriesOverride(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } + private final class ExponentialBackoff { private final int maxNumRetries; @@ -66,14 +229,14 @@ private final class ExponentialBackoff { this.maxNumRetries = maxNumRetries; } - public Optional nextBackoff() { - retryNumber += 1; - if (retryNumber > maxNumRetries) { + public Optional nextBackoff(Response response) { + if (retryNumber >= maxNumRetries) { return Optional.empty(); } - int upperBound = (int) Math.pow(2, retryNumber); - return Optional.of(ONE_SECOND.multipliedBy(random.nextInt(upperBound))); + Duration delay = getRetryDelayFromHeaders(response, retryNumber); + retryNumber += 1; + return Optional.of(delay); } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/Rfc2822DateTimeDeserializer.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/Rfc2822DateTimeDeserializer.java new file mode 100644 index 00000000..3a826210 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/Rfc2822DateTimeDeserializer.java @@ -0,0 +1,25 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import java.io.IOException; +import java.time.OffsetDateTime; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +/** + * Custom deserializer that handles converting RFC 2822 (RFC 1123) dates into {@link OffsetDateTime} objects. + * This is used for fields with format "date-time-rfc-2822", such as Twilio's dateCreated, dateSent, dateUpdated. + */ +public class Rfc2822DateTimeDeserializer extends JsonDeserializer { + + @Override + public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { + String raw = parser.getValueAsString(); + return ZonedDateTime.parse(raw, DateTimeFormatter.RFC_1123_DATE_TIME).toOffsetDateTime(); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEvent.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEvent.java new file mode 100644 index 00000000..9ab823d5 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEvent.java @@ -0,0 +1,114 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; +import java.util.Optional; + +/** + * Represents a Server-Sent Event with all standard fields. + * Used for event-level discrimination where the discriminator is at the SSE envelope level. + * + * @param The type of the data field + */ +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonIgnoreProperties(ignoreUnknown = true) +public final class SseEvent { + private final String event; + private final T data; + private final String id; + private final Long retry; + + private SseEvent(String event, T data, String id, Long retry) { + this.event = event; + this.data = data; + this.id = id; + this.retry = retry; + } + + @JsonProperty("event") + public Optional getEvent() { + return Optional.ofNullable(event); + } + + @JsonProperty("data") + public T getData() { + return data; + } + + @JsonProperty("id") + public Optional getId() { + return Optional.ofNullable(id); + } + + @JsonProperty("retry") + public Optional getRetry() { + return Optional.ofNullable(retry); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SseEvent sseEvent = (SseEvent) o; + return Objects.equals(event, sseEvent.event) + && Objects.equals(data, sseEvent.data) + && Objects.equals(id, sseEvent.id) + && Objects.equals(retry, sseEvent.retry); + } + + @Override + public int hashCode() { + return Objects.hash(event, data, id, retry); + } + + @Override + public String toString() { + return "SseEvent{" + "event='" + + event + '\'' + ", data=" + + data + ", id='" + + id + '\'' + ", retry=" + + retry + '}'; + } + + public static Builder builder() { + return new Builder<>(); + } + + public static final class Builder { + private String event; + private T data; + private String id; + private Long retry; + + private Builder() {} + + public Builder event(String event) { + this.event = event; + return this; + } + + public Builder data(T data) { + this.data = data; + return this; + } + + public Builder id(String id) { + this.id = id; + return this; + } + + public Builder retry(Long retry) { + this.retry = retry; + return this; + } + + public SseEvent build() { + return new SseEvent<>(event, data, id, retry); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEventParser.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEventParser.java new file mode 100644 index 00000000..ce50f86b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEventParser.java @@ -0,0 +1,228 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.core.type.TypeReference; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +/** + * Utility class for parsing Server-Sent Events with support for discriminated unions. + *

+ * Handles two discrimination patterns: + *

    + *
  1. Data-level discrimination: The discriminator (e.g., 'type') is inside the JSON data payload. + * Jackson's polymorphic deserialization handles this automatically.
  2. + *
  3. Event-level discrimination: The discriminator (e.g., 'event') is at the SSE envelope level. + * This requires constructing the full SSE envelope for Jackson to process.
  4. + *
+ */ +public final class SseEventParser { + + private static final Set SSE_ENVELOPE_FIELDS = new HashSet<>(Arrays.asList("event", "data", "id", "retry")); + + private SseEventParser() { + // Utility class + } + + /** + * Parse an SSE event using event-level discrimination. + *

+ * Constructs the full SSE envelope object with event, data, id, and retry fields, + * then deserializes it to the target union type. + * + * @param eventType The SSE event type (from event: field) + * @param data The SSE data content (from data: field) + * @param id The SSE event ID (from id: field), may be null + * @param retry The SSE retry value (from retry: field), may be null + * @param unionClass The target union class + * @param discriminatorProperty The property name used for discrimination (e.g., "event") + * @param The target type + * @return The deserialized object + */ + public static T parseEventLevelUnion( + String eventType, String data, String id, Long retry, Class unionClass, String discriminatorProperty) { + try { + // Determine if data should be parsed as JSON based on the variant's expected type + Object parsedData = parseDataForVariant(eventType, data, unionClass, discriminatorProperty); + + // Construct the SSE envelope object + Map envelope = new HashMap<>(); + envelope.put(discriminatorProperty, eventType); + envelope.put("data", parsedData); + if (id != null) { + envelope.put("id", id); + } + if (retry != null) { + envelope.put("retry", retry); + } + + // Serialize to JSON and deserialize to target type + String envelopeJson = ObjectMappers.JSON_MAPPER.writeValueAsString(envelope); + return ObjectMappers.JSON_MAPPER.readValue(envelopeJson, unionClass); + } catch (Exception e) { + throw new RuntimeException("Failed to parse SSE event with event-level discrimination", e); + } + } + + /** + * Parse an SSE event using data-level discrimination. + *

+ * Simply parses the data field as JSON and deserializes it to the target type. + * Jackson's polymorphic deserialization handles the discrimination automatically. + * + * @param data The SSE data content (from data: field) + * @param valueType The target type + * @param The target type + * @return The deserialized object + */ + public static T parseDataLevelUnion(String data, Class valueType) { + try { + return ObjectMappers.JSON_MAPPER.readValue(data, valueType); + } catch (Exception e) { + throw new RuntimeException("Failed to parse SSE data with data-level discrimination", e); + } + } + + /** + * Determines if the given discriminator property indicates event-level discrimination. + * Event-level discrimination occurs when the discriminator is an SSE envelope field. + * + * @param discriminatorProperty The discriminator property name + * @return true if event-level discrimination, false otherwise + */ + public static boolean isEventLevelDiscrimination(String discriminatorProperty) { + return SSE_ENVELOPE_FIELDS.contains(discriminatorProperty); + } + + /** + * Attempts to find the discriminator property from the union class's Jackson annotations. + * + * @param unionClass The union class to inspect + * @return The discriminator property name, or empty if not found + */ + public static Optional findDiscriminatorProperty(Class unionClass) { + try { + // Look for JsonTypeInfo on the class itself + JsonTypeInfo typeInfo = unionClass.getAnnotation(JsonTypeInfo.class); + if (typeInfo != null && !typeInfo.property().isEmpty()) { + return Optional.of(typeInfo.property()); + } + + // Look for inner Value interface with JsonTypeInfo + for (Class innerClass : unionClass.getDeclaredClasses()) { + typeInfo = innerClass.getAnnotation(JsonTypeInfo.class); + if (typeInfo != null && !typeInfo.property().isEmpty()) { + return Optional.of(typeInfo.property()); + } + } + } catch (Exception e) { + // Ignore reflection errors + } + return Optional.empty(); + } + + /** + * Parse the data field based on what the matching variant expects. + * If the variant expects a String for its data field, returns the raw string. + * Otherwise, parses the data as JSON. + */ + private static Object parseDataForVariant( + String eventType, String data, Class unionClass, String discriminatorProperty) { + if (data == null || data.isEmpty()) { + return data; + } + + try { + // Try to find the variant class that matches this event type + Class variantClass = findVariantClass(unionClass, eventType, discriminatorProperty); + if (variantClass != null) { + // Check if the variant expects a String for the data field + Field dataField = findField(variantClass, "data"); + if (dataField != null && String.class.equals(dataField.getType())) { + // Variant expects String - return raw data + return data; + } + } + + // Try to parse as JSON + return ObjectMappers.JSON_MAPPER.readValue(data, new TypeReference>() {}); + } catch (Exception e) { + // If JSON parsing fails, return as string + return data; + } + } + + /** + * Find the variant class that matches the given discriminator value. + */ + private static Class findVariantClass( + Class unionClass, String discriminatorValue, String discriminatorProperty) { + try { + // Look for JsonSubTypes annotation + JsonSubTypes subTypes = findJsonSubTypes(unionClass); + if (subTypes == null) { + return null; + } + + for (JsonSubTypes.Type subType : subTypes.value()) { + JsonTypeName typeName = subType.value().getAnnotation(JsonTypeName.class); + if (typeName != null && typeName.value().equals(discriminatorValue)) { + return subType.value(); + } + // Also check the name attribute of @JsonSubTypes.Type + if (subType.name().equals(discriminatorValue)) { + return subType.value(); + } + } + } catch (Exception e) { + // Ignore reflection errors + } + return null; + } + + /** + * Find JsonSubTypes annotation on the class or its inner classes. + */ + private static JsonSubTypes findJsonSubTypes(Class unionClass) { + // Check the class itself + JsonSubTypes subTypes = unionClass.getAnnotation(JsonSubTypes.class); + if (subTypes != null) { + return subTypes; + } + + // Check inner classes (for Fern-style unions with inner Value interface) + for (Class innerClass : unionClass.getDeclaredClasses()) { + subTypes = innerClass.getAnnotation(JsonSubTypes.class); + if (subTypes != null) { + return subTypes; + } + } + return null; + } + + /** + * Find a field by name in a class, including private fields. + */ + private static Field findField(Class clazz, String fieldName) { + try { + return clazz.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + // Check superclass + Class superClass = clazz.getSuperclass(); + if (superClass != null && superClass != Object.class) { + return findField(superClass, fieldName); + } + return null; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/Stream.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/Stream.java index f037712a..3822aa81 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/Stream.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/Stream.java @@ -3,6 +3,8 @@ */ package com.skyflow.generated.rest.core; +import java.io.Closeable; +import java.io.IOException; import java.io.Reader; import java.util.Iterator; import java.util.NoSuchElementException; @@ -14,18 +16,30 @@ *

* {@code Stream} assumes that data is being pushed to the provided {@link Reader} asynchronously and utilizes a * {@code Scanner} to block during iteration if the next object is not available. + * Iterable stream for parsing JSON and Server-Sent Events (SSE) data. + * Supports both newline-delimited JSON and SSE with optional stream termination. * * @param The type of objects in the stream. */ -public final class Stream implements Iterable { - /** - * The {@link Class} of the objects in the stream. - */ +public final class Stream implements Iterable, Closeable { + + private static final String NEWLINE = "\n"; + private static final String DATA_PREFIX = "data:"; + + public enum StreamType { + JSON, + SSE, + SSE_EVENT_DISCRIMINATED + } + private final Class valueType; - /** - * The {@link Scanner} used for reading from the input stream and blocking when needed during iteration. - */ private final Scanner scanner; + private final StreamType streamType; + private final String messageTerminator; + private final String streamTerminator; + private final Reader sseReader; + private final String discriminatorProperty; + private boolean isClosed = false; /** * Constructs a new {@code Stream} with the specified value type, reader, and delimiter. @@ -35,8 +49,100 @@ public final class Stream implements Iterable { * @param delimiter The delimiter used to separate elements in the stream. */ public Stream(Class valueType, Reader reader, String delimiter) { + this.valueType = valueType; this.scanner = new Scanner(reader).useDelimiter(delimiter); + this.streamType = StreamType.JSON; + this.messageTerminator = delimiter; + this.streamTerminator = null; + this.sseReader = null; + this.discriminatorProperty = null; + } + + private Stream(Class valueType, StreamType type, Reader reader, String terminator) { + this(valueType, type, reader, terminator, null); + } + + private Stream( + Class valueType, StreamType type, Reader reader, String terminator, String discriminatorProperty) { this.valueType = valueType; + this.streamType = type; + this.discriminatorProperty = discriminatorProperty; + if (type == StreamType.JSON) { + this.scanner = new Scanner(reader).useDelimiter(terminator); + this.messageTerminator = terminator; + this.streamTerminator = null; + this.sseReader = null; + } else { + this.scanner = null; + this.messageTerminator = NEWLINE; + this.streamTerminator = terminator; + this.sseReader = reader; + } + } + + public static Stream fromJson(Class valueType, Reader reader, String delimiter) { + return new Stream<>(valueType, reader, delimiter); + } + + public static Stream fromJson(Class valueType, Reader reader) { + return new Stream<>(valueType, reader, NEWLINE); + } + + public static Stream fromSse(Class valueType, Reader sseReader) { + return new Stream<>(valueType, StreamType.SSE, sseReader, null); + } + + public static Stream fromSse(Class valueType, Reader sseReader, String streamTerminator) { + return new Stream<>(valueType, StreamType.SSE, sseReader, streamTerminator); + } + + /** + * Creates a stream from SSE data with event-level discrimination support. + * Use this when the SSE payload is a discriminated union where the discriminator + * is an SSE envelope field (e.g., 'event'). + * + * @param valueType The class of the objects in the stream. + * @param sseReader The reader that provides the SSE data. + * @param discriminatorProperty The property name used for discrimination (e.g., "event"). + * @param The type of objects in the stream. + * @return A new Stream instance configured for SSE with event-level discrimination. + */ + public static Stream fromSseWithEventDiscrimination( + Class valueType, Reader sseReader, String discriminatorProperty) { + return new Stream<>(valueType, StreamType.SSE_EVENT_DISCRIMINATED, sseReader, null, discriminatorProperty); + } + + /** + * Creates a stream from SSE data with event-level discrimination support and a stream terminator. + * + * @param valueType The class of the objects in the stream. + * @param sseReader The reader that provides the SSE data. + * @param discriminatorProperty The property name used for discrimination (e.g., "event"). + * @param streamTerminator The terminator string that signals end of stream (e.g., "[DONE]"). + * @param The type of objects in the stream. + * @return A new Stream instance configured for SSE with event-level discrimination. + */ + public static Stream fromSseWithEventDiscrimination( + Class valueType, Reader sseReader, String discriminatorProperty, String streamTerminator) { + return new Stream<>( + valueType, StreamType.SSE_EVENT_DISCRIMINATED, sseReader, streamTerminator, discriminatorProperty); + } + + @Override + public void close() throws IOException { + if (!isClosed) { + isClosed = true; + if (scanner != null) { + scanner.close(); + } + if (sseReader != null) { + sseReader.close(); + } + } + } + + private boolean isStreamClosed() { + return isClosed; } /** @@ -47,51 +153,361 @@ public Stream(Class valueType, Reader reader, String delimiter) { */ @Override public Iterator iterator() { - return new Iterator() { - /** - * Returns {@code true} if there are more elements in the stream. - *

- * Will block and wait for input if the stream has not ended and the next object is not yet available. - * - * @return {@code true} if there are more elements, {@code false} otherwise. - */ - @Override - public boolean hasNext() { - return scanner.hasNext(); - } - - /** - * Returns the next element in the stream. - *

- * Will block and wait for input if the stream has not ended and the next object is not yet available. - * - * @return The next element in the stream. - * @throws NoSuchElementException If there are no more elements in the stream. - */ - @Override - public T next() { - if (!scanner.hasNext()) { - throw new NoSuchElementException(); - } else { + switch (streamType) { + case SSE: + return new SSEIterator(); + case SSE_EVENT_DISCRIMINATED: + return new SSEEventDiscriminatedIterator(); + case JSON: + default: + return new JsonIterator(); + } + } + + private final class JsonIterator implements Iterator { + + /** + * Returns {@code true} if there are more elements in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return {@code true} if there are more elements, {@code false} otherwise. + */ + @Override + public boolean hasNext() { + if (isStreamClosed()) { + return false; + } + return scanner.hasNext(); + } + + /** + * Returns the next element in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return The next element in the stream. + * @throws NoSuchElementException If there are no more elements in the stream. + */ + @Override + public T next() { + if (isStreamClosed()) { + throw new NoSuchElementException("Stream is closed"); + } + + if (!scanner.hasNext()) { + throw new NoSuchElementException(); + } else { + try { + T parsedResponse = + ObjectMappers.JSON_MAPPER.readValue(scanner.next().trim(), valueType); + return parsedResponse; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + } + + private final class SSEIterator implements Iterator { + private Scanner sseScanner; + private T nextItem; + private boolean hasNextItem = false; + private boolean endOfStream = false; + private StringBuilder eventDataBuffer = new StringBuilder(); + private String currentEventType = null; + + private SSEIterator() { + if (sseReader != null && !isStreamClosed()) { + this.sseScanner = new Scanner(sseReader); + } else { + this.endOfStream = true; + } + } + + @Override + public boolean hasNext() { + if (isStreamClosed() || endOfStream) { + return false; + } + + if (hasNextItem) { + return true; + } + + return readNextMessage(); + } + + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException("No more elements in stream"); + } + + T result = nextItem; + nextItem = null; + hasNextItem = false; + return result; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + private boolean readNextMessage() { + if (sseScanner == null || isStreamClosed()) { + endOfStream = true; + return false; + } + + try { + while (sseScanner.hasNextLine()) { + String line = sseScanner.nextLine(); + + if (line.trim().isEmpty()) { + if (eventDataBuffer.length() > 0) { + try { + nextItem = ObjectMappers.JSON_MAPPER.readValue(eventDataBuffer.toString(), valueType); + hasNextItem = true; + eventDataBuffer.setLength(0); + currentEventType = null; + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse SSE event: " + parseEx.getMessage()); + eventDataBuffer.setLength(0); + currentEventType = null; + continue; + } + } + continue; + } + + if (line.startsWith(DATA_PREFIX)) { + String dataContent = line.substring(DATA_PREFIX.length()); + if (dataContent.startsWith(" ")) { + dataContent = dataContent.substring(1); + } + + if (eventDataBuffer.length() == 0 + && streamTerminator != null + && dataContent.trim().equals(streamTerminator)) { + endOfStream = true; + return false; + } + + if (eventDataBuffer.length() > 0) { + eventDataBuffer.append('\n'); + } + eventDataBuffer.append(dataContent); + } else if (line.startsWith("event:")) { + String eventValue = line.length() > 6 ? line.substring(6) : ""; + if (eventValue.startsWith(" ")) { + eventValue = eventValue.substring(1); + } + currentEventType = eventValue; + } else if (line.startsWith("id:")) { + // Event ID field (ignored) + } else if (line.startsWith("retry:")) { + // Retry field (ignored) + } else if (line.startsWith(":")) { + // Comment line (ignored) + } + } + + if (eventDataBuffer.length() > 0) { try { - T parsedResponse = ObjectMappers.JSON_MAPPER.readValue( - scanner.next().trim(), valueType); - return parsedResponse; - } catch (Exception e) { - throw new RuntimeException(e); + nextItem = ObjectMappers.JSON_MAPPER.readValue(eventDataBuffer.toString(), valueType); + hasNextItem = true; + eventDataBuffer.setLength(0); + currentEventType = null; + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse final SSE event: " + parseEx.getMessage()); + eventDataBuffer.setLength(0); + currentEventType = null; } } + + endOfStream = true; + return false; + + } catch (Exception e) { + System.err.println("Failed to parse SSE stream: " + e.getMessage()); + endOfStream = true; + return false; + } + } + } + + /** + * Iterator for SSE streams with event-level discrimination. + * Uses SseEventParser to construct the full SSE envelope for Jackson deserialization. + */ + private final class SSEEventDiscriminatedIterator implements Iterator { + private Scanner sseScanner; + private T nextItem; + private boolean hasNextItem = false; + private boolean endOfStream = false; + private StringBuilder eventDataBuffer = new StringBuilder(); + private String currentEventType = null; + private String currentEventId = null; + private Long currentRetry = null; + + private SSEEventDiscriminatedIterator() { + if (sseReader != null && !isStreamClosed()) { + this.sseScanner = new Scanner(sseReader); + } else { + this.endOfStream = true; + } + } + + @Override + public boolean hasNext() { + if (isStreamClosed() || endOfStream) { + return false; } - /** - * Removing elements from {@code Stream} is not supported. - * - * @throws UnsupportedOperationException Always, as removal is not supported. - */ - @Override - public void remove() { - throw new UnsupportedOperationException(); + if (hasNextItem) { + return true; + } + + return readNextMessage(); + } + + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException("No more elements in stream"); + } + + T result = nextItem; + nextItem = null; + hasNextItem = false; + return result; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + private boolean readNextMessage() { + if (sseScanner == null || isStreamClosed()) { + endOfStream = true; + return false; + } + + try { + while (sseScanner.hasNextLine()) { + String line = sseScanner.nextLine(); + + if (line.trim().isEmpty()) { + if (eventDataBuffer.length() > 0 || currentEventType != null) { + try { + // Use SseEventParser for event-level discrimination + nextItem = SseEventParser.parseEventLevelUnion( + currentEventType, + eventDataBuffer.toString(), + currentEventId, + currentRetry, + valueType, + discriminatorProperty); + hasNextItem = true; + resetEventState(); + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse SSE event: " + parseEx.getMessage()); + resetEventState(); + continue; + } + } + continue; + } + + if (line.startsWith(DATA_PREFIX)) { + String dataContent = line.substring(DATA_PREFIX.length()); + if (dataContent.startsWith(" ")) { + dataContent = dataContent.substring(1); + } + + if (eventDataBuffer.length() == 0 + && streamTerminator != null + && dataContent.trim().equals(streamTerminator)) { + endOfStream = true; + return false; + } + + if (eventDataBuffer.length() > 0) { + eventDataBuffer.append('\n'); + } + eventDataBuffer.append(dataContent); + } else if (line.startsWith("event:")) { + String eventValue = line.length() > 6 ? line.substring(6) : ""; + if (eventValue.startsWith(" ")) { + eventValue = eventValue.substring(1); + } + currentEventType = eventValue; + } else if (line.startsWith("id:")) { + String idValue = line.length() > 3 ? line.substring(3) : ""; + if (idValue.startsWith(" ")) { + idValue = idValue.substring(1); + } + currentEventId = idValue; + } else if (line.startsWith("retry:")) { + String retryValue = line.length() > 6 ? line.substring(6) : ""; + if (retryValue.startsWith(" ")) { + retryValue = retryValue.substring(1); + } + try { + currentRetry = Long.parseLong(retryValue.trim()); + } catch (NumberFormatException e) { + // Ignore invalid retry values + } + } else if (line.startsWith(":")) { + // Comment line (ignored) + } + } + + // Handle any remaining buffered data at end of stream + if (eventDataBuffer.length() > 0 || currentEventType != null) { + try { + nextItem = SseEventParser.parseEventLevelUnion( + currentEventType, + eventDataBuffer.toString(), + currentEventId, + currentRetry, + valueType, + discriminatorProperty); + hasNextItem = true; + resetEventState(); + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse final SSE event: " + parseEx.getMessage()); + resetEventState(); + } + } + + endOfStream = true; + return false; + + } catch (Exception e) { + System.err.println("Failed to parse SSE stream: " + e.getMessage()); + endOfStream = true; + return false; } - }; + } + + private void resetEventState() { + eventDataBuffer.setLength(0); + currentEventType = null; + currentEventId = null; + currentRetry = null; + } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/WrappedAlias.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/WrappedAlias.java new file mode 100644 index 00000000..352c364e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/WrappedAlias.java @@ -0,0 +1,8 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +public interface WrappedAlias { + Object get(); +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java index 80ae5e7c..9f8ce586 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java @@ -4,20 +4,21 @@ package com.skyflow.generated.rest.errors; import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; import okhttp3.Response; public final class BadRequestError extends ApiClientApiException { /** * The body of the response that triggered the exception. */ - private final Object body; + private final ErrorResponse body; - public BadRequestError(Object body) { + public BadRequestError(ErrorResponse body) { super("BadRequestError", 400, body); this.body = body; } - public BadRequestError(Object body, Response rawResponse) { + public BadRequestError(ErrorResponse body, Response rawResponse) { super("BadRequestError", 400, body, rawResponse); this.body = body; } @@ -25,8 +26,8 @@ public BadRequestError(Object body, Response rawResponse) { /** * @return the body */ - @Override - public Object body() { + @java.lang.Override + public ErrorResponse body() { return this.body; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/ForbiddenError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/ForbiddenError.java new file mode 100644 index 00000000..f8eb18ff --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/ForbiddenError.java @@ -0,0 +1,33 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.errors; + +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; +import okhttp3.Response; + +public final class ForbiddenError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final ErrorResponse body; + + public ForbiddenError(ErrorResponse body) { + super("ForbiddenError", 403, body); + this.body = body; + } + + public ForbiddenError(ErrorResponse body, Response rawResponse) { + super("ForbiddenError", 403, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @java.lang.Override + public ErrorResponse body() { + return this.body; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java index ffeed9d7..d29f2b82 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java @@ -26,7 +26,7 @@ public InternalServerError(ErrorResponse body, Response rawResponse) { /** * @return the body */ - @Override + @java.lang.Override public ErrorResponse body() { return this.body; } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java index 1d0a6ad0..f0cdf5b0 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java @@ -4,20 +4,21 @@ package com.skyflow.generated.rest.errors; import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; import okhttp3.Response; public final class NotFoundError extends ApiClientApiException { /** * The body of the response that triggered the exception. */ - private final Object body; + private final ErrorResponse body; - public NotFoundError(Object body) { + public NotFoundError(ErrorResponse body) { super("NotFoundError", 404, body); this.body = body; } - public NotFoundError(Object body, Response rawResponse) { + public NotFoundError(ErrorResponse body, Response rawResponse) { super("NotFoundError", 404, body, rawResponse); this.body = body; } @@ -25,8 +26,8 @@ public NotFoundError(Object body, Response rawResponse) { /** * @return the body */ - @Override - public Object body() { + @java.lang.Override + public ErrorResponse body() { return this.body; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/TooManyRequestsError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/TooManyRequestsError.java new file mode 100644 index 00000000..e49ef7ef --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/TooManyRequestsError.java @@ -0,0 +1,33 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.errors; + +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; +import okhttp3.Response; + +public final class TooManyRequestsError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final ErrorResponse body; + + public TooManyRequestsError(ErrorResponse body) { + super("TooManyRequestsError", 429, body); + this.body = body; + } + + public TooManyRequestsError(ErrorResponse body, Response rawResponse) { + super("TooManyRequestsError", 429, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @java.lang.Override + public ErrorResponse body() { + return this.body; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java index 3bc254bc..1035b7f0 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java @@ -4,20 +4,21 @@ package com.skyflow.generated.rest.errors; import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; import okhttp3.Response; public final class UnauthorizedError extends ApiClientApiException { /** * The body of the response that triggered the exception. */ - private final Object body; + private final ErrorResponse body; - public UnauthorizedError(Object body) { + public UnauthorizedError(ErrorResponse body) { super("UnauthorizedError", 401, body); this.body = body; } - public UnauthorizedError(Object body, Response rawResponse) { + public UnauthorizedError(ErrorResponse body, Response rawResponse) { super("UnauthorizedError", 401, body, rawResponse); this.body = body; } @@ -25,8 +26,8 @@ public UnauthorizedError(Object body, Response rawResponse) { /** * @return the body */ - @Override - public Object body() { + @java.lang.Override + public ErrorResponse body() { return this.body; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/requests/PatchV2VaultsIdRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/requests/PatchV2VaultsIdRequest.java new file mode 100644 index 00000000..083579b6 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/requests/PatchV2VaultsIdRequest.java @@ -0,0 +1,69 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = PatchV2VaultsIdRequest.Builder.class) +public final class PatchV2VaultsIdRequest { + private final Map additionalProperties; + + private PatchV2VaultsIdRequest(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof PatchV2VaultsIdRequest; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(PatchV2VaultsIdRequest other) { + return this; + } + + public PatchV2VaultsIdRequest build() { + return new PatchV2VaultsIdRequest(additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java deleted file mode 100644 index 7e2719f2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; -import com.skyflow.generated.rest.types.V1AuditResponse; - -import java.util.concurrent.CompletableFuture; - -public class AsyncAuditClient { - protected final ClientOptions clientOptions; - - private final AsyncRawAuditClient rawClient; - - public AsyncAuditClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new AsyncRawAuditClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public AsyncRawAuditClient withRawResponse() { - return this.rawClient; - } - - /** - * Lists audit events that match query parameters. - */ - public CompletableFuture auditServiceListAuditEvents(AuditServiceListAuditEventsRequest request) { - return this.rawClient.auditServiceListAuditEvents(request).thenApply(response -> response.body()); - } - - /** - * Lists audit events that match query parameters. - */ - public CompletableFuture auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request, RequestOptions requestOptions) { - return this.rawClient - .auditServiceListAuditEvents(request, requestOptions) - .thenApply(response -> response.body()); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java deleted file mode 100644 index e1516eaf..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java +++ /dev/null @@ -1,284 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; -import com.skyflow.generated.rest.types.V1AuditResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; - -public class AsyncRawAuditClient { - protected final ClientOptions clientOptions; - - public AsyncRawAuditClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * Lists audit events that match query parameters. - */ - public CompletableFuture> auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request) { - return auditServiceListAuditEvents(request, null); - } - - /** - * Lists audit events that match query parameters. - */ - public CompletableFuture> auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request, RequestOptions requestOptions) { - HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/audit/events"); - if (request.getFilterOpsContextChangeId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.changeID", - request.getFilterOpsContextChangeId().get(), - false); - } - if (request.getFilterOpsContextRequestId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.requestID", - request.getFilterOpsContextRequestId().get(), - false); - } - if (request.getFilterOpsContextTraceId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.traceID", - request.getFilterOpsContextTraceId().get(), - false); - } - if (request.getFilterOpsContextSessionId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.sessionID", - request.getFilterOpsContextSessionId().get(), - false); - } - if (request.getFilterOpsContextActor().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.actor", - request.getFilterOpsContextActor().get(), - false); - } - if (request.getFilterOpsContextActorType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.actorType", - request.getFilterOpsContextActorType().get(), - false); - } - if (request.getFilterOpsContextAccessType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.accessType", - request.getFilterOpsContextAccessType().get(), - false); - } - if (request.getFilterOpsContextIpAddress().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.ipAddress", - request.getFilterOpsContextIpAddress().get(), - false); - } - if (request.getFilterOpsContextOrigin().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.origin", - request.getFilterOpsContextOrigin().get(), - false); - } - if (request.getFilterOpsContextAuthMode().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.authMode", - request.getFilterOpsContextAuthMode().get(), - false); - } - if (request.getFilterOpsContextJwtId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.jwtID", - request.getFilterOpsContextJwtId().get(), - false); - } - if (request.getFilterOpsContextBearerTokenContextId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.bearerTokenContextID", - request.getFilterOpsContextBearerTokenContextId().get(), - false); - } - if (request.getFilterOpsParentAccountId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.parentAccountID", - request.getFilterOpsParentAccountId().get(), - false); - } - QueryStringMapper.addQueryParameter(httpUrl, "filterOps.accountID", request.getFilterOpsAccountId(), false); - if (request.getFilterOpsWorkspaceId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.workspaceID", - request.getFilterOpsWorkspaceId().get(), - false); - } - if (request.getFilterOpsVaultId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.vaultID", request.getFilterOpsVaultId().get(), false); - } - if (request.getFilterOpsResourceIDs().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.resourceIDs", - request.getFilterOpsResourceIDs().get(), - false); - } - if (request.getFilterOpsActionType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.actionType", - request.getFilterOpsActionType().get(), - false); - } - if (request.getFilterOpsResourceType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.resourceType", - request.getFilterOpsResourceType().get(), - false); - } - if (request.getFilterOpsTags().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.tags", request.getFilterOpsTags().get(), false); - } - if (request.getFilterOpsResponseCode().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.responseCode", - request.getFilterOpsResponseCode().get(), - false); - } - if (request.getFilterOpsStartTime().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.startTime", - request.getFilterOpsStartTime().get(), - false); - } - if (request.getFilterOpsEndTime().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.endTime", request.getFilterOpsEndTime().get(), false); - } - if (request.getFilterOpsApiName().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.apiName", request.getFilterOpsApiName().get(), false); - } - if (request.getFilterOpsResponseMessage().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.responseMessage", - request.getFilterOpsResponseMessage().get(), - false); - } - if (request.getFilterOpsHttpMethod().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.httpMethod", - request.getFilterOpsHttpMethod().get(), - false); - } - if (request.getFilterOpsHttpUri().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.httpURI", request.getFilterOpsHttpUri().get(), false); - } - if (request.getSortOpsSortBy().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "sortOps.sortBy", request.getSortOpsSortBy().get(), false); - } - if (request.getSortOpsOrderBy().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "sortOps.orderBy", request.getSortOpsOrderBy().get(), false); - } - if (request.getAfterOpsTimestamp().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "afterOps.timestamp", - request.getAfterOpsTimestamp().get(), - false); - } - if (request.getAfterOpsChangeId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "afterOps.changeID", request.getAfterOpsChangeId().get(), false); - } - if (request.getLimit().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "limit", request.getLimit().get(), false); - } - if (request.getOffset().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "offset", request.getOffset().get(), false); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl.build()) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1AuditResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java deleted file mode 100644 index bac81431..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; -import com.skyflow.generated.rest.types.V1AuditResponse; - -public class AuditClient { - protected final ClientOptions clientOptions; - - private final RawAuditClient rawClient; - - public AuditClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new RawAuditClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public RawAuditClient withRawResponse() { - return this.rawClient; - } - - /** - * Lists audit events that match query parameters. - */ - public V1AuditResponse auditServiceListAuditEvents(AuditServiceListAuditEventsRequest request) { - return this.rawClient.auditServiceListAuditEvents(request).body(); - } - - /** - * Lists audit events that match query parameters. - */ - public V1AuditResponse auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request, RequestOptions requestOptions) { - return this.rawClient - .auditServiceListAuditEvents(request, requestOptions) - .body(); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java deleted file mode 100644 index 68cd5e3b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java +++ /dev/null @@ -1,267 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; -import com.skyflow.generated.rest.types.V1AuditResponse; -import okhttp3.*; - -import java.io.IOException; - -public class RawAuditClient { - protected final ClientOptions clientOptions; - - public RawAuditClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * Lists audit events that match query parameters. - */ - public ApiClientHttpResponse auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request) { - return auditServiceListAuditEvents(request, null); - } - - /** - * Lists audit events that match query parameters. - */ - public ApiClientHttpResponse auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request, RequestOptions requestOptions) { - HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/audit/events"); - if (request.getFilterOpsContextChangeId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.changeID", - request.getFilterOpsContextChangeId().get(), - false); - } - if (request.getFilterOpsContextRequestId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.requestID", - request.getFilterOpsContextRequestId().get(), - false); - } - if (request.getFilterOpsContextTraceId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.traceID", - request.getFilterOpsContextTraceId().get(), - false); - } - if (request.getFilterOpsContextSessionId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.sessionID", - request.getFilterOpsContextSessionId().get(), - false); - } - if (request.getFilterOpsContextActor().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.actor", - request.getFilterOpsContextActor().get(), - false); - } - if (request.getFilterOpsContextActorType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.actorType", - request.getFilterOpsContextActorType().get(), - false); - } - if (request.getFilterOpsContextAccessType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.accessType", - request.getFilterOpsContextAccessType().get(), - false); - } - if (request.getFilterOpsContextIpAddress().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.ipAddress", - request.getFilterOpsContextIpAddress().get(), - false); - } - if (request.getFilterOpsContextOrigin().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.origin", - request.getFilterOpsContextOrigin().get(), - false); - } - if (request.getFilterOpsContextAuthMode().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.authMode", - request.getFilterOpsContextAuthMode().get(), - false); - } - if (request.getFilterOpsContextJwtId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.jwtID", - request.getFilterOpsContextJwtId().get(), - false); - } - if (request.getFilterOpsContextBearerTokenContextId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.bearerTokenContextID", - request.getFilterOpsContextBearerTokenContextId().get(), - false); - } - if (request.getFilterOpsParentAccountId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.parentAccountID", - request.getFilterOpsParentAccountId().get(), - false); - } - QueryStringMapper.addQueryParameter(httpUrl, "filterOps.accountID", request.getFilterOpsAccountId(), false); - if (request.getFilterOpsWorkspaceId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.workspaceID", - request.getFilterOpsWorkspaceId().get(), - false); - } - if (request.getFilterOpsVaultId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.vaultID", request.getFilterOpsVaultId().get(), false); - } - if (request.getFilterOpsResourceIDs().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.resourceIDs", - request.getFilterOpsResourceIDs().get(), - false); - } - if (request.getFilterOpsActionType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.actionType", - request.getFilterOpsActionType().get(), - false); - } - if (request.getFilterOpsResourceType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.resourceType", - request.getFilterOpsResourceType().get(), - false); - } - if (request.getFilterOpsTags().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.tags", request.getFilterOpsTags().get(), false); - } - if (request.getFilterOpsResponseCode().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.responseCode", - request.getFilterOpsResponseCode().get(), - false); - } - if (request.getFilterOpsStartTime().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.startTime", - request.getFilterOpsStartTime().get(), - false); - } - if (request.getFilterOpsEndTime().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.endTime", request.getFilterOpsEndTime().get(), false); - } - if (request.getFilterOpsApiName().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.apiName", request.getFilterOpsApiName().get(), false); - } - if (request.getFilterOpsResponseMessage().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.responseMessage", - request.getFilterOpsResponseMessage().get(), - false); - } - if (request.getFilterOpsHttpMethod().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.httpMethod", - request.getFilterOpsHttpMethod().get(), - false); - } - if (request.getFilterOpsHttpUri().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.httpURI", request.getFilterOpsHttpUri().get(), false); - } - if (request.getSortOpsSortBy().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "sortOps.sortBy", request.getSortOpsSortBy().get(), false); - } - if (request.getSortOpsOrderBy().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "sortOps.orderBy", request.getSortOpsOrderBy().get(), false); - } - if (request.getAfterOpsTimestamp().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "afterOps.timestamp", - request.getAfterOpsTimestamp().get(), - false); - } - if (request.getAfterOpsChangeId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "afterOps.changeID", request.getAfterOpsChangeId().get(), false); - } - if (request.getLimit().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "limit", request.getLimit().get(), false); - } - if (request.getOffset().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "offset", request.getOffset().get(), false); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl.build()) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1AuditResponse.class), response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java deleted file mode 100644 index e9f8cf12..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java +++ /dev/null @@ -1,1579 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.audit.types.*; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AuditServiceListAuditEventsRequest.Builder.class) -public final class AuditServiceListAuditEventsRequest { - private final Optional filterOpsContextChangeId; - - private final Optional filterOpsContextRequestId; - - private final Optional filterOpsContextTraceId; - - private final Optional filterOpsContextSessionId; - - private final Optional filterOpsContextActor; - - private final Optional filterOpsContextActorType; - - private final Optional filterOpsContextAccessType; - - private final Optional filterOpsContextIpAddress; - - private final Optional filterOpsContextOrigin; - - private final Optional filterOpsContextAuthMode; - - private final Optional filterOpsContextJwtId; - - private final Optional filterOpsContextBearerTokenContextId; - - private final Optional filterOpsParentAccountId; - - private final String filterOpsAccountId; - - private final Optional filterOpsWorkspaceId; - - private final Optional filterOpsVaultId; - - private final Optional filterOpsResourceIDs; - - private final Optional filterOpsActionType; - - private final Optional filterOpsResourceType; - - private final Optional filterOpsTags; - - private final Optional filterOpsResponseCode; - - private final Optional filterOpsStartTime; - - private final Optional filterOpsEndTime; - - private final Optional filterOpsApiName; - - private final Optional filterOpsResponseMessage; - - private final Optional filterOpsHttpMethod; - - private final Optional filterOpsHttpUri; - - private final Optional sortOpsSortBy; - - private final Optional sortOpsOrderBy; - - private final Optional afterOpsTimestamp; - - private final Optional afterOpsChangeId; - - private final Optional limit; - - private final Optional offset; - - private final Map additionalProperties; - - private AuditServiceListAuditEventsRequest( - Optional filterOpsContextChangeId, - Optional filterOpsContextRequestId, - Optional filterOpsContextTraceId, - Optional filterOpsContextSessionId, - Optional filterOpsContextActor, - Optional filterOpsContextActorType, - Optional filterOpsContextAccessType, - Optional filterOpsContextIpAddress, - Optional filterOpsContextOrigin, - Optional filterOpsContextAuthMode, - Optional filterOpsContextJwtId, - Optional filterOpsContextBearerTokenContextId, - Optional filterOpsParentAccountId, - String filterOpsAccountId, - Optional filterOpsWorkspaceId, - Optional filterOpsVaultId, - Optional filterOpsResourceIDs, - Optional filterOpsActionType, - Optional filterOpsResourceType, - Optional filterOpsTags, - Optional filterOpsResponseCode, - Optional filterOpsStartTime, - Optional filterOpsEndTime, - Optional filterOpsApiName, - Optional filterOpsResponseMessage, - Optional filterOpsHttpMethod, - Optional filterOpsHttpUri, - Optional sortOpsSortBy, - Optional sortOpsOrderBy, - Optional afterOpsTimestamp, - Optional afterOpsChangeId, - Optional limit, - Optional offset, - Map additionalProperties) { - this.filterOpsContextChangeId = filterOpsContextChangeId; - this.filterOpsContextRequestId = filterOpsContextRequestId; - this.filterOpsContextTraceId = filterOpsContextTraceId; - this.filterOpsContextSessionId = filterOpsContextSessionId; - this.filterOpsContextActor = filterOpsContextActor; - this.filterOpsContextActorType = filterOpsContextActorType; - this.filterOpsContextAccessType = filterOpsContextAccessType; - this.filterOpsContextIpAddress = filterOpsContextIpAddress; - this.filterOpsContextOrigin = filterOpsContextOrigin; - this.filterOpsContextAuthMode = filterOpsContextAuthMode; - this.filterOpsContextJwtId = filterOpsContextJwtId; - this.filterOpsContextBearerTokenContextId = filterOpsContextBearerTokenContextId; - this.filterOpsParentAccountId = filterOpsParentAccountId; - this.filterOpsAccountId = filterOpsAccountId; - this.filterOpsWorkspaceId = filterOpsWorkspaceId; - this.filterOpsVaultId = filterOpsVaultId; - this.filterOpsResourceIDs = filterOpsResourceIDs; - this.filterOpsActionType = filterOpsActionType; - this.filterOpsResourceType = filterOpsResourceType; - this.filterOpsTags = filterOpsTags; - this.filterOpsResponseCode = filterOpsResponseCode; - this.filterOpsStartTime = filterOpsStartTime; - this.filterOpsEndTime = filterOpsEndTime; - this.filterOpsApiName = filterOpsApiName; - this.filterOpsResponseMessage = filterOpsResponseMessage; - this.filterOpsHttpMethod = filterOpsHttpMethod; - this.filterOpsHttpUri = filterOpsHttpUri; - this.sortOpsSortBy = sortOpsSortBy; - this.sortOpsOrderBy = sortOpsOrderBy; - this.afterOpsTimestamp = afterOpsTimestamp; - this.afterOpsChangeId = afterOpsChangeId; - this.limit = limit; - this.offset = offset; - this.additionalProperties = additionalProperties; - } - - /** - * @return ID for the audit event. - */ - @JsonProperty("filterOps.context.changeID") - public Optional getFilterOpsContextChangeId() { - return filterOpsContextChangeId; - } - - /** - * @return ID for the request that caused the event. - */ - @JsonProperty("filterOps.context.requestID") - public Optional getFilterOpsContextRequestId() { - return filterOpsContextRequestId; - } - - /** - * @return ID for the request set by the service that received the request. - */ - @JsonProperty("filterOps.context.traceID") - public Optional getFilterOpsContextTraceId() { - return filterOpsContextTraceId; - } - - /** - * @return ID for the session in which the request was sent. - */ - @JsonProperty("filterOps.context.sessionID") - public Optional getFilterOpsContextSessionId() { - return filterOpsContextSessionId; - } - - /** - * @return Member who sent the request. Depending on actorType, this may be a user ID or a service account ID. - */ - @JsonProperty("filterOps.context.actor") - public Optional getFilterOpsContextActor() { - return filterOpsContextActor; - } - - /** - * @return Type of member who sent the request. - */ - @JsonProperty("filterOps.context.actorType") - public Optional getFilterOpsContextActorType() { - return filterOpsContextActorType; - } - - /** - * @return Type of access for the request. - */ - @JsonProperty("filterOps.context.accessType") - public Optional getFilterOpsContextAccessType() { - return filterOpsContextAccessType; - } - - /** - * @return IP Address of the client that made the request. - */ - @JsonProperty("filterOps.context.ipAddress") - public Optional getFilterOpsContextIpAddress() { - return filterOpsContextIpAddress; - } - - /** - * @return HTTP Origin request header (including scheme, hostname, and port) of the request. - */ - @JsonProperty("filterOps.context.origin") - public Optional getFilterOpsContextOrigin() { - return filterOpsContextOrigin; - } - - /** - * @return Authentication mode the actor used. - */ - @JsonProperty("filterOps.context.authMode") - public Optional getFilterOpsContextAuthMode() { - return filterOpsContextAuthMode; - } - - /** - * @return ID of the JWT token. - */ - @JsonProperty("filterOps.context.jwtID") - public Optional getFilterOpsContextJwtId() { - return filterOpsContextJwtId; - } - - /** - * @return Embedded User Context. - */ - @JsonProperty("filterOps.context.bearerTokenContextID") - public Optional getFilterOpsContextBearerTokenContextId() { - return filterOpsContextBearerTokenContextId; - } - - /** - * @return Resources with the specified parent account ID. - */ - @JsonProperty("filterOps.parentAccountID") - public Optional getFilterOpsParentAccountId() { - return filterOpsParentAccountId; - } - - /** - * @return Resources with the specified account ID. - */ - @JsonProperty("filterOps.accountID") - public String getFilterOpsAccountId() { - return filterOpsAccountId; - } - - /** - * @return Resources with the specified workspace ID. - */ - @JsonProperty("filterOps.workspaceID") - public Optional getFilterOpsWorkspaceId() { - return filterOpsWorkspaceId; - } - - /** - * @return Resources with the specified vault ID. - */ - @JsonProperty("filterOps.vaultID") - public Optional getFilterOpsVaultId() { - return filterOpsVaultId; - } - - /** - * @return Resources with a specified ID. If a resource matches at least one ID, the associated event is returned. Format is a comma-separated list of "<resourceType>/<resourceID>". For example, "VAULT/12345, USER/67890". - */ - @JsonProperty("filterOps.resourceIDs") - public Optional getFilterOpsResourceIDs() { - return filterOpsResourceIDs; - } - - /** - * @return Events with the specified action type. - */ - @JsonProperty("filterOps.actionType") - public Optional getFilterOpsActionType() { - return filterOpsActionType; - } - - /** - * @return Resources with the specified type. - */ - @JsonProperty("filterOps.resourceType") - public Optional getFilterOpsResourceType() { - return filterOpsResourceType; - } - - /** - * @return Events with associated tags. If an event matches at least one tag, the event is returned. Comma-separated list. For example, "login, get". - */ - @JsonProperty("filterOps.tags") - public Optional getFilterOpsTags() { - return filterOpsTags; - } - - /** - * @return HTTP response code of the request. - */ - @JsonProperty("filterOps.responseCode") - public Optional getFilterOpsResponseCode() { - return filterOpsResponseCode; - } - - /** - * @return Start timestamp for the query, in SQL format. - */ - @JsonProperty("filterOps.startTime") - public Optional getFilterOpsStartTime() { - return filterOpsStartTime; - } - - /** - * @return End timestamp for the query, in SQL format. - */ - @JsonProperty("filterOps.endTime") - public Optional getFilterOpsEndTime() { - return filterOpsEndTime; - } - - /** - * @return Name of the API called in the request. - */ - @JsonProperty("filterOps.apiName") - public Optional getFilterOpsApiName() { - return filterOpsApiName; - } - - /** - * @return Response message of the request. - */ - @JsonProperty("filterOps.responseMessage") - public Optional getFilterOpsResponseMessage() { - return filterOpsResponseMessage; - } - - /** - * @return HTTP method of the request. - */ - @JsonProperty("filterOps.httpMethod") - public Optional getFilterOpsHttpMethod() { - return filterOpsHttpMethod; - } - - /** - * @return HTTP URI of the request. - */ - @JsonProperty("filterOps.httpURI") - public Optional getFilterOpsHttpUri() { - return filterOpsHttpUri; - } - - /** - * @return Fully-qualified field by which to sort results. Field names should be in camel case (for example, "capitalization.camelCase"). - */ - @JsonProperty("sortOps.sortBy") - public Optional getSortOpsSortBy() { - return sortOpsSortBy; - } - - /** - * @return Ascending or descending ordering of results. - */ - @JsonProperty("sortOps.orderBy") - public Optional getSortOpsOrderBy() { - return sortOpsOrderBy; - } - - /** - * @return Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank. - */ - @JsonProperty("afterOps.timestamp") - public Optional getAfterOpsTimestamp() { - return afterOpsTimestamp; - } - - /** - * @return Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank. - */ - @JsonProperty("afterOps.changeID") - public Optional getAfterOpsChangeId() { - return afterOpsChangeId; - } - - /** - * @return Number of results to return. - */ - @JsonProperty("limit") - public Optional getLimit() { - return limit; - } - - /** - * @return Record position at which to start returning results. - */ - @JsonProperty("offset") - public Optional getOffset() { - return offset; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof AuditServiceListAuditEventsRequest - && equalTo((AuditServiceListAuditEventsRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(AuditServiceListAuditEventsRequest other) { - return filterOpsContextChangeId.equals(other.filterOpsContextChangeId) - && filterOpsContextRequestId.equals(other.filterOpsContextRequestId) - && filterOpsContextTraceId.equals(other.filterOpsContextTraceId) - && filterOpsContextSessionId.equals(other.filterOpsContextSessionId) - && filterOpsContextActor.equals(other.filterOpsContextActor) - && filterOpsContextActorType.equals(other.filterOpsContextActorType) - && filterOpsContextAccessType.equals(other.filterOpsContextAccessType) - && filterOpsContextIpAddress.equals(other.filterOpsContextIpAddress) - && filterOpsContextOrigin.equals(other.filterOpsContextOrigin) - && filterOpsContextAuthMode.equals(other.filterOpsContextAuthMode) - && filterOpsContextJwtId.equals(other.filterOpsContextJwtId) - && filterOpsContextBearerTokenContextId.equals(other.filterOpsContextBearerTokenContextId) - && filterOpsParentAccountId.equals(other.filterOpsParentAccountId) - && filterOpsAccountId.equals(other.filterOpsAccountId) - && filterOpsWorkspaceId.equals(other.filterOpsWorkspaceId) - && filterOpsVaultId.equals(other.filterOpsVaultId) - && filterOpsResourceIDs.equals(other.filterOpsResourceIDs) - && filterOpsActionType.equals(other.filterOpsActionType) - && filterOpsResourceType.equals(other.filterOpsResourceType) - && filterOpsTags.equals(other.filterOpsTags) - && filterOpsResponseCode.equals(other.filterOpsResponseCode) - && filterOpsStartTime.equals(other.filterOpsStartTime) - && filterOpsEndTime.equals(other.filterOpsEndTime) - && filterOpsApiName.equals(other.filterOpsApiName) - && filterOpsResponseMessage.equals(other.filterOpsResponseMessage) - && filterOpsHttpMethod.equals(other.filterOpsHttpMethod) - && filterOpsHttpUri.equals(other.filterOpsHttpUri) - && sortOpsSortBy.equals(other.sortOpsSortBy) - && sortOpsOrderBy.equals(other.sortOpsOrderBy) - && afterOpsTimestamp.equals(other.afterOpsTimestamp) - && afterOpsChangeId.equals(other.afterOpsChangeId) - && limit.equals(other.limit) - && offset.equals(other.offset); - } - - @Override - public int hashCode() { - return Objects.hash( - this.filterOpsContextChangeId, - this.filterOpsContextRequestId, - this.filterOpsContextTraceId, - this.filterOpsContextSessionId, - this.filterOpsContextActor, - this.filterOpsContextActorType, - this.filterOpsContextAccessType, - this.filterOpsContextIpAddress, - this.filterOpsContextOrigin, - this.filterOpsContextAuthMode, - this.filterOpsContextJwtId, - this.filterOpsContextBearerTokenContextId, - this.filterOpsParentAccountId, - this.filterOpsAccountId, - this.filterOpsWorkspaceId, - this.filterOpsVaultId, - this.filterOpsResourceIDs, - this.filterOpsActionType, - this.filterOpsResourceType, - this.filterOpsTags, - this.filterOpsResponseCode, - this.filterOpsStartTime, - this.filterOpsEndTime, - this.filterOpsApiName, - this.filterOpsResponseMessage, - this.filterOpsHttpMethod, - this.filterOpsHttpUri, - this.sortOpsSortBy, - this.sortOpsOrderBy, - this.afterOpsTimestamp, - this.afterOpsChangeId, - this.limit, - this.offset); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FilterOpsAccountIdStage builder() { - return new Builder(); - } - - public interface FilterOpsAccountIdStage { - /** - * Resources with the specified account ID. - */ - _FinalStage filterOpsAccountId(@NotNull String filterOpsAccountId); - - Builder from(AuditServiceListAuditEventsRequest other); - } - - public interface _FinalStage { - AuditServiceListAuditEventsRequest build(); - - /** - *

ID for the audit event.

- */ - _FinalStage filterOpsContextChangeId(Optional filterOpsContextChangeId); - - _FinalStage filterOpsContextChangeId(String filterOpsContextChangeId); - - /** - *

ID for the request that caused the event.

- */ - _FinalStage filterOpsContextRequestId(Optional filterOpsContextRequestId); - - _FinalStage filterOpsContextRequestId(String filterOpsContextRequestId); - - /** - *

ID for the request set by the service that received the request.

- */ - _FinalStage filterOpsContextTraceId(Optional filterOpsContextTraceId); - - _FinalStage filterOpsContextTraceId(String filterOpsContextTraceId); - - /** - *

ID for the session in which the request was sent.

- */ - _FinalStage filterOpsContextSessionId(Optional filterOpsContextSessionId); - - _FinalStage filterOpsContextSessionId(String filterOpsContextSessionId); - - /** - *

Member who sent the request. Depending on actorType, this may be a user ID or a service account ID.

- */ - _FinalStage filterOpsContextActor(Optional filterOpsContextActor); - - _FinalStage filterOpsContextActor(String filterOpsContextActor); - - /** - *

Type of member who sent the request.

- */ - _FinalStage filterOpsContextActorType( - Optional filterOpsContextActorType); - - _FinalStage filterOpsContextActorType( - AuditServiceListAuditEventsRequestFilterOpsContextActorType filterOpsContextActorType); - - /** - *

Type of access for the request.

- */ - _FinalStage filterOpsContextAccessType( - Optional filterOpsContextAccessType); - - _FinalStage filterOpsContextAccessType( - AuditServiceListAuditEventsRequestFilterOpsContextAccessType filterOpsContextAccessType); - - /** - *

IP Address of the client that made the request.

- */ - _FinalStage filterOpsContextIpAddress(Optional filterOpsContextIpAddress); - - _FinalStage filterOpsContextIpAddress(String filterOpsContextIpAddress); - - /** - *

HTTP Origin request header (including scheme, hostname, and port) of the request.

- */ - _FinalStage filterOpsContextOrigin(Optional filterOpsContextOrigin); - - _FinalStage filterOpsContextOrigin(String filterOpsContextOrigin); - - /** - *

Authentication mode the actor used.

- */ - _FinalStage filterOpsContextAuthMode( - Optional filterOpsContextAuthMode); - - _FinalStage filterOpsContextAuthMode( - AuditServiceListAuditEventsRequestFilterOpsContextAuthMode filterOpsContextAuthMode); - - /** - *

ID of the JWT token.

- */ - _FinalStage filterOpsContextJwtId(Optional filterOpsContextJwtId); - - _FinalStage filterOpsContextJwtId(String filterOpsContextJwtId); - - /** - *

Embedded User Context.

- */ - _FinalStage filterOpsContextBearerTokenContextId(Optional filterOpsContextBearerTokenContextId); - - _FinalStage filterOpsContextBearerTokenContextId(String filterOpsContextBearerTokenContextId); - - /** - *

Resources with the specified parent account ID.

- */ - _FinalStage filterOpsParentAccountId(Optional filterOpsParentAccountId); - - _FinalStage filterOpsParentAccountId(String filterOpsParentAccountId); - - /** - *

Resources with the specified workspace ID.

- */ - _FinalStage filterOpsWorkspaceId(Optional filterOpsWorkspaceId); - - _FinalStage filterOpsWorkspaceId(String filterOpsWorkspaceId); - - /** - *

Resources with the specified vault ID.

- */ - _FinalStage filterOpsVaultId(Optional filterOpsVaultId); - - _FinalStage filterOpsVaultId(String filterOpsVaultId); - - /** - *

Resources with a specified ID. If a resource matches at least one ID, the associated event is returned. Format is a comma-separated list of "<resourceType>/<resourceID>". For example, "VAULT/12345, USER/67890".

- */ - _FinalStage filterOpsResourceIDs(Optional filterOpsResourceIDs); - - _FinalStage filterOpsResourceIDs(String filterOpsResourceIDs); - - /** - *

Events with the specified action type.

- */ - _FinalStage filterOpsActionType( - Optional filterOpsActionType); - - _FinalStage filterOpsActionType(AuditServiceListAuditEventsRequestFilterOpsActionType filterOpsActionType); - - /** - *

Resources with the specified type.

- */ - _FinalStage filterOpsResourceType( - Optional filterOpsResourceType); - - _FinalStage filterOpsResourceType( - AuditServiceListAuditEventsRequestFilterOpsResourceType filterOpsResourceType); - - /** - *

Events with associated tags. If an event matches at least one tag, the event is returned. Comma-separated list. For example, "login, get".

- */ - _FinalStage filterOpsTags(Optional filterOpsTags); - - _FinalStage filterOpsTags(String filterOpsTags); - - /** - *

HTTP response code of the request.

- */ - _FinalStage filterOpsResponseCode(Optional filterOpsResponseCode); - - _FinalStage filterOpsResponseCode(Integer filterOpsResponseCode); - - /** - *

Start timestamp for the query, in SQL format.

- */ - _FinalStage filterOpsStartTime(Optional filterOpsStartTime); - - _FinalStage filterOpsStartTime(String filterOpsStartTime); - - /** - *

End timestamp for the query, in SQL format.

- */ - _FinalStage filterOpsEndTime(Optional filterOpsEndTime); - - _FinalStage filterOpsEndTime(String filterOpsEndTime); - - /** - *

Name of the API called in the request.

- */ - _FinalStage filterOpsApiName(Optional filterOpsApiName); - - _FinalStage filterOpsApiName(String filterOpsApiName); - - /** - *

Response message of the request.

- */ - _FinalStage filterOpsResponseMessage(Optional filterOpsResponseMessage); - - _FinalStage filterOpsResponseMessage(String filterOpsResponseMessage); - - /** - *

HTTP method of the request.

- */ - _FinalStage filterOpsHttpMethod(Optional filterOpsHttpMethod); - - _FinalStage filterOpsHttpMethod(String filterOpsHttpMethod); - - /** - *

HTTP URI of the request.

- */ - _FinalStage filterOpsHttpUri(Optional filterOpsHttpUri); - - _FinalStage filterOpsHttpUri(String filterOpsHttpUri); - - /** - *

Fully-qualified field by which to sort results. Field names should be in camel case (for example, "capitalization.camelCase").

- */ - _FinalStage sortOpsSortBy(Optional sortOpsSortBy); - - _FinalStage sortOpsSortBy(String sortOpsSortBy); - - /** - *

Ascending or descending ordering of results.

- */ - _FinalStage sortOpsOrderBy(Optional sortOpsOrderBy); - - _FinalStage sortOpsOrderBy(AuditServiceListAuditEventsRequestSortOpsOrderBy sortOpsOrderBy); - - /** - *

Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- */ - _FinalStage afterOpsTimestamp(Optional afterOpsTimestamp); - - _FinalStage afterOpsTimestamp(String afterOpsTimestamp); - - /** - *

Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- */ - _FinalStage afterOpsChangeId(Optional afterOpsChangeId); - - _FinalStage afterOpsChangeId(String afterOpsChangeId); - - /** - *

Number of results to return.

- */ - _FinalStage limit(Optional limit); - - _FinalStage limit(Long limit); - - /** - *

Record position at which to start returning results.

- */ - _FinalStage offset(Optional offset); - - _FinalStage offset(Long offset); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FilterOpsAccountIdStage, _FinalStage { - private String filterOpsAccountId; - - private Optional offset = Optional.empty(); - - private Optional limit = Optional.empty(); - - private Optional afterOpsChangeId = Optional.empty(); - - private Optional afterOpsTimestamp = Optional.empty(); - - private Optional sortOpsOrderBy = Optional.empty(); - - private Optional sortOpsSortBy = Optional.empty(); - - private Optional filterOpsHttpUri = Optional.empty(); - - private Optional filterOpsHttpMethod = Optional.empty(); - - private Optional filterOpsResponseMessage = Optional.empty(); - - private Optional filterOpsApiName = Optional.empty(); - - private Optional filterOpsEndTime = Optional.empty(); - - private Optional filterOpsStartTime = Optional.empty(); - - private Optional filterOpsResponseCode = Optional.empty(); - - private Optional filterOpsTags = Optional.empty(); - - private Optional filterOpsResourceType = - Optional.empty(); - - private Optional filterOpsActionType = Optional.empty(); - - private Optional filterOpsResourceIDs = Optional.empty(); - - private Optional filterOpsVaultId = Optional.empty(); - - private Optional filterOpsWorkspaceId = Optional.empty(); - - private Optional filterOpsParentAccountId = Optional.empty(); - - private Optional filterOpsContextBearerTokenContextId = Optional.empty(); - - private Optional filterOpsContextJwtId = Optional.empty(); - - private Optional filterOpsContextAuthMode = - Optional.empty(); - - private Optional filterOpsContextOrigin = Optional.empty(); - - private Optional filterOpsContextIpAddress = Optional.empty(); - - private Optional filterOpsContextAccessType = - Optional.empty(); - - private Optional filterOpsContextActorType = - Optional.empty(); - - private Optional filterOpsContextActor = Optional.empty(); - - private Optional filterOpsContextSessionId = Optional.empty(); - - private Optional filterOpsContextTraceId = Optional.empty(); - - private Optional filterOpsContextRequestId = Optional.empty(); - - private Optional filterOpsContextChangeId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(AuditServiceListAuditEventsRequest other) { - filterOpsContextChangeId(other.getFilterOpsContextChangeId()); - filterOpsContextRequestId(other.getFilterOpsContextRequestId()); - filterOpsContextTraceId(other.getFilterOpsContextTraceId()); - filterOpsContextSessionId(other.getFilterOpsContextSessionId()); - filterOpsContextActor(other.getFilterOpsContextActor()); - filterOpsContextActorType(other.getFilterOpsContextActorType()); - filterOpsContextAccessType(other.getFilterOpsContextAccessType()); - filterOpsContextIpAddress(other.getFilterOpsContextIpAddress()); - filterOpsContextOrigin(other.getFilterOpsContextOrigin()); - filterOpsContextAuthMode(other.getFilterOpsContextAuthMode()); - filterOpsContextJwtId(other.getFilterOpsContextJwtId()); - filterOpsContextBearerTokenContextId(other.getFilterOpsContextBearerTokenContextId()); - filterOpsParentAccountId(other.getFilterOpsParentAccountId()); - filterOpsAccountId(other.getFilterOpsAccountId()); - filterOpsWorkspaceId(other.getFilterOpsWorkspaceId()); - filterOpsVaultId(other.getFilterOpsVaultId()); - filterOpsResourceIDs(other.getFilterOpsResourceIDs()); - filterOpsActionType(other.getFilterOpsActionType()); - filterOpsResourceType(other.getFilterOpsResourceType()); - filterOpsTags(other.getFilterOpsTags()); - filterOpsResponseCode(other.getFilterOpsResponseCode()); - filterOpsStartTime(other.getFilterOpsStartTime()); - filterOpsEndTime(other.getFilterOpsEndTime()); - filterOpsApiName(other.getFilterOpsApiName()); - filterOpsResponseMessage(other.getFilterOpsResponseMessage()); - filterOpsHttpMethod(other.getFilterOpsHttpMethod()); - filterOpsHttpUri(other.getFilterOpsHttpUri()); - sortOpsSortBy(other.getSortOpsSortBy()); - sortOpsOrderBy(other.getSortOpsOrderBy()); - afterOpsTimestamp(other.getAfterOpsTimestamp()); - afterOpsChangeId(other.getAfterOpsChangeId()); - limit(other.getLimit()); - offset(other.getOffset()); - return this; - } - - /** - * Resources with the specified account ID.

Resources with the specified account ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("filterOps.accountID") - public _FinalStage filterOpsAccountId(@NotNull String filterOpsAccountId) { - this.filterOpsAccountId = Objects.requireNonNull(filterOpsAccountId, "filterOpsAccountId must not be null"); - return this; - } - - /** - *

Record position at which to start returning results.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage offset(Long offset) { - this.offset = Optional.ofNullable(offset); - return this; - } - - /** - *

Record position at which to start returning results.

- */ - @Override - @JsonSetter(value = "offset", nulls = Nulls.SKIP) - public _FinalStage offset(Optional offset) { - this.offset = offset; - return this; - } - - /** - *

Number of results to return.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage limit(Long limit) { - this.limit = Optional.ofNullable(limit); - return this; - } - - /** - *

Number of results to return.

- */ - @Override - @JsonSetter(value = "limit", nulls = Nulls.SKIP) - public _FinalStage limit(Optional limit) { - this.limit = limit; - return this; - } - - /** - *

Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage afterOpsChangeId(String afterOpsChangeId) { - this.afterOpsChangeId = Optional.ofNullable(afterOpsChangeId); - return this; - } - - /** - *

Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- */ - @Override - @JsonSetter(value = "afterOps.changeID", nulls = Nulls.SKIP) - public _FinalStage afterOpsChangeId(Optional afterOpsChangeId) { - this.afterOpsChangeId = afterOpsChangeId; - return this; - } - - /** - *

Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage afterOpsTimestamp(String afterOpsTimestamp) { - this.afterOpsTimestamp = Optional.ofNullable(afterOpsTimestamp); - return this; - } - - /** - *

Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- */ - @Override - @JsonSetter(value = "afterOps.timestamp", nulls = Nulls.SKIP) - public _FinalStage afterOpsTimestamp(Optional afterOpsTimestamp) { - this.afterOpsTimestamp = afterOpsTimestamp; - return this; - } - - /** - *

Ascending or descending ordering of results.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage sortOpsOrderBy(AuditServiceListAuditEventsRequestSortOpsOrderBy sortOpsOrderBy) { - this.sortOpsOrderBy = Optional.ofNullable(sortOpsOrderBy); - return this; - } - - /** - *

Ascending or descending ordering of results.

- */ - @Override - @JsonSetter(value = "sortOps.orderBy", nulls = Nulls.SKIP) - public _FinalStage sortOpsOrderBy(Optional sortOpsOrderBy) { - this.sortOpsOrderBy = sortOpsOrderBy; - return this; - } - - /** - *

Fully-qualified field by which to sort results. Field names should be in camel case (for example, "capitalization.camelCase").

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage sortOpsSortBy(String sortOpsSortBy) { - this.sortOpsSortBy = Optional.ofNullable(sortOpsSortBy); - return this; - } - - /** - *

Fully-qualified field by which to sort results. Field names should be in camel case (for example, "capitalization.camelCase").

- */ - @Override - @JsonSetter(value = "sortOps.sortBy", nulls = Nulls.SKIP) - public _FinalStage sortOpsSortBy(Optional sortOpsSortBy) { - this.sortOpsSortBy = sortOpsSortBy; - return this; - } - - /** - *

HTTP URI of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsHttpUri(String filterOpsHttpUri) { - this.filterOpsHttpUri = Optional.ofNullable(filterOpsHttpUri); - return this; - } - - /** - *

HTTP URI of the request.

- */ - @Override - @JsonSetter(value = "filterOps.httpURI", nulls = Nulls.SKIP) - public _FinalStage filterOpsHttpUri(Optional filterOpsHttpUri) { - this.filterOpsHttpUri = filterOpsHttpUri; - return this; - } - - /** - *

HTTP method of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsHttpMethod(String filterOpsHttpMethod) { - this.filterOpsHttpMethod = Optional.ofNullable(filterOpsHttpMethod); - return this; - } - - /** - *

HTTP method of the request.

- */ - @Override - @JsonSetter(value = "filterOps.httpMethod", nulls = Nulls.SKIP) - public _FinalStage filterOpsHttpMethod(Optional filterOpsHttpMethod) { - this.filterOpsHttpMethod = filterOpsHttpMethod; - return this; - } - - /** - *

Response message of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsResponseMessage(String filterOpsResponseMessage) { - this.filterOpsResponseMessage = Optional.ofNullable(filterOpsResponseMessage); - return this; - } - - /** - *

Response message of the request.

- */ - @Override - @JsonSetter(value = "filterOps.responseMessage", nulls = Nulls.SKIP) - public _FinalStage filterOpsResponseMessage(Optional filterOpsResponseMessage) { - this.filterOpsResponseMessage = filterOpsResponseMessage; - return this; - } - - /** - *

Name of the API called in the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsApiName(String filterOpsApiName) { - this.filterOpsApiName = Optional.ofNullable(filterOpsApiName); - return this; - } - - /** - *

Name of the API called in the request.

- */ - @Override - @JsonSetter(value = "filterOps.apiName", nulls = Nulls.SKIP) - public _FinalStage filterOpsApiName(Optional filterOpsApiName) { - this.filterOpsApiName = filterOpsApiName; - return this; - } - - /** - *

End timestamp for the query, in SQL format.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsEndTime(String filterOpsEndTime) { - this.filterOpsEndTime = Optional.ofNullable(filterOpsEndTime); - return this; - } - - /** - *

End timestamp for the query, in SQL format.

- */ - @Override - @JsonSetter(value = "filterOps.endTime", nulls = Nulls.SKIP) - public _FinalStage filterOpsEndTime(Optional filterOpsEndTime) { - this.filterOpsEndTime = filterOpsEndTime; - return this; - } - - /** - *

Start timestamp for the query, in SQL format.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsStartTime(String filterOpsStartTime) { - this.filterOpsStartTime = Optional.ofNullable(filterOpsStartTime); - return this; - } - - /** - *

Start timestamp for the query, in SQL format.

- */ - @Override - @JsonSetter(value = "filterOps.startTime", nulls = Nulls.SKIP) - public _FinalStage filterOpsStartTime(Optional filterOpsStartTime) { - this.filterOpsStartTime = filterOpsStartTime; - return this; - } - - /** - *

HTTP response code of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsResponseCode(Integer filterOpsResponseCode) { - this.filterOpsResponseCode = Optional.ofNullable(filterOpsResponseCode); - return this; - } - - /** - *

HTTP response code of the request.

- */ - @Override - @JsonSetter(value = "filterOps.responseCode", nulls = Nulls.SKIP) - public _FinalStage filterOpsResponseCode(Optional filterOpsResponseCode) { - this.filterOpsResponseCode = filterOpsResponseCode; - return this; - } - - /** - *

Events with associated tags. If an event matches at least one tag, the event is returned. Comma-separated list. For example, "login, get".

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsTags(String filterOpsTags) { - this.filterOpsTags = Optional.ofNullable(filterOpsTags); - return this; - } - - /** - *

Events with associated tags. If an event matches at least one tag, the event is returned. Comma-separated list. For example, "login, get".

- */ - @Override - @JsonSetter(value = "filterOps.tags", nulls = Nulls.SKIP) - public _FinalStage filterOpsTags(Optional filterOpsTags) { - this.filterOpsTags = filterOpsTags; - return this; - } - - /** - *

Resources with the specified type.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsResourceType( - AuditServiceListAuditEventsRequestFilterOpsResourceType filterOpsResourceType) { - this.filterOpsResourceType = Optional.ofNullable(filterOpsResourceType); - return this; - } - - /** - *

Resources with the specified type.

- */ - @Override - @JsonSetter(value = "filterOps.resourceType", nulls = Nulls.SKIP) - public _FinalStage filterOpsResourceType( - Optional filterOpsResourceType) { - this.filterOpsResourceType = filterOpsResourceType; - return this; - } - - /** - *

Events with the specified action type.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsActionType( - AuditServiceListAuditEventsRequestFilterOpsActionType filterOpsActionType) { - this.filterOpsActionType = Optional.ofNullable(filterOpsActionType); - return this; - } - - /** - *

Events with the specified action type.

- */ - @Override - @JsonSetter(value = "filterOps.actionType", nulls = Nulls.SKIP) - public _FinalStage filterOpsActionType( - Optional filterOpsActionType) { - this.filterOpsActionType = filterOpsActionType; - return this; - } - - /** - *

Resources with a specified ID. If a resource matches at least one ID, the associated event is returned. Format is a comma-separated list of "<resourceType>/<resourceID>". For example, "VAULT/12345, USER/67890".

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsResourceIDs(String filterOpsResourceIDs) { - this.filterOpsResourceIDs = Optional.ofNullable(filterOpsResourceIDs); - return this; - } - - /** - *

Resources with a specified ID. If a resource matches at least one ID, the associated event is returned. Format is a comma-separated list of "<resourceType>/<resourceID>". For example, "VAULT/12345, USER/67890".

- */ - @Override - @JsonSetter(value = "filterOps.resourceIDs", nulls = Nulls.SKIP) - public _FinalStage filterOpsResourceIDs(Optional filterOpsResourceIDs) { - this.filterOpsResourceIDs = filterOpsResourceIDs; - return this; - } - - /** - *

Resources with the specified vault ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsVaultId(String filterOpsVaultId) { - this.filterOpsVaultId = Optional.ofNullable(filterOpsVaultId); - return this; - } - - /** - *

Resources with the specified vault ID.

- */ - @Override - @JsonSetter(value = "filterOps.vaultID", nulls = Nulls.SKIP) - public _FinalStage filterOpsVaultId(Optional filterOpsVaultId) { - this.filterOpsVaultId = filterOpsVaultId; - return this; - } - - /** - *

Resources with the specified workspace ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsWorkspaceId(String filterOpsWorkspaceId) { - this.filterOpsWorkspaceId = Optional.ofNullable(filterOpsWorkspaceId); - return this; - } - - /** - *

Resources with the specified workspace ID.

- */ - @Override - @JsonSetter(value = "filterOps.workspaceID", nulls = Nulls.SKIP) - public _FinalStage filterOpsWorkspaceId(Optional filterOpsWorkspaceId) { - this.filterOpsWorkspaceId = filterOpsWorkspaceId; - return this; - } - - /** - *

Resources with the specified parent account ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsParentAccountId(String filterOpsParentAccountId) { - this.filterOpsParentAccountId = Optional.ofNullable(filterOpsParentAccountId); - return this; - } - - /** - *

Resources with the specified parent account ID.

- */ - @Override - @JsonSetter(value = "filterOps.parentAccountID", nulls = Nulls.SKIP) - public _FinalStage filterOpsParentAccountId(Optional filterOpsParentAccountId) { - this.filterOpsParentAccountId = filterOpsParentAccountId; - return this; - } - - /** - *

Embedded User Context.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextBearerTokenContextId(String filterOpsContextBearerTokenContextId) { - this.filterOpsContextBearerTokenContextId = Optional.ofNullable(filterOpsContextBearerTokenContextId); - return this; - } - - /** - *

Embedded User Context.

- */ - @Override - @JsonSetter(value = "filterOps.context.bearerTokenContextID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextBearerTokenContextId(Optional filterOpsContextBearerTokenContextId) { - this.filterOpsContextBearerTokenContextId = filterOpsContextBearerTokenContextId; - return this; - } - - /** - *

ID of the JWT token.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextJwtId(String filterOpsContextJwtId) { - this.filterOpsContextJwtId = Optional.ofNullable(filterOpsContextJwtId); - return this; - } - - /** - *

ID of the JWT token.

- */ - @Override - @JsonSetter(value = "filterOps.context.jwtID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextJwtId(Optional filterOpsContextJwtId) { - this.filterOpsContextJwtId = filterOpsContextJwtId; - return this; - } - - /** - *

Authentication mode the actor used.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextAuthMode( - AuditServiceListAuditEventsRequestFilterOpsContextAuthMode filterOpsContextAuthMode) { - this.filterOpsContextAuthMode = Optional.ofNullable(filterOpsContextAuthMode); - return this; - } - - /** - *

Authentication mode the actor used.

- */ - @Override - @JsonSetter(value = "filterOps.context.authMode", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextAuthMode( - Optional filterOpsContextAuthMode) { - this.filterOpsContextAuthMode = filterOpsContextAuthMode; - return this; - } - - /** - *

HTTP Origin request header (including scheme, hostname, and port) of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextOrigin(String filterOpsContextOrigin) { - this.filterOpsContextOrigin = Optional.ofNullable(filterOpsContextOrigin); - return this; - } - - /** - *

HTTP Origin request header (including scheme, hostname, and port) of the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.origin", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextOrigin(Optional filterOpsContextOrigin) { - this.filterOpsContextOrigin = filterOpsContextOrigin; - return this; - } - - /** - *

IP Address of the client that made the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextIpAddress(String filterOpsContextIpAddress) { - this.filterOpsContextIpAddress = Optional.ofNullable(filterOpsContextIpAddress); - return this; - } - - /** - *

IP Address of the client that made the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.ipAddress", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextIpAddress(Optional filterOpsContextIpAddress) { - this.filterOpsContextIpAddress = filterOpsContextIpAddress; - return this; - } - - /** - *

Type of access for the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextAccessType( - AuditServiceListAuditEventsRequestFilterOpsContextAccessType filterOpsContextAccessType) { - this.filterOpsContextAccessType = Optional.ofNullable(filterOpsContextAccessType); - return this; - } - - /** - *

Type of access for the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.accessType", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextAccessType( - Optional filterOpsContextAccessType) { - this.filterOpsContextAccessType = filterOpsContextAccessType; - return this; - } - - /** - *

Type of member who sent the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextActorType( - AuditServiceListAuditEventsRequestFilterOpsContextActorType filterOpsContextActorType) { - this.filterOpsContextActorType = Optional.ofNullable(filterOpsContextActorType); - return this; - } - - /** - *

Type of member who sent the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.actorType", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextActorType( - Optional filterOpsContextActorType) { - this.filterOpsContextActorType = filterOpsContextActorType; - return this; - } - - /** - *

Member who sent the request. Depending on actorType, this may be a user ID or a service account ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextActor(String filterOpsContextActor) { - this.filterOpsContextActor = Optional.ofNullable(filterOpsContextActor); - return this; - } - - /** - *

Member who sent the request. Depending on actorType, this may be a user ID or a service account ID.

- */ - @Override - @JsonSetter(value = "filterOps.context.actor", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextActor(Optional filterOpsContextActor) { - this.filterOpsContextActor = filterOpsContextActor; - return this; - } - - /** - *

ID for the session in which the request was sent.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextSessionId(String filterOpsContextSessionId) { - this.filterOpsContextSessionId = Optional.ofNullable(filterOpsContextSessionId); - return this; - } - - /** - *

ID for the session in which the request was sent.

- */ - @Override - @JsonSetter(value = "filterOps.context.sessionID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextSessionId(Optional filterOpsContextSessionId) { - this.filterOpsContextSessionId = filterOpsContextSessionId; - return this; - } - - /** - *

ID for the request set by the service that received the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextTraceId(String filterOpsContextTraceId) { - this.filterOpsContextTraceId = Optional.ofNullable(filterOpsContextTraceId); - return this; - } - - /** - *

ID for the request set by the service that received the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.traceID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextTraceId(Optional filterOpsContextTraceId) { - this.filterOpsContextTraceId = filterOpsContextTraceId; - return this; - } - - /** - *

ID for the request that caused the event.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextRequestId(String filterOpsContextRequestId) { - this.filterOpsContextRequestId = Optional.ofNullable(filterOpsContextRequestId); - return this; - } - - /** - *

ID for the request that caused the event.

- */ - @Override - @JsonSetter(value = "filterOps.context.requestID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextRequestId(Optional filterOpsContextRequestId) { - this.filterOpsContextRequestId = filterOpsContextRequestId; - return this; - } - - /** - *

ID for the audit event.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextChangeId(String filterOpsContextChangeId) { - this.filterOpsContextChangeId = Optional.ofNullable(filterOpsContextChangeId); - return this; - } - - /** - *

ID for the audit event.

- */ - @Override - @JsonSetter(value = "filterOps.context.changeID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextChangeId(Optional filterOpsContextChangeId) { - this.filterOpsContextChangeId = filterOpsContextChangeId; - return this; - } - - @Override - public AuditServiceListAuditEventsRequest build() { - return new AuditServiceListAuditEventsRequest( - filterOpsContextChangeId, - filterOpsContextRequestId, - filterOpsContextTraceId, - filterOpsContextSessionId, - filterOpsContextActor, - filterOpsContextActorType, - filterOpsContextAccessType, - filterOpsContextIpAddress, - filterOpsContextOrigin, - filterOpsContextAuthMode, - filterOpsContextJwtId, - filterOpsContextBearerTokenContextId, - filterOpsParentAccountId, - filterOpsAccountId, - filterOpsWorkspaceId, - filterOpsVaultId, - filterOpsResourceIDs, - filterOpsActionType, - filterOpsResourceType, - filterOpsTags, - filterOpsResponseCode, - filterOpsStartTime, - filterOpsEndTime, - filterOpsApiName, - filterOpsResponseMessage, - filterOpsHttpMethod, - filterOpsHttpUri, - sortOpsSortBy, - sortOpsOrderBy, - afterOpsTimestamp, - afterOpsChangeId, - limit, - offset, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java deleted file mode 100644 index 9611f8ab..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsActionType { - NONE("NONE"), - - ASSIGN("ASSIGN"), - - CREATE("CREATE"), - - DELETE("DELETE"), - - EXECUTE("EXECUTE"), - - LIST("LIST"), - - READ("READ"), - - UNASSIGN("UNASSIGN"), - - UPDATE("UPDATE"), - - VALIDATE("VALIDATE"), - - LOGIN("LOGIN"), - - ROTATE("ROTATE"), - - SCHEDULEROTATION("SCHEDULEROTATION"), - - SCHEDULEROTATIONALERT("SCHEDULEROTATIONALERT"), - - IMPORT("IMPORT"), - - GETIMPORTPARAMETERS("GETIMPORTPARAMETERS"), - - PING("PING"), - - GETCLOUDPROVIDER("GETCLOUDPROVIDER"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsActionType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java deleted file mode 100644 index 44ac80d9..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsContextAccessType { - ACCESS_NONE("ACCESS_NONE"), - - API("API"), - - SQL("SQL"), - - OKTA_LOGIN("OKTA_LOGIN"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsContextAccessType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java deleted file mode 100644 index 1948ea9c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsContextActorType { - NONE("NONE"), - - USER("USER"), - - SERVICE_ACCOUNT("SERVICE_ACCOUNT"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsContextActorType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java deleted file mode 100644 index 82c375aa..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsContextAuthMode { - AUTH_NONE("AUTH_NONE"), - - OKTA_JWT("OKTA_JWT"), - - SERVICE_ACCOUNT_JWT("SERVICE_ACCOUNT_JWT"), - - PAT_JWT("PAT_JWT"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsContextAuthMode(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java deleted file mode 100644 index 864213ec..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsResourceType { - NONE_API("NONE_API"), - - ACCOUNT("ACCOUNT"), - - AUDIT("AUDIT"), - - BASE_DATA_TYPE("BASE_DATA_TYPE"), - - FIELD_TEMPLATE("FIELD_TEMPLATE"), - - FILE("FILE"), - - KEY("KEY"), - - POLICY("POLICY"), - - PROTO_PARSE("PROTO_PARSE"), - - RECORD("RECORD"), - - ROLE("ROLE"), - - RULE("RULE"), - - SECRET("SECRET"), - - SERVICE_ACCOUNT("SERVICE_ACCOUNT"), - - TOKEN("TOKEN"), - - USER("USER"), - - VAULT("VAULT"), - - VAULT_TEMPLATE("VAULT_TEMPLATE"), - - WORKSPACE("WORKSPACE"), - - TABLE("TABLE"), - - POLICY_TEMPLATE("POLICY_TEMPLATE"), - - MEMBER("MEMBER"), - - TAG("TAG"), - - CONNECTION("CONNECTION"), - - MIGRATION("MIGRATION"), - - SCHEDULED_JOB("SCHEDULED_JOB"), - - JOB("JOB"), - - COLUMN_NAME("COLUMN_NAME"), - - NETWORK_TOKEN("NETWORK_TOKEN"), - - SUBSCRIPTION("SUBSCRIPTION"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsResourceType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java deleted file mode 100644 index fe3f928e..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestSortOpsOrderBy { - ASCENDING("ASCENDING"), - - DESCENDING("DESCENDING"); - - private final String value; - - AuditServiceListAuditEventsRequestSortOpsOrderBy(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java deleted file mode 100644 index fb2d07d0..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; -import com.skyflow.generated.rest.types.V1BinListResponse; - -import java.util.concurrent.CompletableFuture; - -public class AsyncBinLookupClient { - protected final ClientOptions clientOptions; - - private final AsyncRawBinLookupClient rawClient; - - public AsyncBinLookupClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new AsyncRawBinLookupClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public AsyncRawBinLookupClient withRawResponse() { - return this.rawClient; - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture binListServiceListCardsOfBin() { - return this.rawClient.binListServiceListCardsOfBin().thenApply(response -> response.body()); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture binListServiceListCardsOfBin(V1BinListRequest request) { - return this.rawClient.binListServiceListCardsOfBin(request).thenApply(response -> response.body()); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture binListServiceListCardsOfBin( - V1BinListRequest request, RequestOptions requestOptions) { - return this.rawClient - .binListServiceListCardsOfBin(request, requestOptions) - .thenApply(response -> response.body()); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java deleted file mode 100644 index 9cf03c7d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; -import com.skyflow.generated.rest.types.V1BinListResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; - -public class AsyncRawBinLookupClient { - protected final ClientOptions clientOptions; - - public AsyncRawBinLookupClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture> binListServiceListCardsOfBin() { - return binListServiceListCardsOfBin(V1BinListRequest.builder().build()); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture> binListServiceListCardsOfBin( - V1BinListRequest request) { - return binListServiceListCardsOfBin(request, null); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture> binListServiceListCardsOfBin( - V1BinListRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/card_lookup") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BinListResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java deleted file mode 100644 index a7822986..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; -import com.skyflow.generated.rest.types.V1BinListResponse; - -public class BinLookupClient { - protected final ClientOptions clientOptions; - - private final RawBinLookupClient rawClient; - - public BinLookupClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new RawBinLookupClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public RawBinLookupClient withRawResponse() { - return this.rawClient; - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public V1BinListResponse binListServiceListCardsOfBin() { - return this.rawClient.binListServiceListCardsOfBin().body(); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public V1BinListResponse binListServiceListCardsOfBin(V1BinListRequest request) { - return this.rawClient.binListServiceListCardsOfBin(request).body(); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public V1BinListResponse binListServiceListCardsOfBin(V1BinListRequest request, RequestOptions requestOptions) { - return this.rawClient - .binListServiceListCardsOfBin(request, requestOptions) - .body(); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java deleted file mode 100644 index 21e77017..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; -import com.skyflow.generated.rest.types.V1BinListResponse; -import okhttp3.*; - -import java.io.IOException; - -public class RawBinLookupClient { - protected final ClientOptions clientOptions; - - public RawBinLookupClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public ApiClientHttpResponse binListServiceListCardsOfBin() { - return binListServiceListCardsOfBin(V1BinListRequest.builder().build()); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public ApiClientHttpResponse binListServiceListCardsOfBin(V1BinListRequest request) { - return binListServiceListCardsOfBin(request, null); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public ApiClientHttpResponse binListServiceListCardsOfBin( - V1BinListRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/card_lookup") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BinListResponse.class), response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java deleted file mode 100644 index def40293..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java +++ /dev/null @@ -1,180 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1VaultSchemaConfig; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BinListRequest.Builder.class) -public final class V1BinListRequest { - private final Optional> fields; - - private final Optional bin; - - private final Optional vaultSchemaConfig; - - private final Optional skyflowId; - - private final Map additionalProperties; - - private V1BinListRequest( - Optional> fields, - Optional bin, - Optional vaultSchemaConfig, - Optional skyflowId, - Map additionalProperties) { - this.fields = fields; - this.bin = bin; - this.vaultSchemaConfig = vaultSchemaConfig; - this.skyflowId = skyflowId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Fields to return. If not specified, all fields are returned. - */ - @JsonProperty("fields") - public Optional> getFields() { - return fields; - } - - /** - * @return BIN of the card. - */ - @JsonProperty("BIN") - public Optional getBin() { - return bin; - } - - @JsonProperty("vault_schema_config") - public Optional getVaultSchemaConfig() { - return vaultSchemaConfig; - } - - /** - * @return <code>skyflow_id</code> of the record. - */ - @JsonProperty("skyflow_id") - public Optional getSkyflowId() { - return skyflowId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1BinListRequest && equalTo((V1BinListRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1BinListRequest other) { - return fields.equals(other.fields) - && bin.equals(other.bin) - && vaultSchemaConfig.equals(other.vaultSchemaConfig) - && skyflowId.equals(other.skyflowId); - } - - @Override - public int hashCode() { - return Objects.hash(this.fields, this.bin, this.vaultSchemaConfig, this.skyflowId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> fields = Optional.empty(); - - private Optional bin = Optional.empty(); - - private Optional vaultSchemaConfig = Optional.empty(); - - private Optional skyflowId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1BinListRequest other) { - fields(other.getFields()); - bin(other.getBin()); - vaultSchemaConfig(other.getVaultSchemaConfig()); - skyflowId(other.getSkyflowId()); - return this; - } - - /** - *

Fields to return. If not specified, all fields are returned.

- */ - @JsonSetter(value = "fields", nulls = Nulls.SKIP) - public Builder fields(Optional> fields) { - this.fields = fields; - return this; - } - - public Builder fields(List fields) { - this.fields = Optional.ofNullable(fields); - return this; - } - - /** - *

BIN of the card.

- */ - @JsonSetter(value = "BIN", nulls = Nulls.SKIP) - public Builder bin(Optional bin) { - this.bin = bin; - return this; - } - - public Builder bin(String bin) { - this.bin = Optional.ofNullable(bin); - return this; - } - - @JsonSetter(value = "vault_schema_config", nulls = Nulls.SKIP) - public Builder vaultSchemaConfig(Optional vaultSchemaConfig) { - this.vaultSchemaConfig = vaultSchemaConfig; - return this; - } - - public Builder vaultSchemaConfig(V1VaultSchemaConfig vaultSchemaConfig) { - this.vaultSchemaConfig = Optional.ofNullable(vaultSchemaConfig); - return this; - } - - /** - *

<code>skyflow_id</code> of the record.

- */ - @JsonSetter(value = "skyflow_id", nulls = Nulls.SKIP) - public Builder skyflowId(Optional skyflowId) { - this.skyflowId = skyflowId; - return this; - } - - public Builder skyflowId(String skyflowId) { - this.skyflowId = Optional.ofNullable(skyflowId); - return this; - } - - public V1BinListRequest build() { - return new V1BinListRequest(fields, bin, vaultSchemaConfig, skyflowId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java index 01031423..d465ff62 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java @@ -5,11 +5,8 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.DeidentifyFileResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; -import com.skyflow.generated.rest.types.ReidentifyFileResponse; - +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; +import com.skyflow.generated.rest.types.UploadFileResponseV2; import java.util.concurrent.CompletableFuture; public class AsyncFilesClient { @@ -30,181 +27,17 @@ public AsyncRawFilesClient withRawResponse() { } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). - */ - public CompletableFuture deidentifyFile(DeidentifyFileRequest request) { - return this.rawClient.deidentifyFile(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). - */ - public CompletableFuture deidentifyFile( - DeidentifyFileRequest request, RequestOptions requestOptions) { - return this.rawClient.deidentifyFile(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request) { - return this.rawClient.deidentifyAudio(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request, RequestOptions requestOptions) { - return this.rawClient.deidentifyAudio(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request) { - return this.rawClient.deidentifyDocument(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request, RequestOptions requestOptions) { - return this.rawClient.deidentifyDocument(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request) { - return this.rawClient.deidentifyPdf(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request, RequestOptions requestOptions) { - return this.rawClient.deidentifyPdf(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request) { - return this.rawClient.deidentifyImage(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request, RequestOptions requestOptions) { - return this.rawClient.deidentifyImage(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request) { - return this.rawClient.deidentifyPresentation(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request, RequestOptions requestOptions) { - return this.rawClient.deidentifyPresentation(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request) { - return this.rawClient.deidentifySpreadsheet(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request, RequestOptions requestOptions) { - return this.rawClient.deidentifySpreadsheet(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request) { - return this.rawClient.deidentifyStructuredText(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request, RequestOptions requestOptions) { - return this.rawClient.deidentifyStructuredText(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyText(DeidentifyFileRequestDeidentifyText request) { - return this.rawClient.deidentifyText(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyText( - DeidentifyFileRequestDeidentifyText request, RequestOptions requestOptions) { - return this.rawClient.deidentifyText(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a file. - */ - public CompletableFuture reidentifyFile(ReidentifyFileRequestReidentifyFile request) { - return this.rawClient.reidentifyFile(request).thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a file. - */ - public CompletableFuture reidentifyFile( - ReidentifyFileRequestReidentifyFile request, RequestOptions requestOptions) { - return this.rawClient.reidentifyFile(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * Returns the status of a detect run. - */ - public CompletableFuture getRun(String runId) { - return this.rawClient.getRun(runId).thenApply(response -> response.body()); - } - - /** - * Returns the status of a detect run. + * Uploads a file to a new or specified record. */ - public CompletableFuture getRun(String runId, GetRunRequest request) { - return this.rawClient.getRun(runId, request).thenApply(response -> response.body()); + public CompletableFuture uploadFileV2(String vaultId, UploadFileRequestV2 request) { + return this.rawClient.uploadFileV2(vaultId, request).thenApply(response -> response.body()); } /** - * Returns the status of a detect run. + * Uploads a file to a new or specified record. */ - public CompletableFuture getRun( - String runId, GetRunRequest request, RequestOptions requestOptions) { - return this.rawClient.getRun(runId, request, requestOptions).thenApply(response -> response.body()); + public CompletableFuture uploadFileV2( + String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.uploadFileV2(vaultId, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java index e7f008e8..75814065 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java @@ -4,20 +4,33 @@ package com.skyflow.generated.rest.resources.files; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.QueryStringMapper; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; +import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.DeidentifyFileResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.ReidentifyFileResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - +import com.skyflow.generated.rest.types.UploadFileResponseV2; import java.io.IOException; import java.util.concurrent.CompletableFuture; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; public class AsyncRawFilesClient { protected final ClientOptions clientOptions; @@ -27,946 +40,99 @@ public AsyncRawFilesClient(ClientOptions clientOptions) { } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public CompletableFuture> deidentifyFile( - DeidentifyFileRequest request) { - return deidentifyFile(request, null); + public CompletableFuture> uploadFileV2( + String vaultId, UploadFileRequestV2 request) { + return uploadFileV2(vaultId, request, null); } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public CompletableFuture> deidentifyFile( - DeidentifyFileRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> uploadFileV2( + String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() - .addPathSegments("v1/detect/deidentify/file") - .build(); - RequestBody body; + .addPathSegments("v2/vaults") + .addPathSegment(vaultId) + .addPathSegments("files") + .addPathSegments("upload"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM); try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "tableName", request.getTableName(), false); + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "columnName", request.getColumnName(), false); + if (request.getSkyflowId().isPresent()) { + QueryStringMapper.addFormDataPart( + multipartBodyBuilder, + "skyflowID", + request.getSkyflowId().get(), + false); + } + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "file", request.getFile(), false); + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addFormDataPart( + multipartBodyBuilder, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } + } catch (Exception e) { + throw new RuntimeException(e); } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("POST", multipartBodyBuilder.build()) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request) { - return deidentifyAudio(request, null); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/audio") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); } - CompletableFuture> future = new CompletableFuture<>(); + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request) { - return deidentifyDocument(request, null); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/document") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, UploadFileResponseV2.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { switch (response.code()) { case 400: future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request) { - return deidentifyPdf(request, null); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/document/pdf") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; case 401: future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request) { - return deidentifyImage(request, null); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/image") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( + case 404: + future.completeExceptionally(new NotFoundError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request) { - return deidentifyPresentation(request, null); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/presentation") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request) { - return deidentifySpreadsheet(request, null); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/spreadsheet") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request) { - return deidentifyStructuredText(request, null); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/structured_text") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyText( - DeidentifyFileRequestDeidentifyText request) { - return deidentifyText(request, null); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyText( - DeidentifyFileRequestDeidentifyText request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/text") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Re-identifies tokens in a file. - */ - public CompletableFuture> reidentifyFile( - ReidentifyFileRequestReidentifyFile request) { - return reidentifyFile(request, null); - } - - /** - * Re-identifies tokens in a file. - */ - public CompletableFuture> reidentifyFile( - ReidentifyFileRequestReidentifyFile request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/reidentify/file") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), ReidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Returns the status of a detect run. - */ - public CompletableFuture> getRun(String runId) { - return getRun(runId, GetRunRequest.builder().build()); - } - - /** - * Returns the status of a detect run. - */ - public CompletableFuture> getRun(String runId, GetRunRequest request) { - return getRun(runId, request, null); - } - - /** - * Returns the status of a detect run. - */ - public CompletableFuture> getRun( - String runId, GetRunRequest request, RequestOptions requestOptions) { - HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/runs") - .addPathSegment(runId); - if (request.getVaultId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "vault_id", request.getVaultId().get(), false); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl.build()) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DetectRunsResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; case 500: future.completeExceptionally(new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), @@ -976,12 +142,13 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java index bcda96e6..33d3786d 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java @@ -5,10 +5,8 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.DeidentifyFileResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; -import com.skyflow.generated.rest.types.ReidentifyFileResponse; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; +import com.skyflow.generated.rest.types.UploadFileResponseV2; public class FilesClient { protected final ClientOptions clientOptions; @@ -28,172 +26,17 @@ public RawFilesClient withRawResponse() { } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) { - return this.rawClient.deidentifyFile(request).body(); + public UploadFileResponseV2 uploadFileV2(String vaultId, UploadFileRequestV2 request) { + return this.rawClient.uploadFileV2(vaultId, request).body(); } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request, RequestOptions requestOptions) { - return this.rawClient.deidentifyFile(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyAudio(DeidentifyFileAudioRequestDeidentifyAudio request) { - return this.rawClient.deidentifyAudio(request).body(); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request, RequestOptions requestOptions) { - return this.rawClient.deidentifyAudio(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyDocument(DeidentifyFileRequestDeidentifyDocument request) { - return this.rawClient.deidentifyDocument(request).body(); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request, RequestOptions requestOptions) { - return this.rawClient.deidentifyDocument(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyPdf(DeidentifyFileDocumentPdfRequestDeidentifyPdf request) { - return this.rawClient.deidentifyPdf(request).body(); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request, RequestOptions requestOptions) { - return this.rawClient.deidentifyPdf(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyImage(DeidentifyFileImageRequestDeidentifyImage request) { - return this.rawClient.deidentifyImage(request).body(); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request, RequestOptions requestOptions) { - return this.rawClient.deidentifyImage(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyPresentation(DeidentifyFileRequestDeidentifyPresentation request) { - return this.rawClient.deidentifyPresentation(request).body(); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request, RequestOptions requestOptions) { - return this.rawClient.deidentifyPresentation(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifySpreadsheet(DeidentifyFileRequestDeidentifySpreadsheet request) { - return this.rawClient.deidentifySpreadsheet(request).body(); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request, RequestOptions requestOptions) { - return this.rawClient.deidentifySpreadsheet(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyStructuredText(DeidentifyFileRequestDeidentifyStructuredText request) { - return this.rawClient.deidentifyStructuredText(request).body(); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request, RequestOptions requestOptions) { - return this.rawClient.deidentifyStructuredText(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyText(DeidentifyFileRequestDeidentifyText request) { - return this.rawClient.deidentifyText(request).body(); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyText( - DeidentifyFileRequestDeidentifyText request, RequestOptions requestOptions) { - return this.rawClient.deidentifyText(request, requestOptions).body(); - } - - /** - * Re-identifies tokens in a file. - */ - public ReidentifyFileResponse reidentifyFile(ReidentifyFileRequestReidentifyFile request) { - return this.rawClient.reidentifyFile(request).body(); - } - - /** - * Re-identifies tokens in a file. - */ - public ReidentifyFileResponse reidentifyFile( - ReidentifyFileRequestReidentifyFile request, RequestOptions requestOptions) { - return this.rawClient.reidentifyFile(request, requestOptions).body(); - } - - /** - * Returns the status of a detect run. - */ - public DetectRunsResponse getRun(String runId) { - return this.rawClient.getRun(runId).body(); - } - - /** - * Returns the status of a detect run. - */ - public DetectRunsResponse getRun(String runId, GetRunRequest request) { - return this.rawClient.getRun(runId, request).body(); - } - - /** - * Returns the status of a detect run. - */ - public DetectRunsResponse getRun(String runId, GetRunRequest request, RequestOptions requestOptions) { - return this.rawClient.getRun(runId, request, requestOptions).body(); + public UploadFileResponseV2 uploadFileV2( + String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.uploadFileV2(vaultId, request, requestOptions).body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java index d277d224..a73991b5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java @@ -4,18 +4,29 @@ package com.skyflow.generated.rest.resources.files; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.QueryStringMapper; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; +import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.DeidentifyFileResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.ReidentifyFileResponse; -import okhttp3.*; - +import com.skyflow.generated.rest.types.UploadFileResponseV2; import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; public class RawFilesClient { protected final ClientOptions clientOptions; @@ -25,395 +36,87 @@ public RawFilesClient(ClientOptions clientOptions) { } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public ApiClientHttpResponse deidentifyFile(DeidentifyFileRequest request) { - return deidentifyFile(request, null); + public ApiClientHttpResponse uploadFileV2(String vaultId, UploadFileRequestV2 request) { + return uploadFileV2(vaultId, request, null); } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public ApiClientHttpResponse deidentifyFile( - DeidentifyFileRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse uploadFileV2( + String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() - .addPathSegments("v1/detect/deidentify/file") - .build(); - RequestBody body; + .addPathSegments("v2/vaults") + .addPathSegment(vaultId) + .addPathSegments("files") + .addPathSegments("upload"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM); try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "tableName", request.getTableName(), false); + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "columnName", request.getColumnName(), false); + if (request.getSkyflowId().isPresent()) { + QueryStringMapper.addFormDataPart( + multipartBodyBuilder, + "skyflowID", + request.getSkyflowId().get(), + false); + } + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "file", request.getFile(), false); + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addFormDataPart( + multipartBodyBuilder, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } + } catch (Exception e) { + throw new RuntimeException(e); } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("POST", multipartBodyBuilder.build()) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request) { - return deidentifyAudio(request, null); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/audio") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request) { - return deidentifyDocument(request, null); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/document") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, UploadFileResponseV2.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { switch (response.code()) { case 400: throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request) { - return deidentifyPdf(request, null); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/document/pdf") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); case 401: throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request) { - return deidentifyImage(request, null); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/image") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( + case 404: + throw new NotFoundError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request) { - return deidentifyPresentation(request, null); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/presentation") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); case 500: throw new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); @@ -421,350 +124,11 @@ public ApiClientHttpResponse deidentifyPresentation( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request) { - return deidentifySpreadsheet(request, null); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/spreadsheet") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request) { - return deidentifyStructuredText(request, null); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/structured_text") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyText(DeidentifyFileRequestDeidentifyText request) { - return deidentifyText(request, null); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyText( - DeidentifyFileRequestDeidentifyText request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/text") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Re-identifies tokens in a file. - */ - public ApiClientHttpResponse reidentifyFile(ReidentifyFileRequestReidentifyFile request) { - return reidentifyFile(request, null); - } - - /** - * Re-identifies tokens in a file. - */ - public ApiClientHttpResponse reidentifyFile( - ReidentifyFileRequestReidentifyFile request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/reidentify/file") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), ReidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Returns the status of a detect run. - */ - public ApiClientHttpResponse getRun(String runId) { - return getRun(runId, GetRunRequest.builder().build()); - } - - /** - * Returns the status of a detect run. - */ - public ApiClientHttpResponse getRun(String runId, GetRunRequest request) { - return getRun(runId, request, null); - } - - /** - * Returns the status of a detect run. - */ - public ApiClientHttpResponse getRun( - String runId, GetRunRequest request, RequestOptions requestOptions) { - HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/runs") - .addPathSegment(runId); - if (request.getVaultId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "vault_id", request.getVaultId().get(), false); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl.build()) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DetectRunsResponse.class), response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java deleted file mode 100644 index c2baa931..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java +++ /dev/null @@ -1,663 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription; -import com.skyflow.generated.rest.types.FileDataDeidentifyAudio; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileAudioRequestDeidentifyAudio.Builder.class) -public final class DeidentifyFileAudioRequestDeidentifyAudio { - private final FileDataDeidentifyAudio file; - - private final String vaultId; - - private final Optional outputTranscription; - - private final Optional outputProcessedAudio; - - private final Optional bleepStartPadding; - - private final Optional bleepStopPadding; - - private final Optional bleepFrequency; - - private final Optional bleepGain; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileAudioRequestDeidentifyAudio( - FileDataDeidentifyAudio file, - String vaultId, - Optional outputTranscription, - Optional outputProcessedAudio, - Optional bleepStartPadding, - Optional bleepStopPadding, - Optional bleepFrequency, - Optional bleepGain, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.outputTranscription = outputTranscription; - this.outputProcessedAudio = outputProcessedAudio; - this.bleepStartPadding = bleepStartPadding; - this.bleepStopPadding = bleepStopPadding; - this.bleepFrequency = bleepFrequency; - this.bleepGain = bleepGain; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyAudio getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Type of transcription to output. - */ - @JsonProperty("output_transcription") - public Optional getOutputTranscription() { - return outputTranscription; - } - - /** - * @return Whether to include the processed audio file in the response. - */ - @JsonProperty("output_processed_audio") - public Optional getOutputProcessedAudio() { - return outputProcessedAudio; - } - - /** - * @return Padding added to the beginning of a bleep, in seconds. - */ - @JsonProperty("bleep_start_padding") - public Optional getBleepStartPadding() { - return bleepStartPadding; - } - - /** - * @return Padding added to the end of a bleep, in seconds. - */ - @JsonProperty("bleep_stop_padding") - public Optional getBleepStopPadding() { - return bleepStopPadding; - } - - /** - * @return The pitch of the bleep sound, in Hz. The higher the number, the higher the pitch. - */ - @JsonProperty("bleep_frequency") - public Optional getBleepFrequency() { - return bleepFrequency; - } - - /** - * @return Relative loudness of the bleep in dB. Positive values increase its loudness, and negative values decrease it. - */ - @JsonProperty("bleep_gain") - public Optional getBleepGain() { - return bleepGain; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileAudioRequestDeidentifyAudio - && equalTo((DeidentifyFileAudioRequestDeidentifyAudio) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileAudioRequestDeidentifyAudio other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && outputTranscription.equals(other.outputTranscription) - && outputProcessedAudio.equals(other.outputProcessedAudio) - && bleepStartPadding.equals(other.bleepStartPadding) - && bleepStopPadding.equals(other.bleepStopPadding) - && bleepFrequency.equals(other.bleepFrequency) - && bleepGain.equals(other.bleepGain) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.outputTranscription, - this.outputProcessedAudio, - this.bleepStartPadding, - this.bleepStopPadding, - this.bleepFrequency, - this.bleepGain, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyAudio file); - - Builder from(DeidentifyFileAudioRequestDeidentifyAudio other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileAudioRequestDeidentifyAudio build(); - - /** - *

Type of transcription to output.

- */ - _FinalStage outputTranscription( - Optional outputTranscription); - - _FinalStage outputTranscription( - DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription outputTranscription); - - /** - *

Whether to include the processed audio file in the response.

- */ - _FinalStage outputProcessedAudio(Optional outputProcessedAudio); - - _FinalStage outputProcessedAudio(Boolean outputProcessedAudio); - - /** - *

Padding added to the beginning of a bleep, in seconds.

- */ - _FinalStage bleepStartPadding(Optional bleepStartPadding); - - _FinalStage bleepStartPadding(Float bleepStartPadding); - - /** - *

Padding added to the end of a bleep, in seconds.

- */ - _FinalStage bleepStopPadding(Optional bleepStopPadding); - - _FinalStage bleepStopPadding(Float bleepStopPadding); - - /** - *

The pitch of the bleep sound, in Hz. The higher the number, the higher the pitch.

- */ - _FinalStage bleepFrequency(Optional bleepFrequency); - - _FinalStage bleepFrequency(Integer bleepFrequency); - - /** - *

Relative loudness of the bleep in dB. Positive values increase its loudness, and negative values decrease it.

- */ - _FinalStage bleepGain(Optional bleepGain); - - _FinalStage bleepGain(Integer bleepGain); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyAudio file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - private Optional bleepGain = Optional.empty(); - - private Optional bleepFrequency = Optional.empty(); - - private Optional bleepStopPadding = Optional.empty(); - - private Optional bleepStartPadding = Optional.empty(); - - private Optional outputProcessedAudio = Optional.empty(); - - private Optional outputTranscription = - Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileAudioRequestDeidentifyAudio other) { - file(other.getFile()); - vaultId(other.getVaultId()); - outputTranscription(other.getOutputTranscription()); - outputProcessedAudio(other.getOutputProcessedAudio()); - bleepStartPadding(other.getBleepStartPadding()); - bleepStopPadding(other.getBleepStopPadding()); - bleepFrequency(other.getBleepFrequency()); - bleepGain(other.getBleepGain()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyAudio file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - /** - *

Relative loudness of the bleep in dB. Positive values increase its loudness, and negative values decrease it.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage bleepGain(Integer bleepGain) { - this.bleepGain = Optional.ofNullable(bleepGain); - return this; - } - - /** - *

Relative loudness of the bleep in dB. Positive values increase its loudness, and negative values decrease it.

- */ - @Override - @JsonSetter(value = "bleep_gain", nulls = Nulls.SKIP) - public _FinalStage bleepGain(Optional bleepGain) { - this.bleepGain = bleepGain; - return this; - } - - /** - *

The pitch of the bleep sound, in Hz. The higher the number, the higher the pitch.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage bleepFrequency(Integer bleepFrequency) { - this.bleepFrequency = Optional.ofNullable(bleepFrequency); - return this; - } - - /** - *

The pitch of the bleep sound, in Hz. The higher the number, the higher the pitch.

- */ - @Override - @JsonSetter(value = "bleep_frequency", nulls = Nulls.SKIP) - public _FinalStage bleepFrequency(Optional bleepFrequency) { - this.bleepFrequency = bleepFrequency; - return this; - } - - /** - *

Padding added to the end of a bleep, in seconds.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage bleepStopPadding(Float bleepStopPadding) { - this.bleepStopPadding = Optional.ofNullable(bleepStopPadding); - return this; - } - - /** - *

Padding added to the end of a bleep, in seconds.

- */ - @Override - @JsonSetter(value = "bleep_stop_padding", nulls = Nulls.SKIP) - public _FinalStage bleepStopPadding(Optional bleepStopPadding) { - this.bleepStopPadding = bleepStopPadding; - return this; - } - - /** - *

Padding added to the beginning of a bleep, in seconds.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage bleepStartPadding(Float bleepStartPadding) { - this.bleepStartPadding = Optional.ofNullable(bleepStartPadding); - return this; - } - - /** - *

Padding added to the beginning of a bleep, in seconds.

- */ - @Override - @JsonSetter(value = "bleep_start_padding", nulls = Nulls.SKIP) - public _FinalStage bleepStartPadding(Optional bleepStartPadding) { - this.bleepStartPadding = bleepStartPadding; - return this; - } - - /** - *

Whether to include the processed audio file in the response.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage outputProcessedAudio(Boolean outputProcessedAudio) { - this.outputProcessedAudio = Optional.ofNullable(outputProcessedAudio); - return this; - } - - /** - *

Whether to include the processed audio file in the response.

- */ - @Override - @JsonSetter(value = "output_processed_audio", nulls = Nulls.SKIP) - public _FinalStage outputProcessedAudio(Optional outputProcessedAudio) { - this.outputProcessedAudio = outputProcessedAudio; - return this; - } - - /** - *

Type of transcription to output.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage outputTranscription( - DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription outputTranscription) { - this.outputTranscription = Optional.ofNullable(outputTranscription); - return this; - } - - /** - *

Type of transcription to output.

- */ - @Override - @JsonSetter(value = "output_transcription", nulls = Nulls.SKIP) - public _FinalStage outputTranscription( - Optional outputTranscription) { - this.outputTranscription = outputTranscription; - return this; - } - - @Override - public DeidentifyFileAudioRequestDeidentifyAudio build() { - return new DeidentifyFileAudioRequestDeidentifyAudio( - file, - vaultId, - outputTranscription, - outputProcessedAudio, - bleepStartPadding, - bleepStopPadding, - bleepFrequency, - bleepGain, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java deleted file mode 100644 index 1844a116..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java +++ /dev/null @@ -1,479 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyPdf; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileDocumentPdfRequestDeidentifyPdf.Builder.class) -public final class DeidentifyFileDocumentPdfRequestDeidentifyPdf { - private final FileDataDeidentifyPdf file; - - private final String vaultId; - - private final Optional density; - - private final Optional maxResolution; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileDocumentPdfRequestDeidentifyPdf( - FileDataDeidentifyPdf file, - String vaultId, - Optional density, - Optional maxResolution, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.density = density; - this.maxResolution = maxResolution; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyPdf getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Pixel density at which to process the PDF file. - */ - @JsonProperty("density") - public Optional getDensity() { - return density; - } - - /** - * @return Max resolution at which to process the PDF file. - */ - @JsonProperty("max_resolution") - public Optional getMaxResolution() { - return maxResolution; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileDocumentPdfRequestDeidentifyPdf - && equalTo((DeidentifyFileDocumentPdfRequestDeidentifyPdf) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileDocumentPdfRequestDeidentifyPdf other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && density.equals(other.density) - && maxResolution.equals(other.maxResolution) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.density, - this.maxResolution, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyPdf file); - - Builder from(DeidentifyFileDocumentPdfRequestDeidentifyPdf other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileDocumentPdfRequestDeidentifyPdf build(); - - /** - *

Pixel density at which to process the PDF file.

- */ - _FinalStage density(Optional density); - - _FinalStage density(Integer density); - - /** - *

Max resolution at which to process the PDF file.

- */ - _FinalStage maxResolution(Optional maxResolution); - - _FinalStage maxResolution(Integer maxResolution); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes( - Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyPdf file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = - Optional.empty(); - - private Optional maxResolution = Optional.empty(); - - private Optional density = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileDocumentPdfRequestDeidentifyPdf other) { - file(other.getFile()); - vaultId(other.getVaultId()); - density(other.getDensity()); - maxResolution(other.getMaxResolution()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyPdf file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - /** - *

Max resolution at which to process the PDF file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage maxResolution(Integer maxResolution) { - this.maxResolution = Optional.ofNullable(maxResolution); - return this; - } - - /** - *

Max resolution at which to process the PDF file.

- */ - @Override - @JsonSetter(value = "max_resolution", nulls = Nulls.SKIP) - public _FinalStage maxResolution(Optional maxResolution) { - this.maxResolution = maxResolution; - return this; - } - - /** - *

Pixel density at which to process the PDF file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage density(Integer density) { - this.density = Optional.ofNullable(density); - return this; - } - - /** - *

Pixel density at which to process the PDF file.

- */ - @Override - @JsonSetter(value = "density", nulls = Nulls.SKIP) - public _FinalStage density(Optional density) { - this.density = density; - return this; - } - - @Override - public DeidentifyFileDocumentPdfRequestDeidentifyPdf build() { - return new DeidentifyFileDocumentPdfRequestDeidentifyPdf( - file, - vaultId, - density, - maxResolution, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java deleted file mode 100644 index 25ddea9c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java +++ /dev/null @@ -1,524 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileImageRequestDeidentifyImageEntityTypesItem; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileImageRequestDeidentifyImageMaskingMethod; -import com.skyflow.generated.rest.types.FileDataDeidentifyImage; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileImageRequestDeidentifyImage.Builder.class) -public final class DeidentifyFileImageRequestDeidentifyImage { - private final FileDataDeidentifyImage file; - - private final String vaultId; - - private final Optional outputProcessedImage; - - private final Optional outputOcrText; - - private final Optional maskingMethod; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileImageRequestDeidentifyImage( - FileDataDeidentifyImage file, - String vaultId, - Optional outputProcessedImage, - Optional outputOcrText, - Optional maskingMethod, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.outputProcessedImage = outputProcessedImage; - this.outputOcrText = outputOcrText; - this.maskingMethod = maskingMethod; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyImage getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return If true, includes processed image in the output. - */ - @JsonProperty("output_processed_image") - public Optional getOutputProcessedImage() { - return outputProcessedImage; - } - - /** - * @return If true, includes text detected by OCR in the response. - */ - @JsonProperty("output_ocr_text") - public Optional getOutputOcrText() { - return outputOcrText; - } - - /** - * @return Method to mask the entities in the image. - */ - @JsonProperty("masking_method") - public Optional getMaskingMethod() { - return maskingMethod; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileImageRequestDeidentifyImage - && equalTo((DeidentifyFileImageRequestDeidentifyImage) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileImageRequestDeidentifyImage other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && outputProcessedImage.equals(other.outputProcessedImage) - && outputOcrText.equals(other.outputOcrText) - && maskingMethod.equals(other.maskingMethod) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.outputProcessedImage, - this.outputOcrText, - this.maskingMethod, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyImage file); - - Builder from(DeidentifyFileImageRequestDeidentifyImage other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileImageRequestDeidentifyImage build(); - - /** - *

If true, includes processed image in the output.

- */ - _FinalStage outputProcessedImage(Optional outputProcessedImage); - - _FinalStage outputProcessedImage(Boolean outputProcessedImage); - - /** - *

If true, includes text detected by OCR in the response.

- */ - _FinalStage outputOcrText(Optional outputOcrText); - - _FinalStage outputOcrText(Boolean outputOcrText); - - /** - *

Method to mask the entities in the image.

- */ - _FinalStage maskingMethod(Optional maskingMethod); - - _FinalStage maskingMethod(DeidentifyFileImageRequestDeidentifyImageMaskingMethod maskingMethod); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyImage file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - private Optional maskingMethod = Optional.empty(); - - private Optional outputOcrText = Optional.empty(); - - private Optional outputProcessedImage = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileImageRequestDeidentifyImage other) { - file(other.getFile()); - vaultId(other.getVaultId()); - outputProcessedImage(other.getOutputProcessedImage()); - outputOcrText(other.getOutputOcrText()); - maskingMethod(other.getMaskingMethod()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyImage file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - /** - *

Method to mask the entities in the image.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage maskingMethod(DeidentifyFileImageRequestDeidentifyImageMaskingMethod maskingMethod) { - this.maskingMethod = Optional.ofNullable(maskingMethod); - return this; - } - - /** - *

Method to mask the entities in the image.

- */ - @Override - @JsonSetter(value = "masking_method", nulls = Nulls.SKIP) - public _FinalStage maskingMethod( - Optional maskingMethod) { - this.maskingMethod = maskingMethod; - return this; - } - - /** - *

If true, includes text detected by OCR in the response.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage outputOcrText(Boolean outputOcrText) { - this.outputOcrText = Optional.ofNullable(outputOcrText); - return this; - } - - /** - *

If true, includes text detected by OCR in the response.

- */ - @Override - @JsonSetter(value = "output_ocr_text", nulls = Nulls.SKIP) - public _FinalStage outputOcrText(Optional outputOcrText) { - this.outputOcrText = outputOcrText; - return this; - } - - /** - *

If true, includes processed image in the output.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage outputProcessedImage(Boolean outputProcessedImage) { - this.outputProcessedImage = Optional.ofNullable(outputProcessedImage); - return this; - } - - /** - *

If true, includes processed image in the output.

- */ - @Override - @JsonSetter(value = "output_processed_image", nulls = Nulls.SKIP) - public _FinalStage outputProcessedImage(Optional outputProcessedImage) { - this.outputProcessedImage = outputProcessedImage; - return this; - } - - @Override - public DeidentifyFileImageRequestDeidentifyImage build() { - return new DeidentifyFileImageRequestDeidentifyImage( - file, - vaultId, - outputProcessedImage, - outputOcrText, - maskingMethod, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java deleted file mode 100644 index 62d77229..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java +++ /dev/null @@ -1,385 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestEntityTypesItem; -import com.skyflow.generated.rest.types.FileData; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequest.Builder.class) -public final class DeidentifyFileRequest { - private final FileData file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequest( - FileData file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileData getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequest && equalTo((DeidentifyFileRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequest other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileData file); - - Builder from(DeidentifyFileRequest other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequest build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileData file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequest other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileData file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes(Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequest build() { - return new DeidentifyFileRequest( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java deleted file mode 100644 index c4d9841d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java +++ /dev/null @@ -1,387 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyDocumentEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyDocument; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifyDocument.Builder.class) -public final class DeidentifyFileRequestDeidentifyDocument { - private final FileDataDeidentifyDocument file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifyDocument( - FileDataDeidentifyDocument file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyDocument getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifyDocument - && equalTo((DeidentifyFileRequestDeidentifyDocument) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifyDocument other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyDocument file); - - Builder from(DeidentifyFileRequestDeidentifyDocument other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifyDocument build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyDocument file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifyDocument other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyDocument file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifyDocument build() { - return new DeidentifyFileRequestDeidentifyDocument( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java deleted file mode 100644 index e1cea77f..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java +++ /dev/null @@ -1,388 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyPresentationEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyPresentation; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifyPresentation.Builder.class) -public final class DeidentifyFileRequestDeidentifyPresentation { - private final FileDataDeidentifyPresentation file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifyPresentation( - FileDataDeidentifyPresentation file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyPresentation getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifyPresentation - && equalTo((DeidentifyFileRequestDeidentifyPresentation) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifyPresentation other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyPresentation file); - - Builder from(DeidentifyFileRequestDeidentifyPresentation other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifyPresentation build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyPresentation file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = - Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifyPresentation other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyPresentation file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifyPresentation build() { - return new DeidentifyFileRequestDeidentifyPresentation( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java deleted file mode 100644 index 10ca8feb..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java +++ /dev/null @@ -1,388 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifySpreadsheet; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifySpreadsheet.Builder.class) -public final class DeidentifyFileRequestDeidentifySpreadsheet { - private final FileDataDeidentifySpreadsheet file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifySpreadsheet( - FileDataDeidentifySpreadsheet file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifySpreadsheet getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifySpreadsheet - && equalTo((DeidentifyFileRequestDeidentifySpreadsheet) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifySpreadsheet other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifySpreadsheet file); - - Builder from(DeidentifyFileRequestDeidentifySpreadsheet other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifySpreadsheet build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifySpreadsheet file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = - Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifySpreadsheet other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifySpreadsheet file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifySpreadsheet build() { - return new DeidentifyFileRequestDeidentifySpreadsheet( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java deleted file mode 100644 index e3f555b8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java +++ /dev/null @@ -1,389 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyStructuredText; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifyStructuredText.Builder.class) -public final class DeidentifyFileRequestDeidentifyStructuredText { - private final FileDataDeidentifyStructuredText file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifyStructuredText( - FileDataDeidentifyStructuredText file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyStructuredText getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifyStructuredText - && equalTo((DeidentifyFileRequestDeidentifyStructuredText) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifyStructuredText other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyStructuredText file); - - Builder from(DeidentifyFileRequestDeidentifyStructuredText other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifyStructuredText build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes( - Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyStructuredText file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = - Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifyStructuredText other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyStructuredText file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifyStructuredText build() { - return new DeidentifyFileRequestDeidentifyStructuredText( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java deleted file mode 100644 index 8457c790..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java +++ /dev/null @@ -1,386 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyTextEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyText; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifyText.Builder.class) -public final class DeidentifyFileRequestDeidentifyText { - private final FileDataDeidentifyText file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifyText( - FileDataDeidentifyText file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyText getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifyText - && equalTo((DeidentifyFileRequestDeidentifyText) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifyText other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyText file); - - Builder from(DeidentifyFileRequestDeidentifyText other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifyText build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyText file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifyText other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyText file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes(Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifyText build() { - return new DeidentifyFileRequestDeidentifyText( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileDeleteRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileDeleteRequest.java new file mode 100644 index 00000000..50fdb91c --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileDeleteRequest.java @@ -0,0 +1,191 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.files.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.FileDeleteRecord; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileDeleteRequest.Builder.class) +public final class FileDeleteRequest { + private final String vaultId; + + private final List records; + + private final Map additionalProperties; + + private FileDeleteRequest( + String vaultId, List records, Map additionalProperties) { + this.vaultId = vaultId; + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return List of record objects (max 20,000) identifying the file columns to delete. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileDeleteRequest && equalTo((FileDeleteRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileDeleteRequest other) { + return vaultId.equals(other.vaultId) && records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

ID of the vault.

+ */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(FileDeleteRequest other); + } + + public interface _FinalStage { + FileDeleteRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

List of record objects (max 20,000) identifying the file columns to delete.

+ */ + _FinalStage records(List records); + + _FinalStage addRecords(FileDeleteRecord records); + + _FinalStage addAllRecords(List records); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileDeleteRequest other) { + vaultId(other.getVaultId()); + records(other.getRecords()); + return this; + } + + /** + *

ID of the vault.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

List of record objects (max 20,000) identifying the file columns to delete.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

List of record objects (max 20,000) identifying the file columns to delete.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(FileDeleteRecord records) { + this.records.add(records); + return this; + } + + /** + *

List of record objects (max 20,000) identifying the file columns to delete.

+ */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public FileDeleteRequest build() { + return new FileDeleteRequest(vaultId, records, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileUploadRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileUploadRequest.java new file mode 100644 index 00000000..0db8c62b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileUploadRequest.java @@ -0,0 +1,191 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.files.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.FileUploadRecord; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadRequest.Builder.class) +public final class FileUploadRequest { + private final String vaultId; + + private final List records; + + private final Map additionalProperties; + + private FileUploadRequest( + String vaultId, List records, Map additionalProperties) { + this.vaultId = vaultId; + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return List of records for which signed file upload URLs are requested. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadRequest && equalTo((FileUploadRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadRequest other) { + return vaultId.equals(other.vaultId) && records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

ID of the vault.

+ */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(FileUploadRequest other); + } + + public interface _FinalStage { + FileUploadRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

List of records for which signed file upload URLs are requested.

+ */ + _FinalStage records(List records); + + _FinalStage addRecords(FileUploadRecord records); + + _FinalStage addAllRecords(List records); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileUploadRequest other) { + vaultId(other.getVaultId()); + records(other.getRecords()); + return this; + } + + /** + *

ID of the vault.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

List of records for which signed file upload URLs are requested.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

List of records for which signed file upload URLs are requested.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(FileUploadRecord records) { + this.records.add(records); + return this; + } + + /** + *

List of records for which signed file upload URLs are requested.

+ */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public FileUploadRequest build() { + return new FileUploadRequest(vaultId, records, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java deleted file mode 100644 index cde24227..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = GetRunRequest.Builder.class) -public final class GetRunRequest { - private final Optional vaultId; - - private final Map additionalProperties; - - private GetRunRequest(Optional vaultId, Map additionalProperties) { - this.vaultId = vaultId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("vault_id") - public Optional getVaultId() { - return vaultId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof GetRunRequest && equalTo((GetRunRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(GetRunRequest other) { - return vaultId.equals(other.vaultId); - } - - @Override - public int hashCode() { - return Objects.hash(this.vaultId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional vaultId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(GetRunRequest other) { - vaultId(other.getVaultId()); - return this; - } - - @JsonSetter(value = "vault_id", nulls = Nulls.SKIP) - public Builder vaultId(Optional vaultId) { - this.vaultId = vaultId; - return this; - } - - public Builder vaultId(String vaultId) { - this.vaultId = Optional.ofNullable(vaultId); - return this; - } - - public GetRunRequest build() { - return new GetRunRequest(vaultId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java deleted file mode 100644 index 5cd22747..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java +++ /dev/null @@ -1,166 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.FileDataReidentifyFile; -import com.skyflow.generated.rest.types.Format; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ReidentifyFileRequestReidentifyFile.Builder.class) -public final class ReidentifyFileRequestReidentifyFile { - private final FileDataReidentifyFile file; - - private final String vaultId; - - private final Optional format; - - private final Map additionalProperties; - - private ReidentifyFileRequestReidentifyFile( - FileDataReidentifyFile file, - String vaultId, - Optional format, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.format = format; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataReidentifyFile getFile() { - return file; - } - - /** - * @return ID of the vault where the entities are stored. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - @JsonProperty("format") - public Optional getFormat() { - return format; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ReidentifyFileRequestReidentifyFile - && equalTo((ReidentifyFileRequestReidentifyFile) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ReidentifyFileRequestReidentifyFile other) { - return file.equals(other.file) && vaultId.equals(other.vaultId) && format.equals(other.format); - } - - @Override - public int hashCode() { - return Objects.hash(this.file, this.vaultId, this.format); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataReidentifyFile file); - - Builder from(ReidentifyFileRequestReidentifyFile other); - } - - public interface VaultIdStage { - /** - * ID of the vault where the entities are stored. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - ReidentifyFileRequestReidentifyFile build(); - - _FinalStage format(Optional format); - - _FinalStage format(Format format); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataReidentifyFile file; - - private String vaultId; - - private Optional format = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(ReidentifyFileRequestReidentifyFile other) { - file(other.getFile()); - vaultId(other.getVaultId()); - format(other.getFormat()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataReidentifyFile file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of the vault where the entities are stored.

ID of the vault where the entities are stored.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - @Override - public _FinalStage format(Format format) { - this.format = Optional.ofNullable(format); - return this; - } - - @Override - @JsonSetter(value = "format", nulls = Nulls.SKIP) - public _FinalStage format(Optional format) { - this.format = format; - return this; - } - - @Override - public ReidentifyFileRequestReidentifyFile build() { - return new ReidentifyFileRequestReidentifyFile(file, vaultId, format, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java similarity index 60% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java index 81a9f837..3d25a53b 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java @@ -1,46 +1,55 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.rest.resources.records.requests; - -import com.fasterxml.jackson.annotation.*; +package com.skyflow.generated.rest.resources.files.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; +import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = UploadFileV2Request.Builder.class) -public final class UploadFileV2Request { +@JsonDeserialize(builder = UploadFileRequestV2.Builder.class) +public final class UploadFileRequestV2 { private final String tableName; private final String columnName; private final Optional skyflowId; + private final String file; + private final Optional returnFileMetadata; private final Map additionalProperties; - private UploadFileV2Request( + private UploadFileRequestV2( String tableName, String columnName, Optional skyflowId, + String file, Optional returnFileMetadata, Map additionalProperties) { this.tableName = tableName; this.columnName = columnName; this.skyflowId = skyflowId; + this.file = file; this.returnFileMetadata = returnFileMetadata; this.additionalProperties = additionalProperties; } /** - * @return Name of the table to upload the file to. + * @return Name of the table. */ @JsonProperty("tableName") public String getTableName() { @@ -48,7 +57,7 @@ public String getTableName() { } /** - * @return Name of the column to upload the file to. The column must have a file data type. + * @return Name of the column that contains the file. */ @JsonProperty("columnName") public String getColumnName() { @@ -56,13 +65,21 @@ public String getColumnName() { } /** - * @return Skyflow ID of the record to upload the file to. If skyflowID isn't specified, a new record will be created. + * @return ID of the record to update. */ @JsonProperty("skyflowID") public Optional getSkyflowId() { return skyflowId; } + /** + * @return Path of the file to upload. Each request only supports one file. + */ + @JsonProperty("file") + public String getFile() { + return file; + } + /** * @return If true, returns metadata about the uploaded file. */ @@ -71,10 +88,10 @@ public Optional getReturnFileMetadata() { return returnFileMetadata; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof UploadFileV2Request && equalTo((UploadFileV2Request) other); + return other instanceof UploadFileRequestV2 && equalTo((UploadFileRequestV2) other); } @JsonAnyGetter @@ -82,19 +99,20 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(UploadFileV2Request other) { + private boolean equalTo(UploadFileRequestV2 other) { return tableName.equals(other.tableName) && columnName.equals(other.columnName) && skyflowId.equals(other.skyflowId) + && file.equals(other.file) && returnFileMetadata.equals(other.returnFileMetadata); } - @Override + @java.lang.Override public int hashCode() { - return Objects.hash(this.tableName, this.columnName, this.skyflowId, this.returnFileMetadata); + return Objects.hash(this.tableName, this.columnName, this.skyflowId, this.file, this.returnFileMetadata); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -105,25 +123,36 @@ public static TableNameStage builder() { public interface TableNameStage { /** - * Name of the table to upload the file to. + *

Name of the table.

*/ ColumnNameStage tableName(@NotNull String tableName); - Builder from(UploadFileV2Request other); + Builder from(UploadFileRequestV2 other); } public interface ColumnNameStage { /** - * Name of the column to upload the file to. The column must have a `file` data type. + *

Name of the column that contains the file.

*/ - _FinalStage columnName(@NotNull String columnName); + FileStage columnName(@NotNull String columnName); + } + + public interface FileStage { + /** + *

Path of the file to upload. Each request only supports one file.

+ */ + _FinalStage file(@NotNull String file); } public interface _FinalStage { - UploadFileV2Request build(); + UploadFileRequestV2 build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); /** - *

Skyflow ID of the record to upload the file to. If skyflowID isn't specified, a new record will be created.

+ *

ID of the record to update.

*/ _FinalStage skyflowId(Optional skyflowId); @@ -138,11 +167,13 @@ public interface _FinalStage { } @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TableNameStage, ColumnNameStage, _FinalStage { + public static final class Builder implements TableNameStage, ColumnNameStage, FileStage, _FinalStage { private String tableName; private String columnName; + private String file; + private Optional returnFileMetadata = Optional.empty(); private Optional skyflowId = Optional.empty(); @@ -152,20 +183,21 @@ public static final class Builder implements TableNameStage, ColumnNameStage, _F private Builder() {} - @Override - public Builder from(UploadFileV2Request other) { + @java.lang.Override + public Builder from(UploadFileRequestV2 other) { tableName(other.getTableName()); columnName(other.getColumnName()); skyflowId(other.getSkyflowId()); + file(other.getFile()); returnFileMetadata(other.getReturnFileMetadata()); return this; } /** - * Name of the table to upload the file to.

Name of the table to upload the file to.

+ *

Name of the table.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override @JsonSetter("tableName") public ColumnNameStage tableName(@NotNull String tableName) { this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); @@ -173,21 +205,32 @@ public ColumnNameStage tableName(@NotNull String tableName) { } /** - * Name of the column to upload the file to. The column must have a `file` data type.

Name of the column to upload the file to. The column must have a file data type.

+ *

Name of the column that contains the file.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override @JsonSetter("columnName") - public _FinalStage columnName(@NotNull String columnName) { + public FileStage columnName(@NotNull String columnName) { this.columnName = Objects.requireNonNull(columnName, "columnName must not be null"); return this; } + /** + *

Path of the file to upload. Each request only supports one file.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("file") + public _FinalStage file(@NotNull String file) { + this.file = Objects.requireNonNull(file, "file must not be null"); + return this; + } + /** *

If true, returns metadata about the uploaded file.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override public _FinalStage returnFileMetadata(Boolean returnFileMetadata) { this.returnFileMetadata = Optional.ofNullable(returnFileMetadata); return this; @@ -196,7 +239,7 @@ public _FinalStage returnFileMetadata(Boolean returnFileMetadata) { /** *

If true, returns metadata about the uploaded file.

*/ - @Override + @java.lang.Override @JsonSetter(value = "returnFileMetadata", nulls = Nulls.SKIP) public _FinalStage returnFileMetadata(Optional returnFileMetadata) { this.returnFileMetadata = returnFileMetadata; @@ -204,28 +247,41 @@ public _FinalStage returnFileMetadata(Optional returnFileMetadata) { } /** - *

Skyflow ID of the record to upload the file to. If skyflowID isn't specified, a new record will be created.

+ *

ID of the record to update.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override public _FinalStage skyflowId(String skyflowId) { this.skyflowId = Optional.ofNullable(skyflowId); return this; } /** - *

Skyflow ID of the record to upload the file to. If skyflowID isn't specified, a new record will be created.

+ *

ID of the record to update.

*/ - @Override + @java.lang.Override @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) public _FinalStage skyflowId(Optional skyflowId) { this.skyflowId = skyflowId; return this; } - @Override - public UploadFileV2Request build() { - return new UploadFileV2Request(tableName, columnName, skyflowId, returnFileMetadata, additionalProperties); + @java.lang.Override + public UploadFileRequestV2 build() { + return new UploadFileRequestV2( + tableName, columnName, skyflowId, file, returnFileMetadata, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java deleted file mode 100644 index 0335ac47..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java deleted file mode 100644 index 22a948ca..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription { - TRANSCRIPTION("transcription"), - - MEDICAL_TRANSCRIPTION("medical_transcription"), - - DIARIZED_TRANSCRIPTION("diarized_transcription"), - - MEDICAL_DIARIZED_TRANSCRIPTION("medical_diarized_transcription"); - - private final String value; - - DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java deleted file mode 100644 index aa6c578d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java deleted file mode 100644 index 5e08b9db..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileImageRequestDeidentifyImageEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileImageRequestDeidentifyImageEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java deleted file mode 100644 index d97b3191..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileImageRequestDeidentifyImageMaskingMethod { - BLUR("blur"), - - BLACKBOX("blackbox"); - - private final String value; - - DeidentifyFileImageRequestDeidentifyImageMaskingMethod(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java deleted file mode 100644 index 5089bc83..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifyDocumentEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifyDocumentEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java deleted file mode 100644 index a7682795..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifyPresentationEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifyPresentationEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java deleted file mode 100644 index 96a55f5a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java deleted file mode 100644 index aff014d8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java deleted file mode 100644 index b0326561..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifyTextEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifyTextEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java deleted file mode 100644 index 9c9c84c2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java deleted file mode 100644 index fa45ee60..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; -import com.skyflow.generated.rest.types.DetectGuardrailsResponse; - -import java.util.concurrent.CompletableFuture; - -public class AsyncGuardrailsClient { - protected final ClientOptions clientOptions; - - private final AsyncRawGuardrailsClient rawClient; - - public AsyncGuardrailsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new AsyncRawGuardrailsClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public AsyncRawGuardrailsClient withRawResponse() { - return this.rawClient; - } - - /** - * Preserve safety and compliance with usage policies. - */ - public CompletableFuture checkGuardrails(DetectGuardrailsRequest request) { - return this.rawClient.checkGuardrails(request).thenApply(response -> response.body()); - } - - /** - * Preserve safety and compliance with usage policies. - */ - public CompletableFuture checkGuardrails( - DetectGuardrailsRequest request, RequestOptions requestOptions) { - return this.rawClient.checkGuardrails(request, requestOptions).thenApply(response -> response.body()); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java deleted file mode 100644 index 80853472..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.InternalServerError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; -import com.skyflow.generated.rest.types.DetectGuardrailsResponse; -import com.skyflow.generated.rest.types.ErrorResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; - -public class AsyncRawGuardrailsClient { - protected final ClientOptions clientOptions; - - public AsyncRawGuardrailsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * Preserve safety and compliance with usage policies. - */ - public CompletableFuture> checkGuardrails( - DetectGuardrailsRequest request) { - return checkGuardrails(request, null); - } - - /** - * Preserve safety and compliance with usage policies. - */ - public CompletableFuture> checkGuardrails( - DetectGuardrailsRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/guardrails") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DetectGuardrailsResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java deleted file mode 100644 index 5068196c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; -import com.skyflow.generated.rest.types.DetectGuardrailsResponse; - -public class GuardrailsClient { - protected final ClientOptions clientOptions; - - private final RawGuardrailsClient rawClient; - - public GuardrailsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new RawGuardrailsClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public RawGuardrailsClient withRawResponse() { - return this.rawClient; - } - - /** - * Preserve safety and compliance with usage policies. - */ - public DetectGuardrailsResponse checkGuardrails(DetectGuardrailsRequest request) { - return this.rawClient.checkGuardrails(request).body(); - } - - /** - * Preserve safety and compliance with usage policies. - */ - public DetectGuardrailsResponse checkGuardrails(DetectGuardrailsRequest request, RequestOptions requestOptions) { - return this.rawClient.checkGuardrails(request, requestOptions).body(); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java deleted file mode 100644 index 5bf5c31a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.InternalServerError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; -import com.skyflow.generated.rest.types.DetectGuardrailsResponse; -import com.skyflow.generated.rest.types.ErrorResponse; -import okhttp3.*; - -import java.io.IOException; - -public class RawGuardrailsClient { - protected final ClientOptions clientOptions; - - public RawGuardrailsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * Preserve safety and compliance with usage policies. - */ - public ApiClientHttpResponse checkGuardrails(DetectGuardrailsRequest request) { - return checkGuardrails(request, null); - } - - /** - * Preserve safety and compliance with usage policies. - */ - public ApiClientHttpResponse checkGuardrails( - DetectGuardrailsRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/guardrails") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DetectGuardrailsResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java deleted file mode 100644 index 75250f8c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java +++ /dev/null @@ -1,228 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DetectGuardrailsRequest.Builder.class) -public final class DetectGuardrailsRequest { - private final String text; - - private final Optional checkToxicity; - - private final Optional> denyTopics; - - private final String vaultId; - - private final Map additionalProperties; - - private DetectGuardrailsRequest( - String text, - Optional checkToxicity, - Optional> denyTopics, - String vaultId, - Map additionalProperties) { - this.text = text; - this.checkToxicity = checkToxicity; - this.denyTopics = denyTopics; - this.vaultId = vaultId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Text to check against guardrails. - */ - @JsonProperty("text") - public String getText() { - return text; - } - - /** - * @return If true, checks for toxicity in the text. - */ - @JsonProperty("check_toxicity") - public Optional getCheckToxicity() { - return checkToxicity; - } - - /** - * @return List of topics to deny. - */ - @JsonProperty("deny_topics") - public Optional> getDenyTopics() { - return denyTopics; - } - - /** - * @return ID of the vault. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DetectGuardrailsRequest && equalTo((DetectGuardrailsRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DetectGuardrailsRequest other) { - return text.equals(other.text) - && checkToxicity.equals(other.checkToxicity) - && denyTopics.equals(other.denyTopics) - && vaultId.equals(other.vaultId); - } - - @Override - public int hashCode() { - return Objects.hash(this.text, this.checkToxicity, this.denyTopics, this.vaultId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static TextStage builder() { - return new Builder(); - } - - public interface TextStage { - /** - * Text to check against guardrails. - */ - VaultIdStage text(@NotNull String text); - - Builder from(DetectGuardrailsRequest other); - } - - public interface VaultIdStage { - /** - * ID of the vault. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DetectGuardrailsRequest build(); - - /** - *

If true, checks for toxicity in the text.

- */ - _FinalStage checkToxicity(Optional checkToxicity); - - _FinalStage checkToxicity(Boolean checkToxicity); - - /** - *

List of topics to deny.

- */ - _FinalStage denyTopics(Optional> denyTopics); - - _FinalStage denyTopics(List denyTopics); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TextStage, VaultIdStage, _FinalStage { - private String text; - - private String vaultId; - - private Optional> denyTopics = Optional.empty(); - - private Optional checkToxicity = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DetectGuardrailsRequest other) { - text(other.getText()); - checkToxicity(other.getCheckToxicity()); - denyTopics(other.getDenyTopics()); - vaultId(other.getVaultId()); - return this; - } - - /** - * Text to check against guardrails.

Text to check against guardrails.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("text") - public VaultIdStage text(@NotNull String text) { - this.text = Objects.requireNonNull(text, "text must not be null"); - return this; - } - - /** - * ID of the vault.

ID of the vault.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

List of topics to deny.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage denyTopics(List denyTopics) { - this.denyTopics = Optional.ofNullable(denyTopics); - return this; - } - - /** - *

List of topics to deny.

- */ - @Override - @JsonSetter(value = "deny_topics", nulls = Nulls.SKIP) - public _FinalStage denyTopics(Optional> denyTopics) { - this.denyTopics = denyTopics; - return this; - } - - /** - *

If true, checks for toxicity in the text.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage checkToxicity(Boolean checkToxicity) { - this.checkToxicity = Optional.ofNullable(checkToxicity); - return this; - } - - /** - *

If true, checks for toxicity in the text.

- */ - @Override - @JsonSetter(value = "check_toxicity", nulls = Nulls.SKIP) - public _FinalStage checkToxicity(Optional checkToxicity) { - this.checkToxicity = checkToxicity; - return this; - } - - @Override - public DetectGuardrailsRequest build() { - return new DetectGuardrailsRequest(text, checkToxicity, denyTopics, vaultId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java index cab967a7..e2f24865 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java @@ -5,9 +5,8 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.types.V1GetQueryResponse; - +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.types.GetQueryResponse; import java.util.concurrent.CompletableFuture; public class AsyncQueryClient { @@ -28,27 +27,17 @@ public AsyncRawQueryClient withRawResponse() { } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> - */ - public CompletableFuture queryServiceExecuteQuery(String vaultId) { - return this.rawClient.queryServiceExecuteQuery(vaultId).thenApply(response -> response.body()); - } - - /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
  • Can return redacted record values.
  • Supports only the SELECT command.
  • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
  • Can't modify the vault or perform transactions.
  • Can't return tokens.
  • Can't return file download or render URLs.
  • Doesn't support the WHERE keyword with columns using transient tokenization.
  • Doesn't support ? conditional for columns with column-level encryption disabled.
    • */ - public CompletableFuture queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request) { - return this.rawClient.queryServiceExecuteQuery(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture executeQuery(String vaultId, GetQueryRequest request) { + return this.rawClient.executeQuery(vaultId, request).thenApply(response -> response.body()); } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
      • Can return redacted record values.
      • Supports only the SELECT command.
      • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
      • Can't modify the vault or perform transactions.
      • Can't return tokens.
      • Can't return file download or render URLs.
      • Doesn't support the WHERE keyword with columns using transient tokenization.
      • Doesn't support ? conditional for columns with column-level encryption disabled.
        • */ - public CompletableFuture queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request, RequestOptions requestOptions) { - return this.rawClient - .queryServiceExecuteQuery(vaultId, request, requestOptions) - .thenApply(response -> response.body()); + public CompletableFuture executeQuery( + String vaultId, GetQueryRequest request, RequestOptions requestOptions) { + return this.rawClient.executeQuery(vaultId, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java index 7b8c9383..dbd40180 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java @@ -4,15 +4,32 @@ package com.skyflow.generated.rest.resources.query; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.errors.BadRequestError; +import com.skyflow.generated.rest.errors.InternalServerError; +import com.skyflow.generated.rest.errors.UnauthorizedError; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.GetQueryResponse; import java.io.IOException; import java.util.concurrent.CompletableFuture; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; public class AsyncRawQueryClient { protected final ClientOptions clientOptions; @@ -22,32 +39,28 @@ public AsyncRawQueryClient(ClientOptions clientOptions) { } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> - */ - public CompletableFuture> queryServiceExecuteQuery(String vaultId) { - return queryServiceExecuteQuery( - vaultId, QueryServiceExecuteQueryBody.builder().build()); - } - - /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
          • Can return redacted record values.
          • Supports only the SELECT command.
          • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
          • Can't modify the vault or perform transactions.
          • Can't return tokens.
          • Can't return file download or render URLs.
          • Doesn't support the WHERE keyword with columns using transient tokenization.
          • Doesn't support ? conditional for columns with column-level encryption disabled.
            • */ - public CompletableFuture> queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request) { - return queryServiceExecuteQuery(vaultId, request, null); + public CompletableFuture> executeQuery( + String vaultId, GetQueryRequest request) { + return executeQuery(vaultId, request, null); } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
              • Can return redacted record values.
              • Supports only the SELECT command.
              • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
              • Can't modify the vault or perform transactions.
              • Can't return tokens.
              • Can't return file download or render URLs.
              • Doesn't support the WHERE keyword with columns using transient tokenization.
              • Doesn't support ? conditional for columns with column-level encryption disabled.
                • */ - public CompletableFuture> queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> executeQuery( + String vaultId, GetQueryRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("query") - .build(); + .addPathSegments("query"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -56,7 +69,7 @@ public CompletableFuture> queryService throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -66,33 +79,55 @@ public CompletableFuture> queryService if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1GetQueryResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetQueryResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java index 39bb709d..f0444e50 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java @@ -5,8 +5,8 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.types.V1GetQueryResponse; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.types.GetQueryResponse; public class QueryClient { protected final ClientOptions clientOptions; @@ -26,26 +26,16 @@ public RawQueryClient withRawResponse() { } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
                  • Can return redacted record values.
                  • Supports only the SELECT command.
                  • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
                  • Can't modify the vault or perform transactions.
                  • Can't return tokens.
                  • Can't return file download or render URLs.
                  • Doesn't support the WHERE keyword with columns using transient tokenization.
                  • Doesn't support ? conditional for columns with column-level encryption disabled.
                    • */ - public V1GetQueryResponse queryServiceExecuteQuery(String vaultId) { - return this.rawClient.queryServiceExecuteQuery(vaultId).body(); + public GetQueryResponse executeQuery(String vaultId, GetQueryRequest request) { + return this.rawClient.executeQuery(vaultId, request).body(); } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
                      • Can return redacted record values.
                      • Supports only the SELECT command.
                      • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
                      • Can't modify the vault or perform transactions.
                      • Can't return tokens.
                      • Can't return file download or render URLs.
                      • Doesn't support the WHERE keyword with columns using transient tokenization.
                      • Doesn't support ? conditional for columns with column-level encryption disabled.
                        • */ - public V1GetQueryResponse queryServiceExecuteQuery(String vaultId, QueryServiceExecuteQueryBody request) { - return this.rawClient.queryServiceExecuteQuery(vaultId, request).body(); - } - - /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> - */ - public V1GetQueryResponse queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request, RequestOptions requestOptions) { - return this.rawClient - .queryServiceExecuteQuery(vaultId, request, requestOptions) - .body(); + public GetQueryResponse executeQuery(String vaultId, GetQueryRequest request, RequestOptions requestOptions) { + return this.rawClient.executeQuery(vaultId, request, requestOptions).body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java index ec88ae93..a63af329 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java @@ -4,13 +4,28 @@ package com.skyflow.generated.rest.resources.query; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import okhttp3.*; - +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.errors.BadRequestError; +import com.skyflow.generated.rest.errors.InternalServerError; +import com.skyflow.generated.rest.errors.UnauthorizedError; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.GetQueryResponse; import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; public class RawQueryClient { protected final ClientOptions clientOptions; @@ -20,32 +35,27 @@ public RawQueryClient(ClientOptions clientOptions) { } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> - */ - public ApiClientHttpResponse queryServiceExecuteQuery(String vaultId) { - return queryServiceExecuteQuery( - vaultId, QueryServiceExecuteQueryBody.builder().build()); - } - - /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
                          • Can return redacted record values.
                          • Supports only the SELECT command.
                          • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
                          • Can't modify the vault or perform transactions.
                          • Can't return tokens.
                          • Can't return file download or render URLs.
                          • Doesn't support the WHERE keyword with columns using transient tokenization.
                          • Doesn't support ? conditional for columns with column-level encryption disabled.
                            • */ - public ApiClientHttpResponse queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request) { - return queryServiceExecuteQuery(vaultId, request, null); + public ApiClientHttpResponse executeQuery(String vaultId, GetQueryRequest request) { + return executeQuery(vaultId, request, null); } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
                              • Can return redacted record values.
                              • Supports only the SELECT command.
                              • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
                              • Can't modify the vault or perform transactions.
                              • Can't return tokens.
                              • Can't return file download or render URLs.
                              • Doesn't support the WHERE keyword with columns using transient tokenization.
                              • Doesn't support ? conditional for columns with column-level encryption disabled.
                                • */ - public ApiClientHttpResponse queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse executeQuery( + String vaultId, GetQueryRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("query") - .build(); + .addPathSegments("query"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -54,7 +64,7 @@ public ApiClientHttpResponse queryServiceExecuteQuery( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -64,26 +74,42 @@ public ApiClientHttpResponse queryServiceExecuteQuery( if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1GetQueryResponse.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetQueryResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/ExecuteQueryRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/ExecuteQueryRequest.java new file mode 100644 index 00000000..2d9c81c0 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/ExecuteQueryRequest.java @@ -0,0 +1,160 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.query.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ExecuteQueryRequest.Builder.class) +public final class ExecuteQueryRequest { + private final String vaultId; + + private final String query; + + private final Map additionalProperties; + + private ExecuteQueryRequest(String vaultId, String query, Map additionalProperties) { + this.vaultId = vaultId; + this.query = query; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault where the query is being performed. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Query to perform. + */ + @JsonProperty("query") + public String getQuery() { + return query; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ExecuteQueryRequest && equalTo((ExecuteQueryRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ExecuteQueryRequest other) { + return vaultId.equals(other.vaultId) && query.equals(other.query); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.query); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault where the query is being performed.

                                  + */ + QueryStage vaultId(@NotNull String vaultId); + + Builder from(ExecuteQueryRequest other); + } + + public interface QueryStage { + /** + *

                                  Query to perform.

                                  + */ + _FinalStage query(@NotNull String query); + } + + public interface _FinalStage { + ExecuteQueryRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, QueryStage, _FinalStage { + private String vaultId; + + private String query; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ExecuteQueryRequest other) { + vaultId(other.getVaultId()); + query(other.getQuery()); + return this; + } + + /** + *

                                  ID of the vault where the query is being performed.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public QueryStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Query to perform.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("query") + public _FinalStage query(@NotNull String query) { + this.query = Objects.requireNonNull(query, "query must not be null"); + return this; + } + + @java.lang.Override + public ExecuteQueryRequest build() { + return new ExecuteQueryRequest(vaultId, query, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/GetQueryRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/GetQueryRequest.java new file mode 100644 index 00000000..03e15fa6 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/GetQueryRequest.java @@ -0,0 +1,128 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.query.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetQueryRequest.Builder.class) +public final class GetQueryRequest { + private final String query; + + private final Map additionalProperties; + + private GetQueryRequest(String query, Map additionalProperties) { + this.query = query; + this.additionalProperties = additionalProperties; + } + + /** + * @return The SQL query to execute.

                                  Supported commands:
                                  • SELECT
                                  Supported operators:
                                  • >
                                  • <
                                  • =
                                  • AND
                                  • OR
                                  • NOT
                                  • LIKE
                                  • ILIKE
                                  • NULL
                                  • NOT NULL
                                  Supported keywords:
                                  • FROM
                                  • JOIN
                                  • INNER JOIN
                                  • LEFT OUTER JOIN
                                  • LEFT JOIN
                                  • RIGHT OUTER JOIN
                                  • RIGHT JOIN
                                  • FULL OUTER JOIN
                                  • FULL JOIN
                                  • OFFSET
                                  • LIMIT
                                  • WHERE
                                  Supported functions:
                                  • AVG()
                                  • SUM()
                                  • COUNT()
                                  • MIN()
                                  • MAX()
                                  • REDACTION()
                                  + */ + @JsonProperty("query") + public String getQuery() { + return query; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetQueryRequest && equalTo((GetQueryRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetQueryRequest other) { + return query.equals(other.query); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.query); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static QueryStage builder() { + return new Builder(); + } + + public interface QueryStage { + /** + *

                                  The SQL query to execute.

                                  Supported commands:

                                  • SELECT
                                  Supported operators:
                                  • >
                                  • <
                                  • =
                                  • AND
                                  • OR
                                  • NOT
                                  • LIKE
                                  • ILIKE
                                  • NULL
                                  • NOT NULL
                                  Supported keywords:
                                  • FROM
                                  • JOIN
                                  • INNER JOIN
                                  • LEFT OUTER JOIN
                                  • LEFT JOIN
                                  • RIGHT OUTER JOIN
                                  • RIGHT JOIN
                                  • FULL OUTER JOIN
                                  • FULL JOIN
                                  • OFFSET
                                  • LIMIT
                                  • WHERE
                                  Supported functions:
                                  • AVG()
                                  • SUM()
                                  • COUNT()
                                  • MIN()
                                  • MAX()
                                  • REDACTION()

                                  + */ + _FinalStage query(@NotNull String query); + + Builder from(GetQueryRequest other); + } + + public interface _FinalStage { + GetQueryRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements QueryStage, _FinalStage { + private String query; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetQueryRequest other) { + query(other.getQuery()); + return this; + } + + /** + *

                                  The SQL query to execute.

                                  Supported commands:

                                  • SELECT
                                  Supported operators:
                                  • >
                                  • <
                                  • =
                                  • AND
                                  • OR
                                  • NOT
                                  • LIKE
                                  • ILIKE
                                  • NULL
                                  • NOT NULL
                                  Supported keywords:
                                  • FROM
                                  • JOIN
                                  • INNER JOIN
                                  • LEFT OUTER JOIN
                                  • LEFT JOIN
                                  • RIGHT OUTER JOIN
                                  • RIGHT JOIN
                                  • FULL OUTER JOIN
                                  • FULL JOIN
                                  • OFFSET
                                  • LIMIT
                                  • WHERE
                                  Supported functions:
                                  • AVG()
                                  • SUM()
                                  • COUNT()
                                  • MIN()
                                  • MAX()
                                  • REDACTION()

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("query") + public _FinalStage query(@NotNull String query) { + this.query = Objects.requireNonNull(query, "query must not be null"); + return this; + } + + @java.lang.Override + public GetQueryRequest build() { + return new GetQueryRequest(query, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java deleted file mode 100644 index 000cd685..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.query.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = QueryServiceExecuteQueryBody.Builder.class) -public final class QueryServiceExecuteQueryBody { - private final Optional query; - - private final Map additionalProperties; - - private QueryServiceExecuteQueryBody(Optional query, Map additionalProperties) { - this.query = query; - this.additionalProperties = additionalProperties; - } - - /** - * @return The SQL query to execute.<br><br><b>Supported commands:</b> <ul> <li><code>SELECT</code></li> </ul> <b>Supported operators:</b> <ul> <li><code>></code></li> <li><code><</code></li> <li><code>=</code></li> <li><code>AND</code></li> <li><code>OR</code></li> <li><code>NOT</code></li> <li><code>LIKE</code></li> <li><code>ILIKE</code></li> <li><code>NULL</code></li> <li><code>NOT NULL</code></li> </ul> <b>Supported keywords:</b> <ul> <li><code>FROM</code></li> <li><code>JOIN</code></li> <li><code>INNER JOIN</code></li> <li><code>LEFT OUTER JOIN</code></li> <li><code>LEFT JOIN</code></li> <li><code>RIGHT OUTER JOIN</code></li> <li><code>RIGHT JOIN</code></li> <li><code>FULL OUTER JOIN</code></li> <li><code>FULL JOIN</code></li> <li><code>OFFSET</code></li> <li><code>LIMIT</code></li> <li><code>WHERE</code></li> </ul> <b>Supported functions:</b> <ul> <li><code>AVG()</code></li> <li><code>SUM()</code></li> <li><code>COUNT()</code></li> <li><code>MIN()</code></li> <li><code>MAX()</code></li> <li><code>REDACTION()</code></li> </ul> - */ - @JsonProperty("query") - public Optional getQuery() { - return query; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof QueryServiceExecuteQueryBody && equalTo((QueryServiceExecuteQueryBody) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(QueryServiceExecuteQueryBody other) { - return query.equals(other.query); - } - - @Override - public int hashCode() { - return Objects.hash(this.query); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional query = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(QueryServiceExecuteQueryBody other) { - query(other.getQuery()); - return this; - } - - /** - *

                                  The SQL query to execute.<br><br><b>Supported commands:</b> <ul> <li><code>SELECT</code></li> </ul> <b>Supported operators:</b> <ul> <li><code>></code></li> <li><code><</code></li> <li><code>=</code></li> <li><code>AND</code></li> <li><code>OR</code></li> <li><code>NOT</code></li> <li><code>LIKE</code></li> <li><code>ILIKE</code></li> <li><code>NULL</code></li> <li><code>NOT NULL</code></li> </ul> <b>Supported keywords:</b> <ul> <li><code>FROM</code></li> <li><code>JOIN</code></li> <li><code>INNER JOIN</code></li> <li><code>LEFT OUTER JOIN</code></li> <li><code>LEFT JOIN</code></li> <li><code>RIGHT OUTER JOIN</code></li> <li><code>RIGHT JOIN</code></li> <li><code>FULL OUTER JOIN</code></li> <li><code>FULL JOIN</code></li> <li><code>OFFSET</code></li> <li><code>LIMIT</code></li> <li><code>WHERE</code></li> </ul> <b>Supported functions:</b> <ul> <li><code>AVG()</code></li> <li><code>SUM()</code></li> <li><code>COUNT()</code></li> <li><code>MIN()</code></li> <li><code>MAX()</code></li> <li><code>REDACTION()</code></li> </ul>

                                  - */ - @JsonSetter(value = "query", nulls = Nulls.SKIP) - public Builder query(Optional query) { - this.query = query; - return this; - } - - public Builder query(String query) { - this.query = Optional.ofNullable(query); - return this; - } - - public QueryServiceExecuteQueryBody build() { - return new QueryServiceExecuteQueryBody(query, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java index b1c9ae18..d9cf1510 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java @@ -4,21 +4,46 @@ package com.skyflow.generated.rest.resources.records; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.QueryStringMapper; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.records.requests.*; -import com.skyflow.generated.rest.types.*; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.File; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.DeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordByIdRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.DeleteRecordResponse; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; import java.io.IOException; -import java.nio.file.Files; -import java.util.Optional; import java.util.concurrent.CompletableFuture; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; public class AsyncRawRecordsClient { protected final ClientOptions clientOptions; @@ -30,30 +55,25 @@ public AsyncRawRecordsClient(ClientOptions clientOptions) { /** * Performs multiple record operations in a single transaction. */ - public CompletableFuture> recordServiceBatchOperation( - String vaultId) { - return recordServiceBatchOperation( - vaultId, RecordServiceBatchOperationBody.builder().build()); + public CompletableFuture> batchOperation( + String vaultId, BatchOperationRequest request) { + return batchOperation(vaultId, request, null); } /** * Performs multiple record operations in a single transaction. */ - public CompletableFuture> recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request) { - return recordServiceBatchOperation(vaultId, request, null); - } - - /** - * Performs multiple record operations in a single transaction. - */ - public CompletableFuture> recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> batchOperation( + String vaultId, BatchOperationRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .build(); + .addPathSegment(vaultId); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -62,7 +82,7 @@ public CompletableFuture> record throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -72,34 +92,60 @@ public CompletableFuture> record if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1BatchOperationResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BatchOperationResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -114,30 +160,34 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture> recordServiceBulkGetRecord( + public CompletableFuture> getRecords( String vaultId, String objectName) { - return recordServiceBulkGetRecord( - vaultId, objectName, RecordServiceBulkGetRecordRequest.builder().build()); + return getRecords(vaultId, objectName, GetRecordsRequest.builder().build()); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture> recordServiceBulkGetRecord( - String vaultId, String objectName, RecordServiceBulkGetRecordRequest request) { - return recordServiceBulkGetRecord(vaultId, objectName, request, null); + public CompletableFuture> getRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return getRecords(vaultId, objectName, GetRecordsRequest.builder().build(), requestOptions); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture> recordServiceBulkGetRecord( - String vaultId, - String objectName, - RecordServiceBulkGetRecordRequest request, - RequestOptions requestOptions) { + public CompletableFuture> getRecords( + String vaultId, String objectName, GetRecordsRequest request) { + return getRecords(vaultId, objectName, request, null); + } + + /** + * Returns the specified records from a table. + */ + public CompletableFuture> getRecords( + String vaultId, String objectName, GetRecordsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") @@ -171,6 +221,13 @@ public CompletableFuture> recordS QueryStringMapper.addQueryParameter( httpUrl, "order_by", request.getOrderBy().get(), false); } + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addQueryParameter( + httpUrl, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } if (request.getSkyflowIds().isPresent()) { QueryStringMapper.addQueryParameter( httpUrl, "skyflow_ids", request.getSkyflowIds().get(), true); @@ -183,6 +240,11 @@ public CompletableFuture> recordS QueryStringMapper.addQueryParameter( httpUrl, "column_values", request.getColumnValues().get(), true); } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl.build()) .method("GET", null) @@ -193,34 +255,60 @@ public CompletableFuture> recordS if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1BulkGetRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BulkGetRecordResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -235,33 +323,28 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public CompletableFuture> recordServiceInsertRecord( - String vaultId, String objectName) { - return recordServiceInsertRecord( - vaultId, objectName, RecordServiceInsertRecordBody.builder().build()); + public CompletableFuture> insertRecords( + String vaultId, String objectName, InsertRecordRequest request) { + return insertRecords(vaultId, objectName, request, null); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public CompletableFuture> recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request) { - return recordServiceInsertRecord(vaultId, objectName, request, null); - } - - /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. - */ - public CompletableFuture> recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> insertRecords( + String vaultId, String objectName, InsertRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegment(objectName) - .build(); + .addPathSegment(objectName); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -270,7 +353,7 @@ public CompletableFuture> recordSe throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -280,34 +363,55 @@ public CompletableFuture> recordSe if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1InsertRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, InsertRecordResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -324,34 +428,44 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { /** * Deletes the specified records from a table. */ - public CompletableFuture> recordServiceBulkDeleteRecord( + public CompletableFuture> deleteRecords( String vaultId, String objectName) { - return recordServiceBulkDeleteRecord( - vaultId, objectName, RecordServiceBulkDeleteRecordBody.builder().build()); + return deleteRecords( + vaultId, objectName, BulkDeleteRecordRequest.builder().build()); } /** * Deletes the specified records from a table. */ - public CompletableFuture> recordServiceBulkDeleteRecord( - String vaultId, String objectName, RecordServiceBulkDeleteRecordBody request) { - return recordServiceBulkDeleteRecord(vaultId, objectName, request, null); + public CompletableFuture> deleteRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return deleteRecords( + vaultId, objectName, BulkDeleteRecordRequest.builder().build(), requestOptions); } /** * Deletes the specified records from a table. */ - public CompletableFuture> recordServiceBulkDeleteRecord( - String vaultId, - String objectName, - RecordServiceBulkDeleteRecordBody request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request) { + return deleteRecords(vaultId, objectName, request, null); + } + + /** + * Deletes the specified records from a table. + */ + public CompletableFuture> deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegment(objectName) - .build(); + .addPathSegment(objectName); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -360,7 +474,7 @@ public CompletableFuture> reco throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("DELETE", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -370,34 +484,60 @@ public CompletableFuture> reco if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1BulkDeleteRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BulkDeleteRecordResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -414,29 +554,34 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { /** * Returns the specified record from a table. */ - public CompletableFuture> recordServiceGetRecord( + public CompletableFuture> getRecordById( String vaultId, String objectName, String id) { - return recordServiceGetRecord( - vaultId, objectName, id, RecordServiceGetRecordRequest.builder().build()); + return getRecordById( + vaultId, objectName, id, GetRecordByIdRequest.builder().build()); } /** * Returns the specified record from a table. */ - public CompletableFuture> recordServiceGetRecord( - String vaultId, String objectName, String id, RecordServiceGetRecordRequest request) { - return recordServiceGetRecord(vaultId, objectName, id, request, null); + public CompletableFuture> getRecordById( + String vaultId, String objectName, String id, RequestOptions requestOptions) { + return getRecordById( + vaultId, objectName, id, GetRecordByIdRequest.builder().build(), requestOptions); } /** * Returns the specified record from a table. */ - public CompletableFuture> recordServiceGetRecord( - String vaultId, - String objectName, - String id, - RecordServiceGetRecordRequest request, - RequestOptions requestOptions) { + public CompletableFuture> getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request) { + return getRecordById(vaultId, objectName, id, request, null); + } + + /** + * Returns the specified record from a table. + */ + public CompletableFuture> getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") @@ -455,10 +600,22 @@ public CompletableFuture> recordServiceGet QueryStringMapper.addQueryParameter( httpUrl, "downloadURL", request.getDownloadUrl().get(), false); } + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addQueryParameter( + httpUrl, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } if (request.getFields().isPresent()) { QueryStringMapper.addQueryParameter( httpUrl, "fields", request.getFields().get(), true); } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl.build()) .method("GET", null) @@ -469,33 +626,60 @@ public CompletableFuture> recordServiceGet if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1FieldRecords.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetFieldRecords.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -510,38 +694,47 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture> recordServiceUpdateRecord( + public CompletableFuture> updateRecord( String vaultId, String objectName, String id) { - return recordServiceUpdateRecord( - vaultId, objectName, id, RecordServiceUpdateRecordBody.builder().build()); + return updateRecord( + vaultId, objectName, id, UpdateRecordRequest.builder().build()); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture> recordServiceUpdateRecord( - String vaultId, String objectName, String id, RecordServiceUpdateRecordBody request) { - return recordServiceUpdateRecord(vaultId, objectName, id, request, null); + public CompletableFuture> updateRecord( + String vaultId, String objectName, String id, RequestOptions requestOptions) { + return updateRecord( + vaultId, objectName, id, UpdateRecordRequest.builder().build(), requestOptions); + } + + /** + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. + */ + public CompletableFuture> updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request) { + return updateRecord(vaultId, objectName, id, request, null); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture> recordServiceUpdateRecord( - String vaultId, - String objectName, - String id, - RecordServiceUpdateRecordBody request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) .addPathSegment(objectName) - .addPathSegment(id) - .build(); + .addPathSegment(id); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -550,7 +743,7 @@ public CompletableFuture> recordSe throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("PUT", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -560,34 +753,60 @@ public CompletableFuture> recordSe if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1UpdateRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, UpdateRecordResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -602,133 +821,50 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture> recordServiceDeleteRecord( + public CompletableFuture> deleteRecord( String vaultId, String objectName, String id) { - return recordServiceDeleteRecord(vaultId, objectName, id, null); + return deleteRecord( + vaultId, objectName, id, DeleteRecordRequest.builder().build()); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture> recordServiceDeleteRecord( + public CompletableFuture> deleteRecord( String vaultId, String objectName, String id, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(objectName) - .addPathSegment(id) - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("DELETE", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1DeleteRecordResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; + return deleteRecord( + vaultId, objectName, id, DeleteRecordRequest.builder().build(), requestOptions); } /** - * Uploads a file to the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture> fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file) { - return fileServiceUploadFile( - vaultId, - objectName, - id, - file, - FileServiceUploadFileRequest.builder().build()); + public CompletableFuture> deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request) { + return deleteRecord(vaultId, objectName, id, request, null); } /** - * Uploads a file to the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture> fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file, FileServiceUploadFileRequest request) { - return fileServiceUploadFile(vaultId, objectName, id, file, request, null); - } - - /** - * Uploads a file to the specified record. - */ - public CompletableFuture> fileServiceUploadFile( - String vaultId, - String objectName, - String id, - Optional file, - FileServiceUploadFileRequest request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) .addPathSegment(objectName) - .addPathSegment(id) - .addPathSegments("files") - .build(); - MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM); - try { - if (file.isPresent()) { - String fileMimeType = Files.probeContentType(file.get().toPath()); - MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; - body.addFormDataPart( - "file", file.get().getName(), RequestBody.create(file.get(), fileMimeTypeMediaType)); - } - if (request.getColumnName().isPresent()) { - QueryStringMapper.addFormDataPart( - body, "columnName", request.getColumnName().get(), false); - } - } catch (Exception e) { - throw new RuntimeException(e); + .addPathSegment(id); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); } Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl) - .method("POST", body.build()) + .url(httpUrl.build()) + .method("DELETE", null) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Accept", "application/json"); Request okhttpRequest = _requestBuilder.build(); @@ -736,270 +872,42 @@ public CompletableFuture> fileServ if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1UpdateRecordResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Deletes a file from the specified record. - */ - public CompletableFuture> fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName) { - return fileServiceDeleteFile(vaultId, tableName, id, columnName, null); - } - - /** - * Deletes a file from the specified record. - */ - public CompletableFuture> fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(tableName) - .addPathSegment(id) - .addPathSegments("files") - .addPathSegment(columnName) - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("DELETE", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DeleteFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Returns the anti-virus scan status of a file. - */ - public CompletableFuture> fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName) { - return fileServiceGetFileScanStatus(vaultId, tableName, id, columnName, null); - } - - /** - * Returns the anti-virus scan status of a file. - */ - public CompletableFuture> fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(tableName) - .addPathSegment(id) - .addPathSegments("files") - .addPathSegment(columnName) - .addPathSegments("scan-status") - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); } - CompletableFuture> future = new CompletableFuture<>(); + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1GetFileScanStatusResponse.class), - response)); - return; - } String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. - */ - public CompletableFuture> uploadFileV2( - String vaultId, File file, UploadFileV2Request request) { - return uploadFileV2(vaultId, file, request, null); - } - - /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. - */ - public CompletableFuture> uploadFileV2( - String vaultId, File file, UploadFileV2Request request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v2/vaults") - .addPathSegment(vaultId) - .addPathSegments("files/upload") - .build(); - MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM); - try { - QueryStringMapper.addFormDataPart(body, "tableName", request.getTableName(), false); - QueryStringMapper.addFormDataPart(body, "columnName", request.getColumnName(), false); - String fileMimeType = Files.probeContentType(file.toPath()); - MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; - body.addFormDataPart("file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType)); - if (request.getSkyflowId().isPresent()) { - QueryStringMapper.addFormDataPart( - body, "skyflowID", request.getSkyflowId().get(), false); - } - if (request.getReturnFileMetadata().isPresent()) { - QueryStringMapper.addFormDataPart( - body, - "returnFileMetadata", - request.getReturnFileMetadata().get(), - false); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl) - .method("POST", body.build()) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), UploadFileV2Response.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DeleteRecordResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { switch (response.code()) { case 400: future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; case 401: future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; case 404: future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; case 500: @@ -1011,12 +919,13 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java index ed7240c9..43a63d26 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java @@ -5,11 +5,20 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.records.requests.*; -import com.skyflow.generated.rest.types.*; - -import java.io.File; -import java.util.Optional; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.DeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordByIdRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.DeleteRecordResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; import java.util.concurrent.CompletableFuture; public class AsyncRecordsClient { @@ -32,287 +41,204 @@ public AsyncRawRecordsClient withRawResponse() { /** * Performs multiple record operations in a single transaction. */ - public CompletableFuture recordServiceBatchOperation(String vaultId) { - return this.rawClient.recordServiceBatchOperation(vaultId).thenApply(response -> response.body()); + public CompletableFuture batchOperation(String vaultId, BatchOperationRequest request) { + return this.rawClient.batchOperation(vaultId, request).thenApply(response -> response.body()); } /** * Performs multiple record operations in a single transaction. */ - public CompletableFuture recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request) { - return this.rawClient.recordServiceBatchOperation(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture batchOperation( + String vaultId, BatchOperationRequest request, RequestOptions requestOptions) { + return this.rawClient.batchOperation(vaultId, request, requestOptions).thenApply(response -> response.body()); } /** - * Performs multiple record operations in a single transaction. + * Returns the specified records from a table. */ - public CompletableFuture recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceBatchOperation(vaultId, request, requestOptions) - .thenApply(response -> response.body()); + public CompletableFuture getRecords(String vaultId, String objectName) { + return this.rawClient.getRecords(vaultId, objectName).thenApply(response -> response.body()); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture recordServiceBulkGetRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceBulkGetRecord(vaultId, objectName).thenApply(response -> response.body()); + public CompletableFuture getRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return this.rawClient.getRecords(vaultId, objectName, requestOptions).thenApply(response -> response.body()); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture recordServiceBulkGetRecord( - String vaultId, String objectName, RecordServiceBulkGetRecordRequest request) { - return this.rawClient - .recordServiceBulkGetRecord(vaultId, objectName, request) - .thenApply(response -> response.body()); + public CompletableFuture getRecords( + String vaultId, String objectName, GetRecordsRequest request) { + return this.rawClient.getRecords(vaultId, objectName, request).thenApply(response -> response.body()); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture recordServiceBulkGetRecord( - String vaultId, - String objectName, - RecordServiceBulkGetRecordRequest request, - RequestOptions requestOptions) { + public CompletableFuture getRecords( + String vaultId, String objectName, GetRecordsRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceBulkGetRecord(vaultId, objectName, request, requestOptions) + .getRecords(vaultId, objectName, request, requestOptions) .thenApply(response -> response.body()); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public CompletableFuture recordServiceInsertRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceInsertRecord(vaultId, objectName).thenApply(response -> response.body()); + public CompletableFuture insertRecords( + String vaultId, String objectName, InsertRecordRequest request) { + return this.rawClient.insertRecords(vaultId, objectName, request).thenApply(response -> response.body()); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public CompletableFuture recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request) { + public CompletableFuture insertRecords( + String vaultId, String objectName, InsertRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceInsertRecord(vaultId, objectName, request) + .insertRecords(vaultId, objectName, request, requestOptions) .thenApply(response -> response.body()); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Deletes the specified records from a table. */ - public CompletableFuture recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceInsertRecord(vaultId, objectName, request, requestOptions) - .thenApply(response -> response.body()); + public CompletableFuture deleteRecords(String vaultId, String objectName) { + return this.rawClient.deleteRecords(vaultId, objectName).thenApply(response -> response.body()); } /** * Deletes the specified records from a table. */ - public CompletableFuture recordServiceBulkDeleteRecord( - String vaultId, String objectName) { - return this.rawClient.recordServiceBulkDeleteRecord(vaultId, objectName).thenApply(response -> response.body()); + public CompletableFuture deleteRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return this.rawClient.deleteRecords(vaultId, objectName, requestOptions).thenApply(response -> response.body()); } /** * Deletes the specified records from a table. */ - public CompletableFuture recordServiceBulkDeleteRecord( - String vaultId, String objectName, RecordServiceBulkDeleteRecordBody request) { - return this.rawClient - .recordServiceBulkDeleteRecord(vaultId, objectName, request) - .thenApply(response -> response.body()); + public CompletableFuture deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request) { + return this.rawClient.deleteRecords(vaultId, objectName, request).thenApply(response -> response.body()); } /** * Deletes the specified records from a table. */ - public CompletableFuture recordServiceBulkDeleteRecord( - String vaultId, - String objectName, - RecordServiceBulkDeleteRecordBody request, - RequestOptions requestOptions) { + public CompletableFuture deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceBulkDeleteRecord(vaultId, objectName, request, requestOptions) + .deleteRecords(vaultId, objectName, request, requestOptions) .thenApply(response -> response.body()); } /** * Returns the specified record from a table. */ - public CompletableFuture recordServiceGetRecord(String vaultId, String objectName, String id) { - return this.rawClient.recordServiceGetRecord(vaultId, objectName, id).thenApply(response -> response.body()); + public CompletableFuture getRecordById(String vaultId, String objectName, String id) { + return this.rawClient.getRecordById(vaultId, objectName, id).thenApply(response -> response.body()); } /** * Returns the specified record from a table. */ - public CompletableFuture recordServiceGetRecord( - String vaultId, String objectName, String id, RecordServiceGetRecordRequest request) { + public CompletableFuture getRecordById( + String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .recordServiceGetRecord(vaultId, objectName, id, request) + .getRecordById(vaultId, objectName, id, requestOptions) .thenApply(response -> response.body()); } /** * Returns the specified record from a table. */ - public CompletableFuture recordServiceGetRecord( - String vaultId, - String objectName, - String id, - RecordServiceGetRecordRequest request, - RequestOptions requestOptions) { - return this.rawClient - .recordServiceGetRecord(vaultId, objectName, id, request, requestOptions) - .thenApply(response -> response.body()); - } - - /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. - */ - public CompletableFuture recordServiceUpdateRecord( - String vaultId, String objectName, String id) { - return this.rawClient.recordServiceUpdateRecord(vaultId, objectName, id).thenApply(response -> response.body()); - } - - /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. - */ - public CompletableFuture recordServiceUpdateRecord( - String vaultId, String objectName, String id, RecordServiceUpdateRecordBody request) { - return this.rawClient - .recordServiceUpdateRecord(vaultId, objectName, id, request) - .thenApply(response -> response.body()); + public CompletableFuture getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request) { + return this.rawClient.getRecordById(vaultId, objectName, id, request).thenApply(response -> response.body()); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Returns the specified record from a table. */ - public CompletableFuture recordServiceUpdateRecord( - String vaultId, - String objectName, - String id, - RecordServiceUpdateRecordBody request, - RequestOptions requestOptions) { + public CompletableFuture getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceUpdateRecord(vaultId, objectName, id, request, requestOptions) + .getRecordById(vaultId, objectName, id, request, requestOptions) .thenApply(response -> response.body()); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture recordServiceDeleteRecord( - String vaultId, String objectName, String id) { - return this.rawClient.recordServiceDeleteRecord(vaultId, objectName, id).thenApply(response -> response.body()); + public CompletableFuture updateRecord(String vaultId, String objectName, String id) { + return this.rawClient.updateRecord(vaultId, objectName, id).thenApply(response -> response.body()); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture recordServiceDeleteRecord( + public CompletableFuture updateRecord( String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .recordServiceDeleteRecord(vaultId, objectName, id, requestOptions) - .thenApply(response -> response.body()); - } - - /** - * Uploads a file to the specified record. - */ - public CompletableFuture fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file) - .thenApply(response -> response.body()); - } - - /** - * Uploads a file to the specified record. - */ - public CompletableFuture fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file, FileServiceUploadFileRequest request) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file, request) - .thenApply(response -> response.body()); - } - - /** - * Uploads a file to the specified record. - */ - public CompletableFuture fileServiceUploadFile( - String vaultId, - String objectName, - String id, - Optional file, - FileServiceUploadFileRequest request, - RequestOptions requestOptions) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file, request, requestOptions) + .updateRecord(vaultId, objectName, id, requestOptions) .thenApply(response -> response.body()); } /** - * Deletes a file from the specified record. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName) { - return this.rawClient - .fileServiceDeleteFile(vaultId, tableName, id, columnName) - .thenApply(response -> response.body()); + public CompletableFuture updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request) { + return this.rawClient.updateRecord(vaultId, objectName, id, request).thenApply(response -> response.body()); } /** - * Deletes a file from the specified record. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { + public CompletableFuture updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .fileServiceDeleteFile(vaultId, tableName, id, columnName, requestOptions) + .updateRecord(vaultId, objectName, id, request, requestOptions) .thenApply(response -> response.body()); } /** - * Returns the anti-virus scan status of a file. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName) { - return this.rawClient - .fileServiceGetFileScanStatus(vaultId, tableName, id, columnName) - .thenApply(response -> response.body()); + public CompletableFuture deleteRecord(String vaultId, String objectName, String id) { + return this.rawClient.deleteRecord(vaultId, objectName, id).thenApply(response -> response.body()); } /** - * Returns the anti-virus scan status of a file. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { + public CompletableFuture deleteRecord( + String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .fileServiceGetFileScanStatus(vaultId, tableName, id, columnName, requestOptions) + .deleteRecord(vaultId, objectName, id, requestOptions) .thenApply(response -> response.body()); } /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture uploadFileV2( - String vaultId, File file, UploadFileV2Request request) { - return this.rawClient.uploadFileV2(vaultId, file, request).thenApply(response -> response.body()); + public CompletableFuture deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request) { + return this.rawClient.deleteRecord(vaultId, objectName, id, request).thenApply(response -> response.body()); } /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture uploadFileV2( - String vaultId, File file, UploadFileV2Request request, RequestOptions requestOptions) { + public CompletableFuture deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .uploadFileV2(vaultId, file, request, requestOptions) + .deleteRecord(vaultId, objectName, id, request, requestOptions) .thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java index 29530b56..6b72953f 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java @@ -4,19 +4,42 @@ package com.skyflow.generated.rest.resources.records; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.QueryStringMapper; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.records.requests.*; -import com.skyflow.generated.rest.types.*; -import okhttp3.*; - -import java.io.File; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.DeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordByIdRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.DeleteRecordResponse; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; import java.io.IOException; -import java.nio.file.Files; -import java.util.Optional; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; public class RawRecordsClient { protected final ClientOptions clientOptions; @@ -28,29 +51,24 @@ public RawRecordsClient(ClientOptions clientOptions) { /** * Performs multiple record operations in a single transaction. */ - public ApiClientHttpResponse recordServiceBatchOperation(String vaultId) { - return recordServiceBatchOperation( - vaultId, RecordServiceBatchOperationBody.builder().build()); - } - - /** - * Performs multiple record operations in a single transaction. - */ - public ApiClientHttpResponse recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request) { - return recordServiceBatchOperation(vaultId, request, null); + public ApiClientHttpResponse batchOperation(String vaultId, BatchOperationRequest request) { + return batchOperation(vaultId, request, null); } /** * Performs multiple record operations in a single transaction. */ - public ApiClientHttpResponse recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse batchOperation( + String vaultId, BatchOperationRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .build(); + .addPathSegment(vaultId); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -59,7 +77,7 @@ public ApiClientHttpResponse recordServiceBatchOperati throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -69,57 +87,79 @@ public ApiClientHttpResponse recordServiceBatchOperati if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BatchOperationResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BatchOperationResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Gets the specified records from a table. + * Returns the specified records from a table. + */ + public ApiClientHttpResponse getRecords(String vaultId, String objectName) { + return getRecords(vaultId, objectName, GetRecordsRequest.builder().build()); + } + + /** + * Returns the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkGetRecord( - String vaultId, String objectName) { - return recordServiceBulkGetRecord( - vaultId, objectName, RecordServiceBulkGetRecordRequest.builder().build()); + public ApiClientHttpResponse getRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return getRecords(vaultId, objectName, GetRecordsRequest.builder().build(), requestOptions); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkGetRecord( - String vaultId, String objectName, RecordServiceBulkGetRecordRequest request) { - return recordServiceBulkGetRecord(vaultId, objectName, request, null); + public ApiClientHttpResponse getRecords( + String vaultId, String objectName, GetRecordsRequest request) { + return getRecords(vaultId, objectName, request, null); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkGetRecord( - String vaultId, - String objectName, - RecordServiceBulkGetRecordRequest request, - RequestOptions requestOptions) { + public ApiClientHttpResponse getRecords( + String vaultId, String objectName, GetRecordsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") @@ -153,6 +193,13 @@ public ApiClientHttpResponse recordServiceBulkGetRecord QueryStringMapper.addQueryParameter( httpUrl, "order_by", request.getOrderBy().get(), false); } + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addQueryParameter( + httpUrl, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } if (request.getSkyflowIds().isPresent()) { QueryStringMapper.addQueryParameter( httpUrl, "skyflow_ids", request.getSkyflowIds().get(), true); @@ -165,6 +212,11 @@ public ApiClientHttpResponse recordServiceBulkGetRecord QueryStringMapper.addQueryParameter( httpUrl, "column_values", request.getColumnValues().get(), true); } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl.build()) .method("GET", null) @@ -175,59 +227,73 @@ public ApiClientHttpResponse recordServiceBulkGetRecord if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BulkGetRecordResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BulkGetRecordResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. - */ - public ApiClientHttpResponse recordServiceInsertRecord(String vaultId, String objectName) { - return recordServiceInsertRecord( - vaultId, objectName, RecordServiceInsertRecordBody.builder().build()); - } - - /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public ApiClientHttpResponse recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request) { - return recordServiceInsertRecord(vaultId, objectName, request, null); + public ApiClientHttpResponse insertRecords( + String vaultId, String objectName, InsertRecordRequest request) { + return insertRecords(vaultId, objectName, request, null); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public ApiClientHttpResponse recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse insertRecords( + String vaultId, String objectName, InsertRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegment(objectName) - .build(); + .addPathSegment(objectName); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -236,7 +302,7 @@ public ApiClientHttpResponse recordServiceInsertRecord( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -246,27 +312,42 @@ public ApiClientHttpResponse recordServiceInsertRecord( if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1InsertRecordResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, InsertRecordResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } @@ -275,34 +356,43 @@ public ApiClientHttpResponse recordServiceInsertRecord( /** * Deletes the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkDeleteRecord( - String vaultId, String objectName) { - return recordServiceBulkDeleteRecord( - vaultId, objectName, RecordServiceBulkDeleteRecordBody.builder().build()); + public ApiClientHttpResponse deleteRecords(String vaultId, String objectName) { + return deleteRecords( + vaultId, objectName, BulkDeleteRecordRequest.builder().build()); + } + + /** + * Deletes the specified records from a table. + */ + public ApiClientHttpResponse deleteRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return deleteRecords( + vaultId, objectName, BulkDeleteRecordRequest.builder().build(), requestOptions); } /** * Deletes the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkDeleteRecord( - String vaultId, String objectName, RecordServiceBulkDeleteRecordBody request) { - return recordServiceBulkDeleteRecord(vaultId, objectName, request, null); + public ApiClientHttpResponse deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request) { + return deleteRecords(vaultId, objectName, request, null); } /** * Deletes the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkDeleteRecord( - String vaultId, - String objectName, - RecordServiceBulkDeleteRecordBody request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegment(objectName) - .build(); + .addPathSegment(objectName); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -311,7 +401,7 @@ public ApiClientHttpResponse recordServiceBulkDelete throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("DELETE", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -321,27 +411,46 @@ public ApiClientHttpResponse recordServiceBulkDelete if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BulkDeleteRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BulkDeleteRecordResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } @@ -350,28 +459,33 @@ public ApiClientHttpResponse recordServiceBulkDelete /** * Returns the specified record from a table. */ - public ApiClientHttpResponse recordServiceGetRecord(String vaultId, String objectName, String id) { - return recordServiceGetRecord( - vaultId, objectName, id, RecordServiceGetRecordRequest.builder().build()); + public ApiClientHttpResponse getRecordById(String vaultId, String objectName, String id) { + return getRecordById( + vaultId, objectName, id, GetRecordByIdRequest.builder().build()); + } + + /** + * Returns the specified record from a table. + */ + public ApiClientHttpResponse getRecordById( + String vaultId, String objectName, String id, RequestOptions requestOptions) { + return getRecordById( + vaultId, objectName, id, GetRecordByIdRequest.builder().build(), requestOptions); } /** * Returns the specified record from a table. */ - public ApiClientHttpResponse recordServiceGetRecord( - String vaultId, String objectName, String id, RecordServiceGetRecordRequest request) { - return recordServiceGetRecord(vaultId, objectName, id, request, null); + public ApiClientHttpResponse getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request) { + return getRecordById(vaultId, objectName, id, request, null); } /** * Returns the specified record from a table. */ - public ApiClientHttpResponse recordServiceGetRecord( - String vaultId, - String objectName, - String id, - RecordServiceGetRecordRequest request, - RequestOptions requestOptions) { + public ApiClientHttpResponse getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") @@ -390,10 +504,22 @@ public ApiClientHttpResponse recordServiceGetRecord( QueryStringMapper.addQueryParameter( httpUrl, "downloadURL", request.getDownloadUrl().get(), false); } + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addQueryParameter( + httpUrl, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } if (request.getFields().isPresent()) { QueryStringMapper.addQueryParameter( httpUrl, "fields", request.getFields().get(), true); } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl.build()) .method("GET", null) @@ -404,64 +530,91 @@ public ApiClientHttpResponse recordServiceGetRecord( if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1FieldRecords.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetFieldRecords.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. + */ + public ApiClientHttpResponse updateRecord(String vaultId, String objectName, String id) { + return updateRecord( + vaultId, objectName, id, UpdateRecordRequest.builder().build()); + } + + /** + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public ApiClientHttpResponse recordServiceUpdateRecord( - String vaultId, String objectName, String id) { - return recordServiceUpdateRecord( - vaultId, objectName, id, RecordServiceUpdateRecordBody.builder().build()); + public ApiClientHttpResponse updateRecord( + String vaultId, String objectName, String id, RequestOptions requestOptions) { + return updateRecord( + vaultId, objectName, id, UpdateRecordRequest.builder().build(), requestOptions); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public ApiClientHttpResponse recordServiceUpdateRecord( - String vaultId, String objectName, String id, RecordServiceUpdateRecordBody request) { - return recordServiceUpdateRecord(vaultId, objectName, id, request, null); + public ApiClientHttpResponse updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request) { + return updateRecord(vaultId, objectName, id, request, null); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public ApiClientHttpResponse recordServiceUpdateRecord( - String vaultId, - String objectName, - String id, - RecordServiceUpdateRecordBody request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) .addPathSegment(objectName) - .addPathSegment(id) - .build(); + .addPathSegment(id); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -470,7 +623,7 @@ public ApiClientHttpResponse recordServiceUpdateRecord( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("PUT", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -480,145 +633,94 @@ public ApiClientHttpResponse recordServiceUpdateRecord( if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1UpdateRecordResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, UpdateRecordResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public ApiClientHttpResponse recordServiceDeleteRecord( - String vaultId, String objectName, String id) { - return recordServiceDeleteRecord(vaultId, objectName, id, null); + public ApiClientHttpResponse deleteRecord(String vaultId, String objectName, String id) { + return deleteRecord( + vaultId, objectName, id, DeleteRecordRequest.builder().build()); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public ApiClientHttpResponse recordServiceDeleteRecord( + public ApiClientHttpResponse deleteRecord( String vaultId, String objectName, String id, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(objectName) - .addPathSegment(id) - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("DELETE", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DeleteRecordResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } + return deleteRecord( + vaultId, objectName, id, DeleteRecordRequest.builder().build(), requestOptions); } /** - * Uploads a file to the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public ApiClientHttpResponse fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file) { - return fileServiceUploadFile( - vaultId, - objectName, - id, - file, - FileServiceUploadFileRequest.builder().build()); + public ApiClientHttpResponse deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request) { + return deleteRecord(vaultId, objectName, id, request, null); } /** - * Uploads a file to the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public ApiClientHttpResponse fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file, FileServiceUploadFileRequest request) { - return fileServiceUploadFile(vaultId, objectName, id, file, request, null); - } - - /** - * Uploads a file to the specified record. - */ - public ApiClientHttpResponse fileServiceUploadFile( - String vaultId, - String objectName, - String id, - Optional file, - FileServiceUploadFileRequest request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) .addPathSegment(objectName) - .addPathSegment(id) - .addPathSegments("files") - .build(); - MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM); - try { - if (file.isPresent()) { - String fileMimeType = Files.probeContentType(file.get().toPath()); - MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; - body.addFormDataPart( - "file", file.get().getName(), RequestBody.create(file.get(), fileMimeTypeMediaType)); - } - if (request.getColumnName().isPresent()) { - QueryStringMapper.addFormDataPart( - body, "columnName", request.getColumnName().get(), false); - } - } catch (Exception e) { - throw new RuntimeException(e); + .addPathSegment(id); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); } Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl) - .method("POST", body.build()) + .url(httpUrl.build()) + .method("DELETE", null) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Accept", "application/json"); Request okhttpRequest = _requestBuilder.build(); @@ -626,218 +728,33 @@ public ApiClientHttpResponse fileServiceUploadFile( if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1UpdateRecordResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Deletes a file from the specified record. - */ - public ApiClientHttpResponse fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName) { - return fileServiceDeleteFile(vaultId, tableName, id, columnName, null); - } - - /** - * Deletes a file from the specified record. - */ - public ApiClientHttpResponse fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(tableName) - .addPathSegment(id) - .addPathSegments("files") - .addPathSegment(columnName) - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("DELETE", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DeleteFileResponse.class), - response); - } String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Returns the anti-virus scan status of a file. - */ - public ApiClientHttpResponse fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName) { - return fileServiceGetFileScanStatus(vaultId, tableName, id, columnName, null); - } - - /** - * Returns the anti-virus scan status of a file. - */ - public ApiClientHttpResponse fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(tableName) - .addPathSegment(id) - .addPathSegments("files") - .addPathSegment(columnName) - .addPathSegments("scan-status") - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1GetFileScanStatusResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DeleteRecordResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. - */ - public ApiClientHttpResponse uploadFileV2( - String vaultId, File file, UploadFileV2Request request) { - return uploadFileV2(vaultId, file, request, null); - } - - /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. - */ - public ApiClientHttpResponse uploadFileV2( - String vaultId, File file, UploadFileV2Request request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v2/vaults") - .addPathSegment(vaultId) - .addPathSegments("files/upload") - .build(); - MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM); - try { - QueryStringMapper.addFormDataPart(body, "tableName", request.getTableName(), false); - QueryStringMapper.addFormDataPart(body, "columnName", request.getColumnName(), false); - String fileMimeType = Files.probeContentType(file.toPath()); - MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; - body.addFormDataPart("file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType)); - if (request.getSkyflowId().isPresent()) { - QueryStringMapper.addFormDataPart( - body, "skyflowID", request.getSkyflowId().get(), false); - } - if (request.getReturnFileMetadata().isPresent()) { - QueryStringMapper.addFormDataPart( - body, - "returnFileMetadata", - request.getReturnFileMetadata().get(), - false); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl) - .method("POST", body.build()) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), UploadFileV2Response.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { switch (response.code()) { case 400: throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); case 401: throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); case 404: throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); case 500: throw new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); @@ -845,11 +762,11 @@ public ApiClientHttpResponse uploadFileV2( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java index eb9bc81d..0a1da515 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java @@ -5,11 +5,20 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.records.requests.*; -import com.skyflow.generated.rest.types.*; - -import java.io.File; -import java.util.Optional; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.DeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordByIdRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.DeleteRecordResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; public class RecordsClient { protected final ClientOptions clientOptions; @@ -31,282 +40,197 @@ public RawRecordsClient withRawResponse() { /** * Performs multiple record operations in a single transaction. */ - public V1BatchOperationResponse recordServiceBatchOperation(String vaultId) { - return this.rawClient.recordServiceBatchOperation(vaultId).body(); + public BatchOperationResponse batchOperation(String vaultId, BatchOperationRequest request) { + return this.rawClient.batchOperation(vaultId, request).body(); } /** * Performs multiple record operations in a single transaction. */ - public V1BatchOperationResponse recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request) { - return this.rawClient.recordServiceBatchOperation(vaultId, request).body(); + public BatchOperationResponse batchOperation( + String vaultId, BatchOperationRequest request, RequestOptions requestOptions) { + return this.rawClient.batchOperation(vaultId, request, requestOptions).body(); } /** - * Performs multiple record operations in a single transaction. + * Returns the specified records from a table. */ - public V1BatchOperationResponse recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceBatchOperation(vaultId, request, requestOptions) - .body(); + public BulkGetRecordResponse getRecords(String vaultId, String objectName) { + return this.rawClient.getRecords(vaultId, objectName).body(); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public V1BulkGetRecordResponse recordServiceBulkGetRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceBulkGetRecord(vaultId, objectName).body(); + public BulkGetRecordResponse getRecords(String vaultId, String objectName, RequestOptions requestOptions) { + return this.rawClient.getRecords(vaultId, objectName, requestOptions).body(); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public V1BulkGetRecordResponse recordServiceBulkGetRecord( - String vaultId, String objectName, RecordServiceBulkGetRecordRequest request) { - return this.rawClient - .recordServiceBulkGetRecord(vaultId, objectName, request) - .body(); + public BulkGetRecordResponse getRecords(String vaultId, String objectName, GetRecordsRequest request) { + return this.rawClient.getRecords(vaultId, objectName, request).body(); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public V1BulkGetRecordResponse recordServiceBulkGetRecord( - String vaultId, - String objectName, - RecordServiceBulkGetRecordRequest request, - RequestOptions requestOptions) { + public BulkGetRecordResponse getRecords( + String vaultId, String objectName, GetRecordsRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceBulkGetRecord(vaultId, objectName, request, requestOptions) + .getRecords(vaultId, objectName, request, requestOptions) .body(); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public V1InsertRecordResponse recordServiceInsertRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceInsertRecord(vaultId, objectName).body(); + public InsertRecordResponse insertRecords(String vaultId, String objectName, InsertRecordRequest request) { + return this.rawClient.insertRecords(vaultId, objectName, request).body(); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public V1InsertRecordResponse recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request) { + public InsertRecordResponse insertRecords( + String vaultId, String objectName, InsertRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceInsertRecord(vaultId, objectName, request) + .insertRecords(vaultId, objectName, request, requestOptions) .body(); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Deletes the specified records from a table. */ - public V1InsertRecordResponse recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceInsertRecord(vaultId, objectName, request, requestOptions) - .body(); + public BulkDeleteRecordResponse deleteRecords(String vaultId, String objectName) { + return this.rawClient.deleteRecords(vaultId, objectName).body(); } /** * Deletes the specified records from a table. */ - public V1BulkDeleteRecordResponse recordServiceBulkDeleteRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceBulkDeleteRecord(vaultId, objectName).body(); + public BulkDeleteRecordResponse deleteRecords(String vaultId, String objectName, RequestOptions requestOptions) { + return this.rawClient.deleteRecords(vaultId, objectName, requestOptions).body(); } /** * Deletes the specified records from a table. */ - public V1BulkDeleteRecordResponse recordServiceBulkDeleteRecord( - String vaultId, String objectName, RecordServiceBulkDeleteRecordBody request) { - return this.rawClient - .recordServiceBulkDeleteRecord(vaultId, objectName, request) - .body(); + public BulkDeleteRecordResponse deleteRecords(String vaultId, String objectName, BulkDeleteRecordRequest request) { + return this.rawClient.deleteRecords(vaultId, objectName, request).body(); } /** * Deletes the specified records from a table. */ - public V1BulkDeleteRecordResponse recordServiceBulkDeleteRecord( - String vaultId, - String objectName, - RecordServiceBulkDeleteRecordBody request, - RequestOptions requestOptions) { + public BulkDeleteRecordResponse deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceBulkDeleteRecord(vaultId, objectName, request, requestOptions) + .deleteRecords(vaultId, objectName, request, requestOptions) .body(); } /** * Returns the specified record from a table. */ - public V1FieldRecords recordServiceGetRecord(String vaultId, String objectName, String id) { - return this.rawClient.recordServiceGetRecord(vaultId, objectName, id).body(); + public GetFieldRecords getRecordById(String vaultId, String objectName, String id) { + return this.rawClient.getRecordById(vaultId, objectName, id).body(); } /** * Returns the specified record from a table. */ - public V1FieldRecords recordServiceGetRecord( - String vaultId, String objectName, String id, RecordServiceGetRecordRequest request) { + public GetFieldRecords getRecordById(String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .recordServiceGetRecord(vaultId, objectName, id, request) + .getRecordById(vaultId, objectName, id, requestOptions) .body(); } /** * Returns the specified record from a table. */ - public V1FieldRecords recordServiceGetRecord( - String vaultId, - String objectName, - String id, - RecordServiceGetRecordRequest request, - RequestOptions requestOptions) { - return this.rawClient - .recordServiceGetRecord(vaultId, objectName, id, request, requestOptions) - .body(); - } - - /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. - */ - public V1UpdateRecordResponse recordServiceUpdateRecord(String vaultId, String objectName, String id) { - return this.rawClient.recordServiceUpdateRecord(vaultId, objectName, id).body(); - } - - /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. - */ - public V1UpdateRecordResponse recordServiceUpdateRecord( - String vaultId, String objectName, String id, RecordServiceUpdateRecordBody request) { - return this.rawClient - .recordServiceUpdateRecord(vaultId, objectName, id, request) - .body(); + public GetFieldRecords getRecordById(String vaultId, String objectName, String id, GetRecordByIdRequest request) { + return this.rawClient.getRecordById(vaultId, objectName, id, request).body(); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Returns the specified record from a table. */ - public V1UpdateRecordResponse recordServiceUpdateRecord( - String vaultId, - String objectName, - String id, - RecordServiceUpdateRecordBody request, - RequestOptions requestOptions) { + public GetFieldRecords getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceUpdateRecord(vaultId, objectName, id, request, requestOptions) + .getRecordById(vaultId, objectName, id, request, requestOptions) .body(); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public V1DeleteRecordResponse recordServiceDeleteRecord(String vaultId, String objectName, String id) { - return this.rawClient.recordServiceDeleteRecord(vaultId, objectName, id).body(); + public UpdateRecordResponse updateRecord(String vaultId, String objectName, String id) { + return this.rawClient.updateRecord(vaultId, objectName, id).body(); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public V1DeleteRecordResponse recordServiceDeleteRecord( + public UpdateRecordResponse updateRecord( String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .recordServiceDeleteRecord(vaultId, objectName, id, requestOptions) + .updateRecord(vaultId, objectName, id, requestOptions) .body(); } /** - * Uploads a file to the specified record. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public V1UpdateRecordResponse fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file) - .body(); - } - - /** - * Uploads a file to the specified record. - */ - public V1UpdateRecordResponse fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file, FileServiceUploadFileRequest request) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file, request) - .body(); + public UpdateRecordResponse updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request) { + return this.rawClient.updateRecord(vaultId, objectName, id, request).body(); } /** - * Uploads a file to the specified record. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public V1UpdateRecordResponse fileServiceUploadFile( - String vaultId, - String objectName, - String id, - Optional file, - FileServiceUploadFileRequest request, - RequestOptions requestOptions) { + public UpdateRecordResponse updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file, request, requestOptions) + .updateRecord(vaultId, objectName, id, request, requestOptions) .body(); } /** - * Deletes a file from the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public V1DeleteFileResponse fileServiceDeleteFile(String vaultId, String tableName, String id, String columnName) { - return this.rawClient - .fileServiceDeleteFile(vaultId, tableName, id, columnName) - .body(); + public DeleteRecordResponse deleteRecord(String vaultId, String objectName, String id) { + return this.rawClient.deleteRecord(vaultId, objectName, id).body(); } /** - * Deletes a file from the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public V1DeleteFileResponse fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - return this.rawClient - .fileServiceDeleteFile(vaultId, tableName, id, columnName, requestOptions) - .body(); - } - - /** - * Returns the anti-virus scan status of a file. - */ - public V1GetFileScanStatusResponse fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName) { - return this.rawClient - .fileServiceGetFileScanStatus(vaultId, tableName, id, columnName) - .body(); - } - - /** - * Returns the anti-virus scan status of a file. - */ - public V1GetFileScanStatusResponse fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { + public DeleteRecordResponse deleteRecord( + String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .fileServiceGetFileScanStatus(vaultId, tableName, id, columnName, requestOptions) + .deleteRecord(vaultId, objectName, id, requestOptions) .body(); } /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public UploadFileV2Response uploadFileV2(String vaultId, File file, UploadFileV2Request request) { - return this.rawClient.uploadFileV2(vaultId, file, request).body(); + public DeleteRecordResponse deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request) { + return this.rawClient.deleteRecord(vaultId, objectName, id, request).body(); } /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public UploadFileV2Response uploadFileV2( - String vaultId, File file, UploadFileV2Request request, RequestOptions requestOptions) { + public DeleteRecordResponse deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .uploadFileV2(vaultId, file, request, requestOptions) + .deleteRecord(vaultId, objectName, id, request, requestOptions) .body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BatchOperationRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BatchOperationRequest.java new file mode 100644 index 00000000..fb59e148 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BatchOperationRequest.java @@ -0,0 +1,153 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.BatchRecord; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = BatchOperationRequest.Builder.class) +public final class BatchOperationRequest { + private final List records; + + private final Optional continueOnError; + + private final Map additionalProperties; + + private BatchOperationRequest( + List records, Optional continueOnError, Map additionalProperties) { + this.records = records; + this.continueOnError = continueOnError; + this.additionalProperties = additionalProperties; + } + + /** + * @return Record operations to perform. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + /** + * @return If true, continues processing remaining operations when one operation returns an error. If false, stops processing remaining operations when one operation returns an error. + */ + @JsonProperty("continueOnError") + public Optional getContinueOnError() { + return continueOnError; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof BatchOperationRequest && equalTo((BatchOperationRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(BatchOperationRequest other) { + return records.equals(other.records) && continueOnError.equals(other.continueOnError); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records, this.continueOnError); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List records = new ArrayList<>(); + + private Optional continueOnError = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(BatchOperationRequest other) { + records(other.getRecords()); + continueOnError(other.getContinueOnError()); + return this; + } + + /** + *

                                  Record operations to perform.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(BatchRecord records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

                                  If true, continues processing remaining operations when one operation returns an error. If false, stops processing remaining operations when one operation returns an error.

                                  + */ + @JsonSetter(value = "continueOnError", nulls = Nulls.SKIP) + public Builder continueOnError(Optional continueOnError) { + this.continueOnError = continueOnError; + return this; + } + + public Builder continueOnError(Boolean continueOnError) { + this.continueOnError = Optional.ofNullable(continueOnError); + return this; + } + + public BatchOperationRequest build() { + return new BatchOperationRequest(records, continueOnError, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BulkDeleteRecordRequest.java similarity index 60% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BulkDeleteRecordRequest.java index 4b9dcced..729b0623 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BulkDeleteRecordRequest.java @@ -3,21 +3,29 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceBulkDeleteRecordBody.Builder.class) -public final class RecordServiceBulkDeleteRecordBody { +@JsonDeserialize(builder = BulkDeleteRecordRequest.Builder.class) +public final class BulkDeleteRecordRequest { private final Optional> skyflowIds; private final Map additionalProperties; - private RecordServiceBulkDeleteRecordBody( - Optional> skyflowIds, Map additionalProperties) { + private BulkDeleteRecordRequest(Optional> skyflowIds, Map additionalProperties) { this.skyflowIds = skyflowIds; this.additionalProperties = additionalProperties; } @@ -30,10 +38,10 @@ public Optional> getSkyflowIds() { return skyflowIds; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceBulkDeleteRecordBody && equalTo((RecordServiceBulkDeleteRecordBody) other); + return other instanceof BulkDeleteRecordRequest && equalTo((BulkDeleteRecordRequest) other); } @JsonAnyGetter @@ -41,16 +49,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceBulkDeleteRecordBody other) { + private boolean equalTo(BulkDeleteRecordRequest other) { return skyflowIds.equals(other.skyflowIds); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowIds); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -68,7 +76,7 @@ public static final class Builder { private Builder() {} - public Builder from(RecordServiceBulkDeleteRecordBody other) { + public Builder from(BulkDeleteRecordRequest other) { skyflowIds(other.getSkyflowIds()); return this; } @@ -87,8 +95,18 @@ public Builder skyflowIds(List skyflowIds) { return this; } - public RecordServiceBulkDeleteRecordBody build() { - return new RecordServiceBulkDeleteRecordBody(skyflowIds, additionalProperties); + public BulkDeleteRecordRequest build() { + return new BulkDeleteRecordRequest(skyflowIds, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRecordRequest.java new file mode 100644 index 00000000..eedbaef7 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRecordRequest.java @@ -0,0 +1,69 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteRecordRequest.Builder.class) +public final class DeleteRecordRequest { + private final Map additionalProperties; + + private DeleteRecordRequest(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteRecordRequest; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteRecordRequest other) { + return this; + } + + public DeleteRecordRequest build() { + return new DeleteRecordRequest(additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRequest.java new file mode 100644 index 00000000..3a620b09 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRequest.java @@ -0,0 +1,263 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.UniqueValue; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteRequest.Builder.class) +public final class DeleteRequest { + private final String vaultId; + + private final Optional tableName; + + private final Optional> skyflowIDs; + + private final Optional> uniqueValues; + + private final Map additionalProperties; + + private DeleteRequest( + String vaultId, + Optional tableName, + Optional> skyflowIDs, + Optional> uniqueValues, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.skyflowIDs = skyflowIDs; + this.uniqueValues = uniqueValues; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return Skyflow IDs of the records to delete. + */ + @JsonProperty("skyflowIDs") + public Optional> getSkyflowIDs() { + return skyflowIDs; + } + + /** + * @return List of unique constraint values to query records by data. + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteRequest && equalTo((DeleteRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && skyflowIDs.equals(other.skyflowIDs) + && uniqueValues.equals(other.uniqueValues); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tableName, this.skyflowIDs, this.uniqueValues); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(DeleteRequest other); + } + + public interface _FinalStage { + DeleteRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(Optional tableName); + + _FinalStage tableName(String tableName); + + /** + *

                                  Skyflow IDs of the records to delete.

                                  + */ + _FinalStage skyflowIDs(Optional> skyflowIDs); + + _FinalStage skyflowIDs(List skyflowIDs); + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + _FinalStage uniqueValues(Optional> uniqueValues); + + _FinalStage uniqueValues(List uniqueValues); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private Optional> uniqueValues = Optional.empty(); + + private Optional> skyflowIDs = Optional.empty(); + + private Optional tableName = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DeleteRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + skyflowIDs(other.getSkyflowIDs()); + uniqueValues(other.getUniqueValues()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + @java.lang.Override + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public _FinalStage uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + /** + *

                                  Skyflow IDs of the records to delete.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowIDs(List skyflowIDs) { + this.skyflowIDs = Optional.ofNullable(skyflowIDs); + return this; + } + + /** + *

                                  Skyflow IDs of the records to delete.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowIDs", nulls = Nulls.SKIP) + public _FinalStage skyflowIDs(Optional> skyflowIDs) { + this.skyflowIDs = skyflowIDs; + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

                                  Name of the table.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public _FinalStage tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + @java.lang.Override + public DeleteRequest build() { + return new DeleteRequest(vaultId, tableName, skyflowIDs, uniqueValues, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java deleted file mode 100644 index 3efb0a98..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileServiceUploadFileRequest.Builder.class) -public final class FileServiceUploadFileRequest { - private final Optional columnName; - - private final Map additionalProperties; - - private FileServiceUploadFileRequest(Optional columnName, Map additionalProperties) { - this.columnName = columnName; - this.additionalProperties = additionalProperties; - } - - /** - * @return Name of the column to store the file in. The column must have a file data type. - */ - @JsonProperty("columnName") - public Optional getColumnName() { - return columnName; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileServiceUploadFileRequest && equalTo((FileServiceUploadFileRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileServiceUploadFileRequest other) { - return columnName.equals(other.columnName); - } - - @Override - public int hashCode() { - return Objects.hash(this.columnName); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional columnName = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(FileServiceUploadFileRequest other) { - columnName(other.getColumnName()); - return this; - } - - /** - *

                                  Name of the column to store the file in. The column must have a file data type.

                                  - */ - @JsonSetter(value = "columnName", nulls = Nulls.SKIP) - public Builder columnName(Optional columnName) { - this.columnName = columnName; - return this; - } - - public Builder columnName(String columnName) { - this.columnName = Optional.ofNullable(columnName); - return this; - } - - public FileServiceUploadFileRequest build() { - return new FileServiceUploadFileRequest(columnName, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordByIdRequest.java similarity index 57% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordByIdRequest.java index 91317d02..db5cd9aa 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordByIdRequest.java @@ -3,75 +3,82 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.records.types.RecordServiceGetRecordRequestRedaction; - -import java.util.*; +import com.skyflow.generated.rest.resources.records.types.GetRecordByIdRequestRedaction; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceGetRecordRequest.Builder.class) -public final class RecordServiceGetRecordRequest { +@JsonDeserialize(builder = GetRecordByIdRequest.Builder.class) +public final class GetRecordByIdRequest { private final Optional> fields; - private final Optional redaction; + private final Optional redaction; private final Optional tokenization; private final Optional downloadUrl; + private final Optional returnFileMetadata; + private final Map additionalProperties; - private RecordServiceGetRecordRequest( + private GetRecordByIdRequest( Optional> fields, - Optional redaction, + Optional redaction, Optional tokenization, Optional downloadUrl, + Optional returnFileMetadata, Map additionalProperties) { this.fields = fields; this.redaction = redaction; this.tokenization = tokenization; this.downloadUrl = downloadUrl; + this.returnFileMetadata = returnFileMetadata; this.additionalProperties = additionalProperties; } - /** - * @return Fields to return for the record, with one value per fields URL parameter. For example, ?fields=abc&fields=123.<br /><br />If not specified, returns all fields. - */ @JsonProperty("fields") public Optional> getFields() { return fields; } - /** - * @return Redaction level to enforce for the returned record. Subject to policies assigned to the API caller. - */ @JsonProperty("redaction") - public Optional getRedaction() { + public Optional getRedaction() { return redaction; } - /** - * @return If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified. - */ @JsonProperty("tokenization") public Optional getTokenization() { return tokenization; } - /** - * @return If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean. - */ @JsonProperty("downloadURL") public Optional getDownloadUrl() { return downloadUrl; } - @Override + @JsonProperty("returnFileMetadata") + public Optional getReturnFileMetadata() { + return returnFileMetadata; + } + + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceGetRecordRequest && equalTo((RecordServiceGetRecordRequest) other); + return other instanceof GetRecordByIdRequest && equalTo((GetRecordByIdRequest) other); } @JsonAnyGetter @@ -79,19 +86,20 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceGetRecordRequest other) { + private boolean equalTo(GetRecordByIdRequest other) { return fields.equals(other.fields) && redaction.equals(other.redaction) && tokenization.equals(other.tokenization) - && downloadUrl.equals(other.downloadUrl); + && downloadUrl.equals(other.downloadUrl) + && returnFileMetadata.equals(other.returnFileMetadata); } - @Override + @java.lang.Override public int hashCode() { - return Objects.hash(this.fields, this.redaction, this.tokenization, this.downloadUrl); + return Objects.hash(this.fields, this.redaction, this.tokenization, this.downloadUrl, this.returnFileMetadata); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -104,28 +112,28 @@ public static Builder builder() { public static final class Builder { private Optional> fields = Optional.empty(); - private Optional redaction = Optional.empty(); + private Optional redaction = Optional.empty(); private Optional tokenization = Optional.empty(); private Optional downloadUrl = Optional.empty(); + private Optional returnFileMetadata = Optional.empty(); + @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(RecordServiceGetRecordRequest other) { + public Builder from(GetRecordByIdRequest other) { fields(other.getFields()); redaction(other.getRedaction()); tokenization(other.getTokenization()); downloadUrl(other.getDownloadUrl()); + returnFileMetadata(other.getReturnFileMetadata()); return this; } - /** - *

                                  Fields to return for the record, with one value per fields URL parameter. For example, ?fields=abc&fields=123.<br /><br />If not specified, returns all fields.

                                  - */ @JsonSetter(value = "fields", nulls = Nulls.SKIP) public Builder fields(Optional> fields) { this.fields = fields; @@ -142,23 +150,17 @@ public Builder fields(String fields) { return this; } - /** - *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  - */ @JsonSetter(value = "redaction", nulls = Nulls.SKIP) - public Builder redaction(Optional redaction) { + public Builder redaction(Optional redaction) { this.redaction = redaction; return this; } - public Builder redaction(RecordServiceGetRecordRequestRedaction redaction) { + public Builder redaction(GetRecordByIdRequestRedaction redaction) { this.redaction = Optional.ofNullable(redaction); return this; } - /** - *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  - */ @JsonSetter(value = "tokenization", nulls = Nulls.SKIP) public Builder tokenization(Optional tokenization) { this.tokenization = tokenization; @@ -170,9 +172,6 @@ public Builder tokenization(Boolean tokenization) { return this; } - /** - *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  - */ @JsonSetter(value = "downloadURL", nulls = Nulls.SKIP) public Builder downloadUrl(Optional downloadUrl) { this.downloadUrl = downloadUrl; @@ -184,9 +183,30 @@ public Builder downloadUrl(Boolean downloadUrl) { return this; } - public RecordServiceGetRecordRequest build() { - return new RecordServiceGetRecordRequest( - fields, redaction, tokenization, downloadUrl, additionalProperties); + @JsonSetter(value = "returnFileMetadata", nulls = Nulls.SKIP) + public Builder returnFileMetadata(Optional returnFileMetadata) { + this.returnFileMetadata = returnFileMetadata; + return this; + } + + public Builder returnFileMetadata(Boolean returnFileMetadata) { + this.returnFileMetadata = Optional.ofNullable(returnFileMetadata); + return this; + } + + public GetRecordByIdRequest build() { + return new GetRecordByIdRequest( + fields, redaction, tokenization, downloadUrl, returnFileMetadata, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordsRequest.java similarity index 59% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordsRequest.java index 9b59168a..f6e9263a 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordsRequest.java @@ -3,24 +3,34 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestOrderBy; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestRedaction; - -import java.util.*; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestOrderBy; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestRedaction; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceBulkGetRecordRequest.Builder.class) -public final class RecordServiceBulkGetRecordRequest { +@JsonDeserialize(builder = GetRecordsRequest.Builder.class) +public final class GetRecordsRequest { private final Optional> skyflowIds; private final Optional> fields; private final Optional> columnValues; - private final Optional redaction; + private final Optional redaction; private final Optional tokenization; @@ -32,21 +42,24 @@ public final class RecordServiceBulkGetRecordRequest { private final Optional columnName; - private final Optional orderBy; + private final Optional orderBy; + + private final Optional returnFileMetadata; private final Map additionalProperties; - private RecordServiceBulkGetRecordRequest( + private GetRecordsRequest( Optional> skyflowIds, Optional> fields, Optional> columnValues, - Optional redaction, + Optional redaction, Optional tokenization, Optional offset, Optional limit, Optional downloadUrl, Optional columnName, - Optional orderBy, + Optional orderBy, + Optional returnFileMetadata, Map additionalProperties) { this.skyflowIds = skyflowIds; this.fields = fields; @@ -58,93 +71,69 @@ private RecordServiceBulkGetRecordRequest( this.downloadUrl = downloadUrl; this.columnName = columnName; this.orderBy = orderBy; + this.returnFileMetadata = returnFileMetadata; this.additionalProperties = additionalProperties; } - /** - * @return skyflow_id values of the records to return, with one value per skyflow_ids URL parameter. For example, ?skyflow_ids=abc&skyflow_ids=123.<br /><br />If not specified, returns the first 25 records in the table. - */ @JsonProperty("skyflow_ids") public Optional> getSkyflowIds() { return skyflowIds; } - /** - * @return Fields to return for the record, with one value per fields URL parameter. For example, ?fields=abc&fields=123.<br /><br />If not specified, returns all fields. - */ @JsonProperty("fields") public Optional> getFields() { return fields; } - /** - * @return Column values of the records to return, with one value per column_values URL parameter. For example, ?column_values=abc&column_values=123.<br /><br />column_name is mandatory when providing column_values. If you use column name or column value, you cannot use skyflow_ids. Passing either of these parameters with skyflow_ids returns an error. - */ @JsonProperty("column_values") public Optional> getColumnValues() { return columnValues; } - /** - * @return Redaction level to enforce for the returned records. Subject to policies assigned to the API caller. - */ @JsonProperty("redaction") - public Optional getRedaction() { + public Optional getRedaction() { return redaction; } - /** - * @return If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified. - */ @JsonProperty("tokenization") public Optional getTokenization() { return tokenization; } - /** - * @return Record position at which to start receiving data. - */ @JsonProperty("offset") public Optional getOffset() { return offset; } - /** - * @return Number of record to return. Maximum 25. - */ @JsonProperty("limit") public Optional getLimit() { return limit; } - /** - * @return If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean. - */ @JsonProperty("downloadURL") public Optional getDownloadUrl() { return downloadUrl; } - /** - * @return Name of the column. It must be configured as unique in the schema. If you provide both column name or column value, you cannot use skyflow_ids. Passing either of these parameters with skyflow_ids returns an error. - */ @JsonProperty("column_name") public Optional getColumnName() { return columnName; } - /** - * @return Order to return records, based on skyflow_id values. To disable, set to NONE. - */ @JsonProperty("order_by") - public Optional getOrderBy() { + public Optional getOrderBy() { return orderBy; } - @Override + @JsonProperty("returnFileMetadata") + public Optional getReturnFileMetadata() { + return returnFileMetadata; + } + + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceBulkGetRecordRequest && equalTo((RecordServiceBulkGetRecordRequest) other); + return other instanceof GetRecordsRequest && equalTo((GetRecordsRequest) other); } @JsonAnyGetter @@ -152,7 +141,7 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceBulkGetRecordRequest other) { + private boolean equalTo(GetRecordsRequest other) { return skyflowIds.equals(other.skyflowIds) && fields.equals(other.fields) && columnValues.equals(other.columnValues) @@ -162,10 +151,11 @@ private boolean equalTo(RecordServiceBulkGetRecordRequest other) { && limit.equals(other.limit) && downloadUrl.equals(other.downloadUrl) && columnName.equals(other.columnName) - && orderBy.equals(other.orderBy); + && orderBy.equals(other.orderBy) + && returnFileMetadata.equals(other.returnFileMetadata); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash( this.skyflowIds, @@ -177,10 +167,11 @@ public int hashCode() { this.limit, this.downloadUrl, this.columnName, - this.orderBy); + this.orderBy, + this.returnFileMetadata); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -197,7 +188,7 @@ public static final class Builder { private Optional> columnValues = Optional.empty(); - private Optional redaction = Optional.empty(); + private Optional redaction = Optional.empty(); private Optional tokenization = Optional.empty(); @@ -209,14 +200,16 @@ public static final class Builder { private Optional columnName = Optional.empty(); - private Optional orderBy = Optional.empty(); + private Optional orderBy = Optional.empty(); + + private Optional returnFileMetadata = Optional.empty(); @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(RecordServiceBulkGetRecordRequest other) { + public Builder from(GetRecordsRequest other) { skyflowIds(other.getSkyflowIds()); fields(other.getFields()); columnValues(other.getColumnValues()); @@ -227,12 +220,10 @@ public Builder from(RecordServiceBulkGetRecordRequest other) { downloadUrl(other.getDownloadUrl()); columnName(other.getColumnName()); orderBy(other.getOrderBy()); + returnFileMetadata(other.getReturnFileMetadata()); return this; } - /** - *

                                  skyflow_id values of the records to return, with one value per skyflow_ids URL parameter. For example, ?skyflow_ids=abc&skyflow_ids=123.<br /><br />If not specified, returns the first 25 records in the table.

                                  - */ @JsonSetter(value = "skyflow_ids", nulls = Nulls.SKIP) public Builder skyflowIds(Optional> skyflowIds) { this.skyflowIds = skyflowIds; @@ -249,9 +240,6 @@ public Builder skyflowIds(String skyflowIds) { return this; } - /** - *

                                  Fields to return for the record, with one value per fields URL parameter. For example, ?fields=abc&fields=123.<br /><br />If not specified, returns all fields.

                                  - */ @JsonSetter(value = "fields", nulls = Nulls.SKIP) public Builder fields(Optional> fields) { this.fields = fields; @@ -268,9 +256,6 @@ public Builder fields(String fields) { return this; } - /** - *

                                  Column values of the records to return, with one value per column_values URL parameter. For example, ?column_values=abc&column_values=123.<br /><br />column_name is mandatory when providing column_values. If you use column name or column value, you cannot use skyflow_ids. Passing either of these parameters with skyflow_ids returns an error.

                                  - */ @JsonSetter(value = "column_values", nulls = Nulls.SKIP) public Builder columnValues(Optional> columnValues) { this.columnValues = columnValues; @@ -287,23 +272,17 @@ public Builder columnValues(String columnValues) { return this; } - /** - *

                                  Redaction level to enforce for the returned records. Subject to policies assigned to the API caller.

                                  - */ @JsonSetter(value = "redaction", nulls = Nulls.SKIP) - public Builder redaction(Optional redaction) { + public Builder redaction(Optional redaction) { this.redaction = redaction; return this; } - public Builder redaction(RecordServiceBulkGetRecordRequestRedaction redaction) { + public Builder redaction(GetRecordsRequestRedaction redaction) { this.redaction = Optional.ofNullable(redaction); return this; } - /** - *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  - */ @JsonSetter(value = "tokenization", nulls = Nulls.SKIP) public Builder tokenization(Optional tokenization) { this.tokenization = tokenization; @@ -315,9 +294,6 @@ public Builder tokenization(Boolean tokenization) { return this; } - /** - *

                                  Record position at which to start receiving data.

                                  - */ @JsonSetter(value = "offset", nulls = Nulls.SKIP) public Builder offset(Optional offset) { this.offset = offset; @@ -329,9 +305,6 @@ public Builder offset(String offset) { return this; } - /** - *

                                  Number of record to return. Maximum 25.

                                  - */ @JsonSetter(value = "limit", nulls = Nulls.SKIP) public Builder limit(Optional limit) { this.limit = limit; @@ -343,9 +316,6 @@ public Builder limit(String limit) { return this; } - /** - *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  - */ @JsonSetter(value = "downloadURL", nulls = Nulls.SKIP) public Builder downloadUrl(Optional downloadUrl) { this.downloadUrl = downloadUrl; @@ -357,9 +327,6 @@ public Builder downloadUrl(Boolean downloadUrl) { return this; } - /** - *

                                  Name of the column. It must be configured as unique in the schema. If you provide both column name or column value, you cannot use skyflow_ids. Passing either of these parameters with skyflow_ids returns an error.

                                  - */ @JsonSetter(value = "column_name", nulls = Nulls.SKIP) public Builder columnName(Optional columnName) { this.columnName = columnName; @@ -371,22 +338,30 @@ public Builder columnName(String columnName) { return this; } - /** - *

                                  Order to return records, based on skyflow_id values. To disable, set to NONE.

                                  - */ @JsonSetter(value = "order_by", nulls = Nulls.SKIP) - public Builder orderBy(Optional orderBy) { + public Builder orderBy(Optional orderBy) { this.orderBy = orderBy; return this; } - public Builder orderBy(RecordServiceBulkGetRecordRequestOrderBy orderBy) { + public Builder orderBy(GetRecordsRequestOrderBy orderBy) { this.orderBy = Optional.ofNullable(orderBy); return this; } - public RecordServiceBulkGetRecordRequest build() { - return new RecordServiceBulkGetRecordRequest( + @JsonSetter(value = "returnFileMetadata", nulls = Nulls.SKIP) + public Builder returnFileMetadata(Optional returnFileMetadata) { + this.returnFileMetadata = returnFileMetadata; + return this; + } + + public Builder returnFileMetadata(Boolean returnFileMetadata) { + this.returnFileMetadata = Optional.ofNullable(returnFileMetadata); + return this; + } + + public GetRecordsRequest build() { + return new GetRecordsRequest( skyflowIds, fields, columnValues, @@ -397,7 +372,18 @@ public RecordServiceBulkGetRecordRequest build() { downloadUrl, columnName, orderBy, + returnFileMetadata, additionalProperties); } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRequest.java new file mode 100644 index 00000000..e6290a9d --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRequest.java @@ -0,0 +1,499 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.ColumnRedactions; +import com.skyflow.generated.rest.types.GetRequestData; +import com.skyflow.generated.rest.types.UniqueValue; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetRequest.Builder.class) +public final class GetRequest { + private final String vaultId; + + private final Optional tableName; + + private final Optional> skyflowIDs; + + private final Optional> columnRedactions; + + private final Optional> columns; + + private final Optional limit; + + private final Optional offset; + + private final Optional> uniqueValues; + + private final Optional> records; + + private final Map additionalProperties; + + private GetRequest( + String vaultId, + Optional tableName, + Optional> skyflowIDs, + Optional> columnRedactions, + Optional> columns, + Optional limit, + Optional offset, + Optional> uniqueValues, + Optional> records, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.skyflowIDs = skyflowIDs; + this.columnRedactions = columnRedactions; + this.columns = columns; + this.limit = limit; + this.offset = offset; + this.uniqueValues = uniqueValues; + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Name of the table to perform the operation on. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return Skyflow IDs of the records to return. Either skyflowIDs or uniqueValues are required. If both are provided, the request fails. + */ + @JsonProperty("skyflowIDs") + public Optional> getSkyflowIDs() { + return skyflowIDs; + } + + /** + * @return List of columns to redact. + */ + @JsonProperty("columnRedactions") + public Optional> getColumnRedactions() { + return columnRedactions; + } + + /** + * @return List of columns to return. + */ + @JsonProperty("columns") + public Optional> getColumns() { + return columns; + } + + /** + * @return Limit for the number of records to be fetched. + */ + @JsonProperty("limit") + public Optional getLimit() { + return limit; + } + + /** + * @return Offset for the number of records to be fetched. + */ + @JsonProperty("offset") + public Optional getOffset() { + return offset; + } + + /** + * @return List of unique constraint values to query records by data. + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + /** + * @return List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetRequest && equalTo((GetRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && skyflowIDs.equals(other.skyflowIDs) + && columnRedactions.equals(other.columnRedactions) + && columns.equals(other.columns) + && limit.equals(other.limit) + && offset.equals(other.offset) + && uniqueValues.equals(other.uniqueValues) + && records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash( + this.vaultId, + this.tableName, + this.skyflowIDs, + this.columnRedactions, + this.columns, + this.limit, + this.offset, + this.uniqueValues, + this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(GetRequest other); + } + + public interface _FinalStage { + GetRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Name of the table to perform the operation on.

                                  + */ + _FinalStage tableName(Optional tableName); + + _FinalStage tableName(String tableName); + + /** + *

                                  Skyflow IDs of the records to return. Either skyflowIDs or uniqueValues are required. If both are provided, the request fails.

                                  + */ + _FinalStage skyflowIDs(Optional> skyflowIDs); + + _FinalStage skyflowIDs(List skyflowIDs); + + /** + *

                                  List of columns to redact.

                                  + */ + _FinalStage columnRedactions(Optional> columnRedactions); + + _FinalStage columnRedactions(List columnRedactions); + + /** + *

                                  List of columns to return.

                                  + */ + _FinalStage columns(Optional> columns); + + _FinalStage columns(List columns); + + /** + *

                                  Limit for the number of records to be fetched.

                                  + */ + _FinalStage limit(Optional limit); + + _FinalStage limit(Integer limit); + + /** + *

                                  Offset for the number of records to be fetched.

                                  + */ + _FinalStage offset(Optional offset); + + _FinalStage offset(Integer offset); + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + _FinalStage uniqueValues(Optional> uniqueValues); + + _FinalStage uniqueValues(List uniqueValues); + + /** + *

                                  List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table.

                                  + */ + _FinalStage records(Optional> records); + + _FinalStage records(List records); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private Optional> records = Optional.empty(); + + private Optional> uniqueValues = Optional.empty(); + + private Optional offset = Optional.empty(); + + private Optional limit = Optional.empty(); + + private Optional> columns = Optional.empty(); + + private Optional> columnRedactions = Optional.empty(); + + private Optional> skyflowIDs = Optional.empty(); + + private Optional tableName = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + skyflowIDs(other.getSkyflowIDs()); + columnRedactions(other.getColumnRedactions()); + columns(other.getColumns()); + limit(other.getLimit()); + offset(other.getOffset()); + uniqueValues(other.getUniqueValues()); + records(other.getRecords()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + /** + *

                                  List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table.

                                  + */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(Optional> records) { + this.records = records; + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + @java.lang.Override + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public _FinalStage uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + /** + *

                                  Offset for the number of records to be fetched.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage offset(Integer offset) { + this.offset = Optional.ofNullable(offset); + return this; + } + + /** + *

                                  Offset for the number of records to be fetched.

                                  + */ + @java.lang.Override + @JsonSetter(value = "offset", nulls = Nulls.SKIP) + public _FinalStage offset(Optional offset) { + this.offset = offset; + return this; + } + + /** + *

                                  Limit for the number of records to be fetched.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage limit(Integer limit) { + this.limit = Optional.ofNullable(limit); + return this; + } + + /** + *

                                  Limit for the number of records to be fetched.

                                  + */ + @java.lang.Override + @JsonSetter(value = "limit", nulls = Nulls.SKIP) + public _FinalStage limit(Optional limit) { + this.limit = limit; + return this; + } + + /** + *

                                  List of columns to return.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage columns(List columns) { + this.columns = Optional.ofNullable(columns); + return this; + } + + /** + *

                                  List of columns to return.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public _FinalStage columns(Optional> columns) { + this.columns = columns; + return this; + } + + /** + *

                                  List of columns to redact.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage columnRedactions(List columnRedactions) { + this.columnRedactions = Optional.ofNullable(columnRedactions); + return this; + } + + /** + *

                                  List of columns to redact.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columnRedactions", nulls = Nulls.SKIP) + public _FinalStage columnRedactions(Optional> columnRedactions) { + this.columnRedactions = columnRedactions; + return this; + } + + /** + *

                                  Skyflow IDs of the records to return. Either skyflowIDs or uniqueValues are required. If both are provided, the request fails.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowIDs(List skyflowIDs) { + this.skyflowIDs = Optional.ofNullable(skyflowIDs); + return this; + } + + /** + *

                                  Skyflow IDs of the records to return. Either skyflowIDs or uniqueValues are required. If both are provided, the request fails.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowIDs", nulls = Nulls.SKIP) + public _FinalStage skyflowIDs(Optional> skyflowIDs) { + this.skyflowIDs = skyflowIDs; + return this; + } + + /** + *

                                  Name of the table to perform the operation on.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

                                  Name of the table to perform the operation on.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public _FinalStage tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + @java.lang.Override + public GetRequest build() { + return new GetRequest( + vaultId, + tableName, + skyflowIDs, + columnRedactions, + columns, + limit, + offset, + uniqueValues, + records, + additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRecordRequest.java similarity index 63% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRecordRequest.java index e832e396..a842c058 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRecordRequest.java @@ -3,18 +3,28 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1Byot; -import com.skyflow.generated.rest.types.V1FieldRecords; - -import java.util.*; +import com.skyflow.generated.rest.resources.records.types.InsertRecordRequestByot; +import com.skyflow.generated.rest.types.FieldRecords; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceInsertRecordBody.Builder.class) -public final class RecordServiceInsertRecordBody { - private final Optional> records; +@JsonDeserialize(builder = InsertRecordRequest.Builder.class) +public final class InsertRecordRequest { + private final List records; private final Optional tokenization; @@ -22,16 +32,16 @@ public final class RecordServiceInsertRecordBody { private final Optional homogeneous; - private final Optional byot; + private final Optional byot; private final Map additionalProperties; - private RecordServiceInsertRecordBody( - Optional> records, + private InsertRecordRequest( + List records, Optional tokenization, Optional upsert, Optional homogeneous, - Optional byot, + Optional byot, Map additionalProperties) { this.records = records; this.tokenization = tokenization; @@ -45,7 +55,7 @@ private RecordServiceInsertRecordBody( * @return Record values and tokens. */ @JsonProperty("records") - public Optional> getRecords() { + public List getRecords() { return records; } @@ -58,7 +68,7 @@ public Optional getTokenization() { } /** - * @return Name of a unique column in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record.<br /><br />When you upsert a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed. + * @return Name of a unique column in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record.When you upsert a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed. */ @JsonProperty("upsert") public Optional getUpsert() { @@ -73,15 +83,18 @@ public Optional getHomogeneous() { return homogeneous; } + /** + * @return Token insertion behavior. + */ @JsonProperty("byot") - public Optional getByot() { + public Optional getByot() { return byot; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceInsertRecordBody && equalTo((RecordServiceInsertRecordBody) other); + return other instanceof InsertRecordRequest && equalTo((InsertRecordRequest) other); } @JsonAnyGetter @@ -89,7 +102,7 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceInsertRecordBody other) { + private boolean equalTo(InsertRecordRequest other) { return records.equals(other.records) && tokenization.equals(other.tokenization) && upsert.equals(other.upsert) @@ -97,12 +110,12 @@ private boolean equalTo(RecordServiceInsertRecordBody other) { && byot.equals(other.byot); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.records, this.tokenization, this.upsert, this.homogeneous, this.byot); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -113,7 +126,7 @@ public static Builder builder() { @JsonIgnoreProperties(ignoreUnknown = true) public static final class Builder { - private Optional> records = Optional.empty(); + private List records = new ArrayList<>(); private Optional tokenization = Optional.empty(); @@ -121,14 +134,14 @@ public static final class Builder { private Optional homogeneous = Optional.empty(); - private Optional byot = Optional.empty(); + private Optional byot = Optional.empty(); @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(RecordServiceInsertRecordBody other) { + public Builder from(InsertRecordRequest other) { records(other.getRecords()); tokenization(other.getTokenization()); upsert(other.getUpsert()); @@ -141,13 +154,23 @@ public Builder from(RecordServiceInsertRecordBody other) { *

                                  Record values and tokens.

                                  */ @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } return this; } - public Builder records(List records) { - this.records = Optional.ofNullable(records); + public Builder addRecords(FieldRecords records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } return this; } @@ -166,7 +189,7 @@ public Builder tokenization(Boolean tokenization) { } /** - *

                                  Name of a unique column in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record.<br /><br />When you upsert a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.

                                  + *

                                  Name of a unique column in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record.When you upsert a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.

                                  */ @JsonSetter(value = "upsert", nulls = Nulls.SKIP) public Builder upsert(Optional upsert) { @@ -193,20 +216,32 @@ public Builder homogeneous(Boolean homogeneous) { return this; } + /** + *

                                  Token insertion behavior.

                                  + */ @JsonSetter(value = "byot", nulls = Nulls.SKIP) - public Builder byot(Optional byot) { + public Builder byot(Optional byot) { this.byot = byot; return this; } - public Builder byot(V1Byot byot) { + public Builder byot(InsertRecordRequestByot byot) { this.byot = Optional.ofNullable(byot); return this; } - public RecordServiceInsertRecordBody build() { - return new RecordServiceInsertRecordBody( - records, tokenization, upsert, homogeneous, byot, additionalProperties); + public InsertRecordRequest build() { + return new InsertRecordRequest(records, tokenization, upsert, homogeneous, byot, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRequest.java new file mode 100644 index 00000000..c4db785e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRequest.java @@ -0,0 +1,260 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.InsertRecordData; +import com.skyflow.generated.rest.types.Upsert; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = InsertRequest.Builder.class) +public final class InsertRequest { + private final String vaultId; + + private final String tableName; + + private final List records; + + private final Optional upsert; + + private final Map additionalProperties; + + private InsertRequest( + String vaultId, + String tableName, + List records, + Optional upsert, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.records = records; + this.upsert = upsert; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Name of the table to perform the operation on. Can be defined at both the request body level and individual record level. If provided at both levels, the record-level tableName takes precedence. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Data to insert as a list of records. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @JsonProperty("upsert") + public Optional getUpsert() { + return upsert; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof InsertRequest && equalTo((InsertRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(InsertRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && records.equals(other.records) + && upsert.equals(other.upsert); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tableName, this.records, this.upsert); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + TableNameStage vaultId(@NotNull String vaultId); + + Builder from(InsertRequest other); + } + + public interface TableNameStage { + /** + *

                                  Name of the table to perform the operation on. Can be defined at both the request body level and individual record level. If provided at both levels, the record-level tableName takes precedence.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + } + + public interface _FinalStage { + InsertRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Data to insert as a list of records.

                                  + */ + _FinalStage records(List records); + + _FinalStage addRecords(InsertRecordData records); + + _FinalStage addAllRecords(List records); + + _FinalStage upsert(Optional upsert); + + _FinalStage upsert(Upsert upsert); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, TableNameStage, _FinalStage { + private String vaultId; + + private String tableName; + + private Optional upsert = Optional.empty(); + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(InsertRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + records(other.getRecords()); + upsert(other.getUpsert()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public TableNameStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Name of the table to perform the operation on. Can be defined at both the request body level and individual record level. If provided at both levels, the record-level tableName takes precedence.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + @java.lang.Override + public _FinalStage upsert(Upsert upsert) { + this.upsert = Optional.ofNullable(upsert); + return this; + } + + @java.lang.Override + @JsonSetter(value = "upsert", nulls = Nulls.SKIP) + public _FinalStage upsert(Optional upsert) { + this.upsert = upsert; + return this; + } + + /** + *

                                  Data to insert as a list of records.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

                                  Data to insert as a list of records.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(InsertRecordData records) { + this.records.add(records); + return this; + } + + /** + *

                                  Data to insert as a list of records.

                                  + */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public InsertRequest build() { + return new InsertRequest(vaultId, tableName, records, upsert, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java deleted file mode 100644 index c1997213..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java +++ /dev/null @@ -1,151 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1BatchRecord; -import com.skyflow.generated.rest.types.V1Byot; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceBatchOperationBody.Builder.class) -public final class RecordServiceBatchOperationBody { - private final Optional> records; - - private final Optional continueOnError; - - private final Optional byot; - - private final Map additionalProperties; - - private RecordServiceBatchOperationBody( - Optional> records, - Optional continueOnError, - Optional byot, - Map additionalProperties) { - this.records = records; - this.continueOnError = continueOnError; - this.byot = byot; - this.additionalProperties = additionalProperties; - } - - /** - * @return Record operations to perform. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - /** - * @return Continue performing operations on partial errors. - */ - @JsonProperty("continueOnError") - public Optional getContinueOnError() { - return continueOnError; - } - - @JsonProperty("byot") - public Optional getByot() { - return byot; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof RecordServiceBatchOperationBody && equalTo((RecordServiceBatchOperationBody) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(RecordServiceBatchOperationBody other) { - return records.equals(other.records) - && continueOnError.equals(other.continueOnError) - && byot.equals(other.byot); - } - - @Override - public int hashCode() { - return Objects.hash(this.records, this.continueOnError, this.byot); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> records = Optional.empty(); - - private Optional continueOnError = Optional.empty(); - - private Optional byot = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(RecordServiceBatchOperationBody other) { - records(other.getRecords()); - continueOnError(other.getContinueOnError()); - byot(other.getByot()); - return this; - } - - /** - *

                                  Record operations to perform.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - /** - *

                                  Continue performing operations on partial errors.

                                  - */ - @JsonSetter(value = "continueOnError", nulls = Nulls.SKIP) - public Builder continueOnError(Optional continueOnError) { - this.continueOnError = continueOnError; - return this; - } - - public Builder continueOnError(Boolean continueOnError) { - this.continueOnError = Optional.ofNullable(continueOnError); - return this; - } - - @JsonSetter(value = "byot", nulls = Nulls.SKIP) - public Builder byot(Optional byot) { - this.byot = byot; - return this; - } - - public Builder byot(V1Byot byot) { - this.byot = Optional.ofNullable(byot); - return this; - } - - public RecordServiceBatchOperationBody build() { - return new RecordServiceBatchOperationBody(records, continueOnError, byot, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRecordRequest.java similarity index 58% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRecordRequest.java index f5c7a229..2e22ed53 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRecordRequest.java @@ -3,32 +3,37 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1Byot; -import com.skyflow.generated.rest.types.V1FieldRecords; - +import com.skyflow.generated.rest.resources.records.types.UpdateRecordRequestByot; +import com.skyflow.generated.rest.types.FieldRecords; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceUpdateRecordBody.Builder.class) -public final class RecordServiceUpdateRecordBody { - private final Optional record; +@JsonDeserialize(builder = UpdateRecordRequest.Builder.class) +public final class UpdateRecordRequest { + private final Optional record; private final Optional tokenization; - private final Optional byot; + private final Optional byot; private final Map additionalProperties; - private RecordServiceUpdateRecordBody( - Optional record, + private UpdateRecordRequest( + Optional record, Optional tokenization, - Optional byot, + Optional byot, Map additionalProperties) { this.record = record; this.tokenization = tokenization; @@ -37,7 +42,7 @@ private RecordServiceUpdateRecordBody( } @JsonProperty("record") - public Optional getRecord() { + public Optional getRecord() { return record; } @@ -49,15 +54,18 @@ public Optional getTokenization() { return tokenization; } + /** + * @return Token insertion behavior. + */ @JsonProperty("byot") - public Optional getByot() { + public Optional getByot() { return byot; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceUpdateRecordBody && equalTo((RecordServiceUpdateRecordBody) other); + return other instanceof UpdateRecordRequest && equalTo((UpdateRecordRequest) other); } @JsonAnyGetter @@ -65,16 +73,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceUpdateRecordBody other) { + private boolean equalTo(UpdateRecordRequest other) { return record.equals(other.record) && tokenization.equals(other.tokenization) && byot.equals(other.byot); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.record, this.tokenization, this.byot); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -85,18 +93,18 @@ public static Builder builder() { @JsonIgnoreProperties(ignoreUnknown = true) public static final class Builder { - private Optional record = Optional.empty(); + private Optional record = Optional.empty(); private Optional tokenization = Optional.empty(); - private Optional byot = Optional.empty(); + private Optional byot = Optional.empty(); @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(RecordServiceUpdateRecordBody other) { + public Builder from(UpdateRecordRequest other) { record(other.getRecord()); tokenization(other.getTokenization()); byot(other.getByot()); @@ -104,12 +112,12 @@ public Builder from(RecordServiceUpdateRecordBody other) { } @JsonSetter(value = "record", nulls = Nulls.SKIP) - public Builder record(Optional record) { + public Builder record(Optional record) { this.record = record; return this; } - public Builder record(V1FieldRecords record) { + public Builder record(FieldRecords record) { this.record = Optional.ofNullable(record); return this; } @@ -128,19 +136,32 @@ public Builder tokenization(Boolean tokenization) { return this; } + /** + *

                                  Token insertion behavior.

                                  + */ @JsonSetter(value = "byot", nulls = Nulls.SKIP) - public Builder byot(Optional byot) { + public Builder byot(Optional byot) { this.byot = byot; return this; } - public Builder byot(V1Byot byot) { + public Builder byot(UpdateRecordRequestByot byot) { this.byot = Optional.ofNullable(byot); return this; } - public RecordServiceUpdateRecordBody build() { - return new RecordServiceUpdateRecordBody(record, tokenization, byot, additionalProperties); + public UpdateRecordRequest build() { + return new UpdateRecordRequest(record, tokenization, byot, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRequest.java new file mode 100644 index 00000000..6b7f32c7 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRequest.java @@ -0,0 +1,273 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.resources.records.types.UpdateRequestUpdateType; +import com.skyflow.generated.rest.types.UpdateRecordData; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = UpdateRequest.Builder.class) +public final class UpdateRequest { + private final String vaultId; + + private final String tableName; + + private final List records; + + private final Optional updateType; + + private final Map additionalProperties; + + private UpdateRequest( + String vaultId, + String tableName, + List records, + Optional updateType, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.records = records; + this.updateType = updateType; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Data to update as a list of records. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + /** + * @return Type of update operation to perform. + */ + @JsonProperty("updateType") + public Optional getUpdateType() { + return updateType; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof UpdateRequest && equalTo((UpdateRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(UpdateRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && records.equals(other.records) + && updateType.equals(other.updateType); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tableName, this.records, this.updateType); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + TableNameStage vaultId(@NotNull String vaultId); + + Builder from(UpdateRequest other); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + } + + public interface _FinalStage { + UpdateRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Data to update as a list of records.

                                  + */ + _FinalStage records(List records); + + _FinalStage addRecords(UpdateRecordData records); + + _FinalStage addAllRecords(List records); + + /** + *

                                  Type of update operation to perform.

                                  + */ + _FinalStage updateType(Optional updateType); + + _FinalStage updateType(UpdateRequestUpdateType updateType); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, TableNameStage, _FinalStage { + private String vaultId; + + private String tableName; + + private Optional updateType = Optional.empty(); + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(UpdateRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + records(other.getRecords()); + updateType(other.getUpdateType()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public TableNameStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage updateType(UpdateRequestUpdateType updateType) { + this.updateType = Optional.ofNullable(updateType); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + */ + @java.lang.Override + @JsonSetter(value = "updateType", nulls = Nulls.SKIP) + public _FinalStage updateType(Optional updateType) { + this.updateType = updateType; + return this; + } + + /** + *

                                  Data to update as a list of records.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

                                  Data to update as a list of records.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(UpdateRecordData records) { + this.records.add(records); + return this; + } + + /** + *

                                  Data to update as a list of records.

                                  + */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public UpdateRequest build() { + return new UpdateRequest(vaultId, tableName, records, updateType, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordByIdRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordByIdRequestRedaction.java new file mode 100644 index 00000000..46191987 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordByIdRequestRedaction.java @@ -0,0 +1,108 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class GetRecordByIdRequestRedaction { + public static final GetRecordByIdRequestRedaction DEFAULT = + new GetRecordByIdRequestRedaction(Value.DEFAULT, "DEFAULT"); + + public static final GetRecordByIdRequestRedaction PLAIN_TEXT = + new GetRecordByIdRequestRedaction(Value.PLAIN_TEXT, "PLAIN_TEXT"); + + public static final GetRecordByIdRequestRedaction MASKED = + new GetRecordByIdRequestRedaction(Value.MASKED, "MASKED"); + + public static final GetRecordByIdRequestRedaction REDACTED = + new GetRecordByIdRequestRedaction(Value.REDACTED, "REDACTED"); + + private final Value value; + + private final String string; + + GetRecordByIdRequestRedaction(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof GetRecordByIdRequestRedaction + && this.string.equals(((GetRecordByIdRequestRedaction) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DEFAULT: + return visitor.visitDefault(); + case PLAIN_TEXT: + return visitor.visitPlainText(); + case MASKED: + return visitor.visitMasked(); + case REDACTED: + return visitor.visitRedacted(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static GetRecordByIdRequestRedaction valueOf(String value) { + switch (value) { + case "DEFAULT": + return DEFAULT; + case "PLAIN_TEXT": + return PLAIN_TEXT; + case "MASKED": + return MASKED; + case "REDACTED": + return REDACTED; + default: + return new GetRecordByIdRequestRedaction(Value.UNKNOWN, value); + } + } + + public enum Value { + DEFAULT, + + REDACTED, + + MASKED, + + PLAIN_TEXT, + + UNKNOWN + } + + public interface Visitor { + T visitDefault(); + + T visitRedacted(); + + T visitMasked(); + + T visitPlainText(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestOrderBy.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestOrderBy.java new file mode 100644 index 00000000..886afd43 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestOrderBy.java @@ -0,0 +1,95 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class GetRecordsRequestOrderBy { + public static final GetRecordsRequestOrderBy DESCENDING = + new GetRecordsRequestOrderBy(Value.DESCENDING, "DESCENDING"); + + public static final GetRecordsRequestOrderBy NONE = new GetRecordsRequestOrderBy(Value.NONE, "NONE"); + + public static final GetRecordsRequestOrderBy ASCENDING = new GetRecordsRequestOrderBy(Value.ASCENDING, "ASCENDING"); + + private final Value value; + + private final String string; + + GetRecordsRequestOrderBy(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof GetRecordsRequestOrderBy + && this.string.equals(((GetRecordsRequestOrderBy) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DESCENDING: + return visitor.visitDescending(); + case NONE: + return visitor.visitNone(); + case ASCENDING: + return visitor.visitAscending(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static GetRecordsRequestOrderBy valueOf(String value) { + switch (value) { + case "DESCENDING": + return DESCENDING; + case "NONE": + return NONE; + case "ASCENDING": + return ASCENDING; + default: + return new GetRecordsRequestOrderBy(Value.UNKNOWN, value); + } + } + + public enum Value { + ASCENDING, + + DESCENDING, + + NONE, + + UNKNOWN + } + + public interface Visitor { + T visitAscending(); + + T visitDescending(); + + T visitNone(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestRedaction.java new file mode 100644 index 00000000..f3ac934c --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestRedaction.java @@ -0,0 +1,106 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class GetRecordsRequestRedaction { + public static final GetRecordsRequestRedaction DEFAULT = new GetRecordsRequestRedaction(Value.DEFAULT, "DEFAULT"); + + public static final GetRecordsRequestRedaction PLAIN_TEXT = + new GetRecordsRequestRedaction(Value.PLAIN_TEXT, "PLAIN_TEXT"); + + public static final GetRecordsRequestRedaction MASKED = new GetRecordsRequestRedaction(Value.MASKED, "MASKED"); + + public static final GetRecordsRequestRedaction REDACTED = + new GetRecordsRequestRedaction(Value.REDACTED, "REDACTED"); + + private final Value value; + + private final String string; + + GetRecordsRequestRedaction(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof GetRecordsRequestRedaction + && this.string.equals(((GetRecordsRequestRedaction) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DEFAULT: + return visitor.visitDefault(); + case PLAIN_TEXT: + return visitor.visitPlainText(); + case MASKED: + return visitor.visitMasked(); + case REDACTED: + return visitor.visitRedacted(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static GetRecordsRequestRedaction valueOf(String value) { + switch (value) { + case "DEFAULT": + return DEFAULT; + case "PLAIN_TEXT": + return PLAIN_TEXT; + case "MASKED": + return MASKED; + case "REDACTED": + return REDACTED; + default: + return new GetRecordsRequestRedaction(Value.UNKNOWN, value); + } + } + + public enum Value { + DEFAULT, + + REDACTED, + + MASKED, + + PLAIN_TEXT, + + UNKNOWN + } + + public interface Visitor { + T visitDefault(); + + T visitRedacted(); + + T visitMasked(); + + T visitPlainText(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/InsertRecordRequestByot.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/InsertRecordRequestByot.java new file mode 100644 index 00000000..b4e402aa --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/InsertRecordRequestByot.java @@ -0,0 +1,95 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class InsertRecordRequestByot { + public static final InsertRecordRequestByot ENABLE_STRICT = + new InsertRecordRequestByot(Value.ENABLE_STRICT, "ENABLE_STRICT"); + + public static final InsertRecordRequestByot DISABLE = new InsertRecordRequestByot(Value.DISABLE, "DISABLE"); + + public static final InsertRecordRequestByot ENABLE = new InsertRecordRequestByot(Value.ENABLE, "ENABLE"); + + private final Value value; + + private final String string; + + InsertRecordRequestByot(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof InsertRecordRequestByot + && this.string.equals(((InsertRecordRequestByot) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case ENABLE_STRICT: + return visitor.visitEnableStrict(); + case DISABLE: + return visitor.visitDisable(); + case ENABLE: + return visitor.visitEnable(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static InsertRecordRequestByot valueOf(String value) { + switch (value) { + case "ENABLE_STRICT": + return ENABLE_STRICT; + case "DISABLE": + return DISABLE; + case "ENABLE": + return ENABLE; + default: + return new InsertRecordRequestByot(Value.UNKNOWN, value); + } + } + + public enum Value { + DISABLE, + + ENABLE, + + ENABLE_STRICT, + + UNKNOWN + } + + public interface Visitor { + T visitDisable(); + + T visitEnable(); + + T visitEnableStrict(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java deleted file mode 100644 index 1f25b38d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RecordServiceBulkGetRecordRequestOrderBy { - ASCENDING("ASCENDING"), - - DESCENDING("DESCENDING"), - - NONE("NONE"); - - private final String value; - - RecordServiceBulkGetRecordRequestOrderBy(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java deleted file mode 100644 index 12bbc291..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RecordServiceBulkGetRecordRequestRedaction { - DEFAULT("DEFAULT"), - - REDACTED("REDACTED"), - - MASKED("MASKED"), - - PLAIN_TEXT("PLAIN_TEXT"); - - private final String value; - - RecordServiceBulkGetRecordRequestRedaction(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java deleted file mode 100644 index 4f546262..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RecordServiceGetRecordRequestRedaction { - DEFAULT("DEFAULT"), - - REDACTED("REDACTED"), - - MASKED("MASKED"), - - PLAIN_TEXT("PLAIN_TEXT"); - - private final String value; - - RecordServiceGetRecordRequestRedaction(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRecordRequestByot.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRecordRequestByot.java new file mode 100644 index 00000000..6af77d59 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRecordRequestByot.java @@ -0,0 +1,95 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class UpdateRecordRequestByot { + public static final UpdateRecordRequestByot ENABLE_STRICT = + new UpdateRecordRequestByot(Value.ENABLE_STRICT, "ENABLE_STRICT"); + + public static final UpdateRecordRequestByot DISABLE = new UpdateRecordRequestByot(Value.DISABLE, "DISABLE"); + + public static final UpdateRecordRequestByot ENABLE = new UpdateRecordRequestByot(Value.ENABLE, "ENABLE"); + + private final Value value; + + private final String string; + + UpdateRecordRequestByot(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof UpdateRecordRequestByot + && this.string.equals(((UpdateRecordRequestByot) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case ENABLE_STRICT: + return visitor.visitEnableStrict(); + case DISABLE: + return visitor.visitDisable(); + case ENABLE: + return visitor.visitEnable(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static UpdateRecordRequestByot valueOf(String value) { + switch (value) { + case "ENABLE_STRICT": + return ENABLE_STRICT; + case "DISABLE": + return DISABLE; + case "ENABLE": + return ENABLE; + default: + return new UpdateRecordRequestByot(Value.UNKNOWN, value); + } + } + + public enum Value { + DISABLE, + + ENABLE, + + ENABLE_STRICT, + + UNKNOWN + } + + public interface Visitor { + T visitDisable(); + + T visitEnable(); + + T visitEnableStrict(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRequestUpdateType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRequestUpdateType.java new file mode 100644 index 00000000..660067b8 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRequestUpdateType.java @@ -0,0 +1,84 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class UpdateRequestUpdateType { + public static final UpdateRequestUpdateType REPLACE = new UpdateRequestUpdateType(Value.REPLACE, "REPLACE"); + + public static final UpdateRequestUpdateType UPDATE = new UpdateRequestUpdateType(Value.UPDATE, "UPDATE"); + + private final Value value; + + private final String string; + + UpdateRequestUpdateType(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof UpdateRequestUpdateType + && this.string.equals(((UpdateRequestUpdateType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case REPLACE: + return visitor.visitReplace(); + case UPDATE: + return visitor.visitUpdate(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static UpdateRequestUpdateType valueOf(String value) { + switch (value) { + case "REPLACE": + return REPLACE; + case "UPDATE": + return UPDATE; + default: + return new UpdateRequestUpdateType(Value.UNKNOWN, value); + } + } + + public enum Value { + UPDATE, + + REPLACE, + + UNKNOWN + } + + public interface Visitor { + T visitUpdate(); + + T visitReplace(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java deleted file mode 100644 index 36b364b5..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java +++ /dev/null @@ -1,210 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.InternalServerError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.IdentifyResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; - -public class AsyncRawStringsClient { - protected final ClientOptions clientOptions; - - public AsyncRawStringsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * De-identifies sensitive data from a string. - */ - public CompletableFuture> deidentifyString( - DeidentifyStringRequest request) { - return deidentifyString(request, null); - } - - /** - * De-identifies sensitive data from a string. - */ - public CompletableFuture> deidentifyString( - DeidentifyStringRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/string") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyStringResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture> reidentifyString() { - return reidentifyString(ReidentifyStringRequest.builder().build()); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture> reidentifyString( - ReidentifyStringRequest request) { - return reidentifyString(request, null); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture> reidentifyString( - ReidentifyStringRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/reidentify/string") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - CompletableFuture> future = new CompletableFuture<>(); - client.newCall(okhttpRequest).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { - try (ResponseBody responseBody = response.body()) { - if (response.isSuccessful()) { - future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), IdentifyResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java deleted file mode 100644 index 66ef72c5..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.IdentifyResponse; - -import java.util.concurrent.CompletableFuture; - -public class AsyncStringsClient { - protected final ClientOptions clientOptions; - - private final AsyncRawStringsClient rawClient; - - public AsyncStringsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new AsyncRawStringsClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public AsyncRawStringsClient withRawResponse() { - return this.rawClient; - } - - /** - * De-identifies sensitive data from a string. - */ - public CompletableFuture deidentifyString(DeidentifyStringRequest request) { - return this.rawClient.deidentifyString(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a string. - */ - public CompletableFuture deidentifyString( - DeidentifyStringRequest request, RequestOptions requestOptions) { - return this.rawClient.deidentifyString(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture reidentifyString() { - return this.rawClient.reidentifyString().thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture reidentifyString(ReidentifyStringRequest request) { - return this.rawClient.reidentifyString(request).thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture reidentifyString( - ReidentifyStringRequest request, RequestOptions requestOptions) { - return this.rawClient.reidentifyString(request, requestOptions).thenApply(response -> response.body()); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java deleted file mode 100644 index da6bec56..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java +++ /dev/null @@ -1,166 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.InternalServerError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.IdentifyResponse; -import okhttp3.*; - -import java.io.IOException; - -public class RawStringsClient { - protected final ClientOptions clientOptions; - - public RawStringsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * De-identifies sensitive data from a string. - */ - public ApiClientHttpResponse deidentifyString(DeidentifyStringRequest request) { - return deidentifyString(request, null); - } - - /** - * De-identifies sensitive data from a string. - */ - public ApiClientHttpResponse deidentifyString( - DeidentifyStringRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/string") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyStringResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Re-identifies tokens in a string. - */ - public ApiClientHttpResponse reidentifyString() { - return reidentifyString(ReidentifyStringRequest.builder().build()); - } - - /** - * Re-identifies tokens in a string. - */ - public ApiClientHttpResponse reidentifyString(ReidentifyStringRequest request) { - return reidentifyString(request, null); - } - - /** - * Re-identifies tokens in a string. - */ - public ApiClientHttpResponse reidentifyString( - ReidentifyStringRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/reidentify/string") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), IdentifyResponse.class), response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java deleted file mode 100644 index 5dfca68b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.IdentifyResponse; - -public class StringsClient { - protected final ClientOptions clientOptions; - - private final RawStringsClient rawClient; - - public StringsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new RawStringsClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public RawStringsClient withRawResponse() { - return this.rawClient; - } - - /** - * De-identifies sensitive data from a string. - */ - public DeidentifyStringResponse deidentifyString(DeidentifyStringRequest request) { - return this.rawClient.deidentifyString(request).body(); - } - - /** - * De-identifies sensitive data from a string. - */ - public DeidentifyStringResponse deidentifyString(DeidentifyStringRequest request, RequestOptions requestOptions) { - return this.rawClient.deidentifyString(request, requestOptions).body(); - } - - /** - * Re-identifies tokens in a string. - */ - public IdentifyResponse reidentifyString() { - return this.rawClient.reidentifyString().body(); - } - - /** - * Re-identifies tokens in a string. - */ - public IdentifyResponse reidentifyString(ReidentifyStringRequest request) { - return this.rawClient.reidentifyString(request).body(); - } - - /** - * Re-identifies tokens in a string. - */ - public IdentifyResponse reidentifyString(ReidentifyStringRequest request, RequestOptions requestOptions) { - return this.rawClient.reidentifyString(request, requestOptions).body(); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java deleted file mode 100644 index 06ec6cec..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java +++ /dev/null @@ -1,394 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.strings.types.DeidentifyStringRequestEntityTypesItem; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyStringRequest.Builder.class) -public final class DeidentifyStringRequest { - private final String text; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyStringRequest( - String text, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.text = text; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Text to de-identify. - */ - @JsonProperty("text") - public String getText() { - return text; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyStringRequest && equalTo((DeidentifyStringRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyStringRequest other) { - return text.equals(other.text) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.text, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static TextStage builder() { - return new Builder(); - } - - public interface TextStage { - /** - * Text to de-identify. - */ - VaultIdStage text(@NotNull String text); - - Builder from(DeidentifyStringRequest other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyStringRequest build(); - - /** - *

                                  Entities to detect and de-identify.

                                  - */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

                                  Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

                                  - */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

                                  Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

                                  - */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

                                  ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

                                  - */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TextStage, VaultIdStage, _FinalStage { - private String text; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyStringRequest other) { - text(other.getText()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - /** - * Text to de-identify.

                                  Text to de-identify.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("text") - public VaultIdStage text(@NotNull String text) { - this.text = Objects.requireNonNull(text, "text must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

                                  ID of a vault that you have Detect Invoker or Vault Owner permissions for.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

                                  ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

                                  ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

                                  - */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

                                  Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

                                  Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

                                  - */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

                                  Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

                                  Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

                                  - */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

                                  Entities to detect and de-identify.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

                                  Entities to detect and de-identify.

                                  - */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes(Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyStringRequest build() { - return new DeidentifyStringRequest( - text, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java deleted file mode 100644 index 3c42390c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java +++ /dev/null @@ -1,151 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.Format; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ReidentifyStringRequest.Builder.class) -public final class ReidentifyStringRequest { - private final Optional text; - - private final Optional vaultId; - - private final Optional format; - - private final Map additionalProperties; - - private ReidentifyStringRequest( - Optional text, - Optional vaultId, - Optional format, - Map additionalProperties) { - this.text = text; - this.vaultId = vaultId; - this.format = format; - this.additionalProperties = additionalProperties; - } - - /** - * @return Text to reidentify. - */ - @JsonProperty("text") - public Optional getText() { - return text; - } - - /** - * @return ID of the vault where the entities are stored. - */ - @JsonProperty("vault_id") - public Optional getVaultId() { - return vaultId; - } - - @JsonProperty("format") - public Optional getFormat() { - return format; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ReidentifyStringRequest && equalTo((ReidentifyStringRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ReidentifyStringRequest other) { - return text.equals(other.text) && vaultId.equals(other.vaultId) && format.equals(other.format); - } - - @Override - public int hashCode() { - return Objects.hash(this.text, this.vaultId, this.format); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional text = Optional.empty(); - - private Optional vaultId = Optional.empty(); - - private Optional format = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ReidentifyStringRequest other) { - text(other.getText()); - vaultId(other.getVaultId()); - format(other.getFormat()); - return this; - } - - /** - *

                                  Text to reidentify.

                                  - */ - @JsonSetter(value = "text", nulls = Nulls.SKIP) - public Builder text(Optional text) { - this.text = text; - return this; - } - - public Builder text(String text) { - this.text = Optional.ofNullable(text); - return this; - } - - /** - *

                                  ID of the vault where the entities are stored.

                                  - */ - @JsonSetter(value = "vault_id", nulls = Nulls.SKIP) - public Builder vaultId(Optional vaultId) { - this.vaultId = vaultId; - return this; - } - - public Builder vaultId(String vaultId) { - this.vaultId = Optional.ofNullable(vaultId); - return this; - } - - @JsonSetter(value = "format", nulls = Nulls.SKIP) - public Builder format(Optional format) { - this.format = format; - return this; - } - - public Builder format(Format format) { - this.format = Optional.ofNullable(format); - return this; - } - - public ReidentifyStringRequest build() { - return new ReidentifyStringRequest(text, vaultId, format, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java deleted file mode 100644 index 28066122..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyStringRequestEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyStringRequestEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java index 794035bd..5543aadc 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java @@ -4,17 +4,35 @@ package com.skyflow.generated.rest.resources.tokens; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.errors.BadRequestError; +import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - +import com.skyflow.generated.rest.errors.UnauthorizedError; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.DetokenizeResponse; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.TokenizeResponse; import java.io.IOException; import java.util.concurrent.CompletableFuture; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; public class AsyncRawTokensClient { protected final ClientOptions clientOptions; @@ -26,29 +44,26 @@ public AsyncRawTokensClient(ClientOptions clientOptions) { /** * Returns records that correspond to the specified tokens. */ - public CompletableFuture> recordServiceDetokenize(String vaultId) { - return recordServiceDetokenize(vaultId, V1DetokenizePayload.builder().build()); + public CompletableFuture> detokenize( + String vaultId, DetokenizePayload request) { + return detokenize(vaultId, request, null); } /** * Returns records that correspond to the specified tokens. */ - public CompletableFuture> recordServiceDetokenize( - String vaultId, V1DetokenizePayload request) { - return recordServiceDetokenize(vaultId, request, null); - } - - /** - * Returns records that correspond to the specified tokens. - */ - public CompletableFuture> recordServiceDetokenize( - String vaultId, V1DetokenizePayload request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> detokenize( + String vaultId, DetokenizePayload request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("detokenize") - .build(); + .addPathSegments("detokenize"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -57,7 +72,7 @@ public CompletableFuture> recordServ throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -67,33 +82,60 @@ public CompletableFuture> recordServ if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DetokenizeResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DetokenizeResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -108,31 +150,28 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. - */ - public CompletableFuture> recordServiceTokenize(String vaultId) { - return recordServiceTokenize(vaultId, V1TokenizePayload.builder().build()); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public CompletableFuture> recordServiceTokenize( - String vaultId, V1TokenizePayload request) { - return recordServiceTokenize(vaultId, request, null); + public CompletableFuture> tokenize( + String vaultId, TokenizePayload request) { + return tokenize(vaultId, request, null); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public CompletableFuture> recordServiceTokenize( - String vaultId, V1TokenizePayload request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> tokenize( + String vaultId, TokenizePayload request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("tokenize") - .build(); + .addPathSegments("tokenize"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -141,7 +180,7 @@ public CompletableFuture> recordServic throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -151,33 +190,60 @@ public CompletableFuture> recordServic if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } + CompletableFuture> future = new CompletableFuture<>(); client.newCall(okhttpRequest).enqueue(new Callback() { @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1TokenizeResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, TokenizeResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response)); - return; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java index 621701af..da6a88de 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java @@ -5,11 +5,10 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; - +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.DetokenizeResponse; +import com.skyflow.generated.rest.types.TokenizeResponse; import java.util.concurrent.CompletableFuture; public class AsyncTokensClient { @@ -32,49 +31,30 @@ public AsyncRawTokensClient withRawResponse() { /** * Returns records that correspond to the specified tokens. */ - public CompletableFuture recordServiceDetokenize(String vaultId) { - return this.rawClient.recordServiceDetokenize(vaultId).thenApply(response -> response.body()); - } - - /** - * Returns records that correspond to the specified tokens. - */ - public CompletableFuture recordServiceDetokenize( - String vaultId, V1DetokenizePayload request) { - return this.rawClient.recordServiceDetokenize(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture detokenize(String vaultId, DetokenizePayload request) { + return this.rawClient.detokenize(vaultId, request).thenApply(response -> response.body()); } /** * Returns records that correspond to the specified tokens. */ - public CompletableFuture recordServiceDetokenize( - String vaultId, V1DetokenizePayload request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceDetokenize(vaultId, request, requestOptions) - .thenApply(response -> response.body()); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. - */ - public CompletableFuture recordServiceTokenize(String vaultId) { - return this.rawClient.recordServiceTokenize(vaultId).thenApply(response -> response.body()); + public CompletableFuture detokenize( + String vaultId, DetokenizePayload request, RequestOptions requestOptions) { + return this.rawClient.detokenize(vaultId, request, requestOptions).thenApply(response -> response.body()); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public CompletableFuture recordServiceTokenize(String vaultId, V1TokenizePayload request) { - return this.rawClient.recordServiceTokenize(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture tokenize(String vaultId, TokenizePayload request) { + return this.rawClient.tokenize(vaultId, request).thenApply(response -> response.body()); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public CompletableFuture recordServiceTokenize( - String vaultId, V1TokenizePayload request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceTokenize(vaultId, request, requestOptions) - .thenApply(response -> response.body()); + public CompletableFuture tokenize( + String vaultId, TokenizePayload request, RequestOptions requestOptions) { + return this.rawClient.tokenize(vaultId, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java index 7ad69d11..6780c88c 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java @@ -4,15 +4,31 @@ package com.skyflow.generated.rest.resources.tokens; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.errors.BadRequestError; +import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import okhttp3.*; - +import com.skyflow.generated.rest.errors.UnauthorizedError; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.DetokenizeResponse; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.TokenizeResponse; import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; public class RawTokensClient { protected final ClientOptions clientOptions; @@ -24,29 +40,25 @@ public RawTokensClient(ClientOptions clientOptions) { /** * Returns records that correspond to the specified tokens. */ - public ApiClientHttpResponse recordServiceDetokenize(String vaultId) { - return recordServiceDetokenize(vaultId, V1DetokenizePayload.builder().build()); - } - - /** - * Returns records that correspond to the specified tokens. - */ - public ApiClientHttpResponse recordServiceDetokenize( - String vaultId, V1DetokenizePayload request) { - return recordServiceDetokenize(vaultId, request, null); + public ApiClientHttpResponse detokenize(String vaultId, DetokenizePayload request) { + return detokenize(vaultId, request, null); } /** * Returns records that correspond to the specified tokens. */ - public ApiClientHttpResponse recordServiceDetokenize( - String vaultId, V1DetokenizePayload request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse detokenize( + String vaultId, DetokenizePayload request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("detokenize") - .build(); + .addPathSegments("detokenize"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -55,7 +67,7 @@ public ApiClientHttpResponse recordServiceDetokenize( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -65,57 +77,72 @@ public ApiClientHttpResponse recordServiceDetokenize( if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DetokenizeResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DetokenizeResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. - */ - public ApiClientHttpResponse recordServiceTokenize(String vaultId) { - return recordServiceTokenize(vaultId, V1TokenizePayload.builder().build()); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public ApiClientHttpResponse recordServiceTokenize(String vaultId, V1TokenizePayload request) { - return recordServiceTokenize(vaultId, request, null); + public ApiClientHttpResponse tokenize(String vaultId, TokenizePayload request) { + return tokenize(vaultId, request, null); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public ApiClientHttpResponse recordServiceTokenize( - String vaultId, V1TokenizePayload request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse tokenize( + String vaultId, TokenizePayload request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("tokenize") - .build(); + .addPathSegments("tokenize"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -124,7 +151,7 @@ public ApiClientHttpResponse recordServiceTokenize( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -134,26 +161,45 @@ public ApiClientHttpResponse recordServiceTokenize( if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } + if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) { + okhttpRequest = okhttpRequest + .newBuilder() + .tag( + RetryInterceptor.MaxRetriesOverride.class, + new RetryInterceptor.MaxRetriesOverride( + requestOptions.getMaxRetries().get())) + .build(); + } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1TokenizeResponse.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, TokenizeResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java index 8b0e7e40..47656ee5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java @@ -5,10 +5,10 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.DetokenizeResponse; +import com.skyflow.generated.rest.types.TokenizeResponse; public class TokensClient { protected final ClientOptions clientOptions; @@ -30,48 +30,28 @@ public RawTokensClient withRawResponse() { /** * Returns records that correspond to the specified tokens. */ - public V1DetokenizeResponse recordServiceDetokenize(String vaultId) { - return this.rawClient.recordServiceDetokenize(vaultId).body(); + public DetokenizeResponse detokenize(String vaultId, DetokenizePayload request) { + return this.rawClient.detokenize(vaultId, request).body(); } /** * Returns records that correspond to the specified tokens. */ - public V1DetokenizeResponse recordServiceDetokenize(String vaultId, V1DetokenizePayload request) { - return this.rawClient.recordServiceDetokenize(vaultId, request).body(); + public DetokenizeResponse detokenize(String vaultId, DetokenizePayload request, RequestOptions requestOptions) { + return this.rawClient.detokenize(vaultId, request, requestOptions).body(); } /** - * Returns records that correspond to the specified tokens. - */ - public V1DetokenizeResponse recordServiceDetokenize( - String vaultId, V1DetokenizePayload request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceDetokenize(vaultId, request, requestOptions) - .body(); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. - */ - public V1TokenizeResponse recordServiceTokenize(String vaultId) { - return this.rawClient.recordServiceTokenize(vaultId).body(); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public V1TokenizeResponse recordServiceTokenize(String vaultId, V1TokenizePayload request) { - return this.rawClient.recordServiceTokenize(vaultId, request).body(); + public TokenizeResponse tokenize(String vaultId, TokenizePayload request) { + return this.rawClient.tokenize(vaultId, request).body(); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public V1TokenizeResponse recordServiceTokenize( - String vaultId, V1TokenizePayload request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceTokenize(vaultId, request, requestOptions) - .body(); + public TokenizeResponse tokenize(String vaultId, TokenizePayload request, RequestOptions requestOptions) { + return this.rawClient.tokenize(vaultId, request, requestOptions).body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DeleteTokenRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DeleteTokenRequest.java new file mode 100644 index 00000000..61f59fa4 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DeleteTokenRequest.java @@ -0,0 +1,189 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteTokenRequest.Builder.class) +public final class DeleteTokenRequest { + private final String vaultId; + + private final List tokens; + + private final Map additionalProperties; + + private DeleteTokenRequest(String vaultId, List tokens, Map additionalProperties) { + this.vaultId = vaultId; + this.tokens = tokens; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Tokens to delete. + */ + @JsonProperty("tokens") + public List getTokens() { + return tokens; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteTokenRequest && equalTo((DeleteTokenRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteTokenRequest other) { + return vaultId.equals(other.vaultId) && tokens.equals(other.tokens); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tokens); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(DeleteTokenRequest other); + } + + public interface _FinalStage { + DeleteTokenRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Tokens to delete.

                                  + */ + _FinalStage tokens(List tokens); + + _FinalStage addTokens(String tokens); + + _FinalStage addAllTokens(List tokens); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List tokens = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DeleteTokenRequest other) { + vaultId(other.getVaultId()); + tokens(other.getTokens()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Tokens to delete.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllTokens(List tokens) { + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + /** + *

                                  Tokens to delete.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addTokens(String tokens) { + this.tokens.add(tokens); + return this; + } + + /** + *

                                  Tokens to delete.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public _FinalStage tokens(List tokens) { + this.tokens.clear(); + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + @java.lang.Override + public DeleteTokenRequest build() { + return new DeleteTokenRequest(vaultId, tokens, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizePayload.java similarity index 61% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizePayload.java index 52571f64..03681bb5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizePayload.java @@ -3,17 +3,27 @@ */ package com.skyflow.generated.rest.resources.tokens.requests; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1DetokenizeRecordRequest; - -import java.util.*; +import com.skyflow.generated.rest.types.DetokenizeRecordRequest; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DetokenizePayload.Builder.class) -public final class V1DetokenizePayload { - private final Optional> detokenizationParameters; +@JsonDeserialize(builder = DetokenizePayload.Builder.class) +public final class DetokenizePayload { + private final List detokenizationParameters; private final Optional downloadUrl; @@ -21,8 +31,8 @@ public final class V1DetokenizePayload { private final Map additionalProperties; - private V1DetokenizePayload( - Optional> detokenizationParameters, + private DetokenizePayload( + List detokenizationParameters, Optional downloadUrl, Optional continueOnError, Map additionalProperties) { @@ -36,7 +46,7 @@ private V1DetokenizePayload( * @return Detokenization details. */ @JsonProperty("detokenizationParameters") - public Optional> getDetokenizationParameters() { + public List getDetokenizationParameters() { return detokenizationParameters; } @@ -56,10 +66,10 @@ public Optional getContinueOnError() { return continueOnError; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1DetokenizePayload && equalTo((V1DetokenizePayload) other); + return other instanceof DetokenizePayload && equalTo((DetokenizePayload) other); } @JsonAnyGetter @@ -67,18 +77,18 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1DetokenizePayload other) { + private boolean equalTo(DetokenizePayload other) { return detokenizationParameters.equals(other.detokenizationParameters) && downloadUrl.equals(other.downloadUrl) && continueOnError.equals(other.continueOnError); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.detokenizationParameters, this.downloadUrl, this.continueOnError); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -89,7 +99,7 @@ public static Builder builder() { @JsonIgnoreProperties(ignoreUnknown = true) public static final class Builder { - private Optional> detokenizationParameters = Optional.empty(); + private List detokenizationParameters = new ArrayList<>(); private Optional downloadUrl = Optional.empty(); @@ -100,7 +110,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1DetokenizePayload other) { + public Builder from(DetokenizePayload other) { detokenizationParameters(other.getDetokenizationParameters()); downloadUrl(other.getDownloadUrl()); continueOnError(other.getContinueOnError()); @@ -111,13 +121,23 @@ public Builder from(V1DetokenizePayload other) { *

                                  Detokenization details.

                                  */ @JsonSetter(value = "detokenizationParameters", nulls = Nulls.SKIP) - public Builder detokenizationParameters(Optional> detokenizationParameters) { - this.detokenizationParameters = detokenizationParameters; + public Builder detokenizationParameters(List detokenizationParameters) { + this.detokenizationParameters.clear(); + if (detokenizationParameters != null) { + this.detokenizationParameters.addAll(detokenizationParameters); + } return this; } - public Builder detokenizationParameters(List detokenizationParameters) { - this.detokenizationParameters = Optional.ofNullable(detokenizationParameters); + public Builder addDetokenizationParameters(DetokenizeRecordRequest detokenizationParameters) { + this.detokenizationParameters.add(detokenizationParameters); + return this; + } + + public Builder addAllDetokenizationParameters(List detokenizationParameters) { + if (detokenizationParameters != null) { + this.detokenizationParameters.addAll(detokenizationParameters); + } return this; } @@ -149,9 +169,18 @@ public Builder continueOnError(Boolean continueOnError) { return this; } - public V1DetokenizePayload build() { - return new V1DetokenizePayload( - detokenizationParameters, downloadUrl, continueOnError, additionalProperties); + public DetokenizePayload build() { + return new DetokenizePayload(detokenizationParameters, downloadUrl, continueOnError, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizeRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizeRequest.java new file mode 100644 index 00000000..3424acdc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizeRequest.java @@ -0,0 +1,238 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.TokenGroupRedactions; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetokenizeRequest.Builder.class) +public final class DetokenizeRequest { + private final String vaultId; + + private final List tokens; + + private final Optional> tokenGroupRedactions; + + private final Map additionalProperties; + + private DetokenizeRequest( + String vaultId, + List tokens, + Optional> tokenGroupRedactions, + Map additionalProperties) { + this.vaultId = vaultId; + this.tokens = tokens; + this.tokenGroupRedactions = tokenGroupRedactions; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Token to be detokenized + */ + @JsonProperty("tokens") + public List getTokens() { + return tokens; + } + + /** + * @return List of token groups to redact. + */ + @JsonProperty("tokenGroupRedactions") + public Optional> getTokenGroupRedactions() { + return tokenGroupRedactions; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetokenizeRequest && equalTo((DetokenizeRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetokenizeRequest other) { + return vaultId.equals(other.vaultId) + && tokens.equals(other.tokens) + && tokenGroupRedactions.equals(other.tokenGroupRedactions); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tokens, this.tokenGroupRedactions); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(DetokenizeRequest other); + } + + public interface _FinalStage { + DetokenizeRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Token to be detokenized

                                  + */ + _FinalStage tokens(List tokens); + + _FinalStage addTokens(String tokens); + + _FinalStage addAllTokens(List tokens); + + /** + *

                                  List of token groups to redact.

                                  + */ + _FinalStage tokenGroupRedactions(Optional> tokenGroupRedactions); + + _FinalStage tokenGroupRedactions(List tokenGroupRedactions); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private Optional> tokenGroupRedactions = Optional.empty(); + + private List tokens = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DetokenizeRequest other) { + vaultId(other.getVaultId()); + tokens(other.getTokens()); + tokenGroupRedactions(other.getTokenGroupRedactions()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  List of token groups to redact.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenGroupRedactions(List tokenGroupRedactions) { + this.tokenGroupRedactions = Optional.ofNullable(tokenGroupRedactions); + return this; + } + + /** + *

                                  List of token groups to redact.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenGroupRedactions", nulls = Nulls.SKIP) + public _FinalStage tokenGroupRedactions(Optional> tokenGroupRedactions) { + this.tokenGroupRedactions = tokenGroupRedactions; + return this; + } + + /** + *

                                  Token to be detokenized

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllTokens(List tokens) { + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + /** + *

                                  Token to be detokenized

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addTokens(String tokens) { + this.tokens.add(tokens); + return this; + } + + /** + *

                                  Token to be detokenized

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public _FinalStage tokens(List tokens) { + this.tokens.clear(); + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + @java.lang.Override + public DetokenizeRequest build() { + return new DetokenizeRequest(vaultId, tokens, tokenGroupRedactions, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/GetTokensFromValuesRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/GetTokensFromValuesRequest.java new file mode 100644 index 00000000..ffa9160b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/GetTokensFromValuesRequest.java @@ -0,0 +1,191 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.GetTokensFromValuesRequestObject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetTokensFromValuesRequest.Builder.class) +public final class GetTokensFromValuesRequest { + private final String vaultId; + + private final List records; + + private final Map additionalProperties; + + private GetTokensFromValuesRequest( + String vaultId, List records, Map additionalProperties) { + this.vaultId = vaultId; + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Array of value/token-group pairs to look up. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetTokensFromValuesRequest && equalTo((GetTokensFromValuesRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetTokensFromValuesRequest other) { + return vaultId.equals(other.vaultId) && records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(GetTokensFromValuesRequest other); + } + + public interface _FinalStage { + GetTokensFromValuesRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Array of value/token-group pairs to look up.

                                  + */ + _FinalStage records(List records); + + _FinalStage addRecords(GetTokensFromValuesRequestObject records); + + _FinalStage addAllRecords(List records); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetTokensFromValuesRequest other) { + vaultId(other.getVaultId()); + records(other.getRecords()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Array of value/token-group pairs to look up.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

                                  Array of value/token-group pairs to look up.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(GetTokensFromValuesRequestObject records) { + this.records.add(records); + return this; + } + + /** + *

                                  Array of value/token-group pairs to look up.

                                  + */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public GetTokensFromValuesRequest build() { + return new GetTokensFromValuesRequest(vaultId, records, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizePayload.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizePayload.java new file mode 100644 index 00000000..13466de6 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizePayload.java @@ -0,0 +1,124 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.TokenizeRecordRequest; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizePayload.Builder.class) +public final class TokenizePayload { + private final List tokenizationParameters; + + private final Map additionalProperties; + + private TokenizePayload( + List tokenizationParameters, Map additionalProperties) { + this.tokenizationParameters = tokenizationParameters; + this.additionalProperties = additionalProperties; + } + + /** + * @return Tokenization details. + */ + @JsonProperty("tokenizationParameters") + public List getTokenizationParameters() { + return tokenizationParameters; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizePayload && equalTo((TokenizePayload) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizePayload other) { + return tokenizationParameters.equals(other.tokenizationParameters); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tokenizationParameters); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List tokenizationParameters = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(TokenizePayload other) { + tokenizationParameters(other.getTokenizationParameters()); + return this; + } + + /** + *

                                  Tokenization details.

                                  + */ + @JsonSetter(value = "tokenizationParameters", nulls = Nulls.SKIP) + public Builder tokenizationParameters(List tokenizationParameters) { + this.tokenizationParameters.clear(); + if (tokenizationParameters != null) { + this.tokenizationParameters.addAll(tokenizationParameters); + } + return this; + } + + public Builder addTokenizationParameters(TokenizeRecordRequest tokenizationParameters) { + this.tokenizationParameters.add(tokenizationParameters); + return this; + } + + public Builder addAllTokenizationParameters(List tokenizationParameters) { + if (tokenizationParameters != null) { + this.tokenizationParameters.addAll(tokenizationParameters); + } + return this; + } + + public TokenizePayload build() { + return new TokenizePayload(tokenizationParameters, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizeRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizeRequest.java new file mode 100644 index 00000000..7aab1a72 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizeRequest.java @@ -0,0 +1,191 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.TokenizeRequestObject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeRequest.Builder.class) +public final class TokenizeRequest { + private final String vaultId; + + private final List data; + + private final Map additionalProperties; + + private TokenizeRequest( + String vaultId, List data, Map additionalProperties) { + this.vaultId = vaultId; + this.data = data; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Data to tokenize. + */ + @JsonProperty("data") + public List getData() { + return data; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeRequest && equalTo((TokenizeRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeRequest other) { + return vaultId.equals(other.vaultId) && data.equals(other.data); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.data); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(TokenizeRequest other); + } + + public interface _FinalStage { + TokenizeRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Data to tokenize.

                                  + */ + _FinalStage data(List data); + + _FinalStage addData(TokenizeRequestObject data); + + _FinalStage addAllData(List data); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List data = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(TokenizeRequest other) { + vaultId(other.getVaultId()); + data(other.getData()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Data to tokenize.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllData(List data) { + if (data != null) { + this.data.addAll(data); + } + return this; + } + + /** + *

                                  Data to tokenize.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addData(TokenizeRequestObject data) { + this.data.add(data); + return this; + } + + /** + *

                                  Data to tokenize.

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(List data) { + this.data.clear(); + if (data != null) { + this.data.addAll(data); + } + return this; + } + + @java.lang.Override + public TokenizeRequest build() { + return new TokenizeRequest(vaultId, data, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java deleted file mode 100644 index e5fc08f4..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.tokens.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1TokenizeRecordRequest; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1TokenizePayload.Builder.class) -public final class V1TokenizePayload { - private final Optional> tokenizationParameters; - - private final Map additionalProperties; - - private V1TokenizePayload( - Optional> tokenizationParameters, Map additionalProperties) { - this.tokenizationParameters = tokenizationParameters; - this.additionalProperties = additionalProperties; - } - - /** - * @return Tokenization details. - */ - @JsonProperty("tokenizationParameters") - public Optional> getTokenizationParameters() { - return tokenizationParameters; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1TokenizePayload && equalTo((V1TokenizePayload) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1TokenizePayload other) { - return tokenizationParameters.equals(other.tokenizationParameters); - } - - @Override - public int hashCode() { - return Objects.hash(this.tokenizationParameters); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> tokenizationParameters = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1TokenizePayload other) { - tokenizationParameters(other.getTokenizationParameters()); - return this; - } - - /** - *

                                  Tokenization details.

                                  - */ - @JsonSetter(value = "tokenizationParameters", nulls = Nulls.SKIP) - public Builder tokenizationParameters(Optional> tokenizationParameters) { - this.tokenizationParameters = tokenizationParameters; - return this; - } - - public Builder tokenizationParameters(List tokenizationParameters) { - this.tokenizationParameters = Optional.ofNullable(tokenizationParameters); - return this; - } - - public V1TokenizePayload build() { - return new V1TokenizePayload(tokenizationParameters, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java deleted file mode 100644 index d16caf10..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditEventAuditResourceType { - NONE_API("NONE_API"), - - ACCOUNT("ACCOUNT"), - - AUDIT("AUDIT"), - - BASE_DATA_TYPE("BASE_DATA_TYPE"), - - FIELD_TEMPLATE("FIELD_TEMPLATE"), - - FILE("FILE"), - - KEY("KEY"), - - POLICY("POLICY"), - - PROTO_PARSE("PROTO_PARSE"), - - RECORD("RECORD"), - - ROLE("ROLE"), - - RULE("RULE"), - - SECRET("SECRET"), - - SERVICE_ACCOUNT("SERVICE_ACCOUNT"), - - TOKEN("TOKEN"), - - USER("USER"), - - VAULT("VAULT"), - - VAULT_TEMPLATE("VAULT_TEMPLATE"), - - WORKSPACE("WORKSPACE"), - - TABLE("TABLE"), - - POLICY_TEMPLATE("POLICY_TEMPLATE"), - - MEMBER("MEMBER"), - - TAG("TAG"), - - CONNECTION("CONNECTION"), - - MIGRATION("MIGRATION"), - - SCHEDULED_JOB("SCHEDULED_JOB"), - - JOB("JOB"), - - COLUMN_NAME("COLUMN_NAME"), - - NETWORK_TOKEN("NETWORK_TOKEN"), - - SUBSCRIPTION("SUBSCRIPTION"); - - private final String value; - - AuditEventAuditResourceType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java deleted file mode 100644 index 73aed9c1..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java +++ /dev/null @@ -1,435 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AuditEventContext.Builder.class) -public final class AuditEventContext { - private final Optional changeId; - - private final Optional requestId; - - private final Optional traceId; - - private final Optional sessionId; - - private final Optional actor; - - private final Optional actorType; - - private final Optional accessType; - - private final Optional ipAddress; - - private final Optional origin; - - private final Optional authMode; - - private final Optional jwtId; - - private final Optional bearerTokenContextId; - - private final Map additionalProperties; - - private AuditEventContext( - Optional changeId, - Optional requestId, - Optional traceId, - Optional sessionId, - Optional actor, - Optional actorType, - Optional accessType, - Optional ipAddress, - Optional origin, - Optional authMode, - Optional jwtId, - Optional bearerTokenContextId, - Map additionalProperties) { - this.changeId = changeId; - this.requestId = requestId; - this.traceId = traceId; - this.sessionId = sessionId; - this.actor = actor; - this.actorType = actorType; - this.accessType = accessType; - this.ipAddress = ipAddress; - this.origin = origin; - this.authMode = authMode; - this.jwtId = jwtId; - this.bearerTokenContextId = bearerTokenContextId; - this.additionalProperties = additionalProperties; - } - - /** - * @return ID for the audit event. - */ - @JsonProperty("changeID") - public Optional getChangeId() { - return changeId; - } - - /** - * @return ID for the request that caused the event. - */ - @JsonProperty("requestID") - public Optional getRequestId() { - return requestId; - } - - /** - * @return ID for the request set by the service that received the request. - */ - @JsonProperty("traceID") - public Optional getTraceId() { - return traceId; - } - - /** - * @return ID for the session in which the request was sent. - */ - @JsonProperty("sessionID") - public Optional getSessionId() { - return sessionId; - } - - /** - * @return Member who sent the request. Depending on actorType, this may be a user ID or a service account ID. - */ - @JsonProperty("actor") - public Optional getActor() { - return actor; - } - - @JsonProperty("actorType") - public Optional getActorType() { - return actorType; - } - - @JsonProperty("accessType") - public Optional getAccessType() { - return accessType; - } - - /** - * @return IP Address of the client that made the request. - */ - @JsonProperty("ipAddress") - public Optional getIpAddress() { - return ipAddress; - } - - /** - * @return HTTP Origin request header (including scheme, hostname, and port) of the request. - */ - @JsonProperty("origin") - public Optional getOrigin() { - return origin; - } - - @JsonProperty("authMode") - public Optional getAuthMode() { - return authMode; - } - - /** - * @return ID of the JWT token. - */ - @JsonProperty("jwtID") - public Optional getJwtId() { - return jwtId; - } - - /** - * @return Embedded User Context. - */ - @JsonProperty("bearerTokenContextID") - public Optional getBearerTokenContextId() { - return bearerTokenContextId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof AuditEventContext && equalTo((AuditEventContext) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(AuditEventContext other) { - return changeId.equals(other.changeId) - && requestId.equals(other.requestId) - && traceId.equals(other.traceId) - && sessionId.equals(other.sessionId) - && actor.equals(other.actor) - && actorType.equals(other.actorType) - && accessType.equals(other.accessType) - && ipAddress.equals(other.ipAddress) - && origin.equals(other.origin) - && authMode.equals(other.authMode) - && jwtId.equals(other.jwtId) - && bearerTokenContextId.equals(other.bearerTokenContextId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.changeId, - this.requestId, - this.traceId, - this.sessionId, - this.actor, - this.actorType, - this.accessType, - this.ipAddress, - this.origin, - this.authMode, - this.jwtId, - this.bearerTokenContextId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional changeId = Optional.empty(); - - private Optional requestId = Optional.empty(); - - private Optional traceId = Optional.empty(); - - private Optional sessionId = Optional.empty(); - - private Optional actor = Optional.empty(); - - private Optional actorType = Optional.empty(); - - private Optional accessType = Optional.empty(); - - private Optional ipAddress = Optional.empty(); - - private Optional origin = Optional.empty(); - - private Optional authMode = Optional.empty(); - - private Optional jwtId = Optional.empty(); - - private Optional bearerTokenContextId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(AuditEventContext other) { - changeId(other.getChangeId()); - requestId(other.getRequestId()); - traceId(other.getTraceId()); - sessionId(other.getSessionId()); - actor(other.getActor()); - actorType(other.getActorType()); - accessType(other.getAccessType()); - ipAddress(other.getIpAddress()); - origin(other.getOrigin()); - authMode(other.getAuthMode()); - jwtId(other.getJwtId()); - bearerTokenContextId(other.getBearerTokenContextId()); - return this; - } - - /** - *

                                  ID for the audit event.

                                  - */ - @JsonSetter(value = "changeID", nulls = Nulls.SKIP) - public Builder changeId(Optional changeId) { - this.changeId = changeId; - return this; - } - - public Builder changeId(String changeId) { - this.changeId = Optional.ofNullable(changeId); - return this; - } - - /** - *

                                  ID for the request that caused the event.

                                  - */ - @JsonSetter(value = "requestID", nulls = Nulls.SKIP) - public Builder requestId(Optional requestId) { - this.requestId = requestId; - return this; - } - - public Builder requestId(String requestId) { - this.requestId = Optional.ofNullable(requestId); - return this; - } - - /** - *

                                  ID for the request set by the service that received the request.

                                  - */ - @JsonSetter(value = "traceID", nulls = Nulls.SKIP) - public Builder traceId(Optional traceId) { - this.traceId = traceId; - return this; - } - - public Builder traceId(String traceId) { - this.traceId = Optional.ofNullable(traceId); - return this; - } - - /** - *

                                  ID for the session in which the request was sent.

                                  - */ - @JsonSetter(value = "sessionID", nulls = Nulls.SKIP) - public Builder sessionId(Optional sessionId) { - this.sessionId = sessionId; - return this; - } - - public Builder sessionId(String sessionId) { - this.sessionId = Optional.ofNullable(sessionId); - return this; - } - - /** - *

                                  Member who sent the request. Depending on actorType, this may be a user ID or a service account ID.

                                  - */ - @JsonSetter(value = "actor", nulls = Nulls.SKIP) - public Builder actor(Optional actor) { - this.actor = actor; - return this; - } - - public Builder actor(String actor) { - this.actor = Optional.ofNullable(actor); - return this; - } - - @JsonSetter(value = "actorType", nulls = Nulls.SKIP) - public Builder actorType(Optional actorType) { - this.actorType = actorType; - return this; - } - - public Builder actorType(V1MemberType actorType) { - this.actorType = Optional.ofNullable(actorType); - return this; - } - - @JsonSetter(value = "accessType", nulls = Nulls.SKIP) - public Builder accessType(Optional accessType) { - this.accessType = accessType; - return this; - } - - public Builder accessType(ContextAccessType accessType) { - this.accessType = Optional.ofNullable(accessType); - return this; - } - - /** - *

                                  IP Address of the client that made the request.

                                  - */ - @JsonSetter(value = "ipAddress", nulls = Nulls.SKIP) - public Builder ipAddress(Optional ipAddress) { - this.ipAddress = ipAddress; - return this; - } - - public Builder ipAddress(String ipAddress) { - this.ipAddress = Optional.ofNullable(ipAddress); - return this; - } - - /** - *

                                  HTTP Origin request header (including scheme, hostname, and port) of the request.

                                  - */ - @JsonSetter(value = "origin", nulls = Nulls.SKIP) - public Builder origin(Optional origin) { - this.origin = origin; - return this; - } - - public Builder origin(String origin) { - this.origin = Optional.ofNullable(origin); - return this; - } - - @JsonSetter(value = "authMode", nulls = Nulls.SKIP) - public Builder authMode(Optional authMode) { - this.authMode = authMode; - return this; - } - - public Builder authMode(ContextAuthMode authMode) { - this.authMode = Optional.ofNullable(authMode); - return this; - } - - /** - *

                                  ID of the JWT token.

                                  - */ - @JsonSetter(value = "jwtID", nulls = Nulls.SKIP) - public Builder jwtId(Optional jwtId) { - this.jwtId = jwtId; - return this; - } - - public Builder jwtId(String jwtId) { - this.jwtId = Optional.ofNullable(jwtId); - return this; - } - - /** - *

                                  Embedded User Context.

                                  - */ - @JsonSetter(value = "bearerTokenContextID", nulls = Nulls.SKIP) - public Builder bearerTokenContextId(Optional bearerTokenContextId) { - this.bearerTokenContextId = bearerTokenContextId; - return this; - } - - public Builder bearerTokenContextId(String bearerTokenContextId) { - this.bearerTokenContextId = Optional.ofNullable(bearerTokenContextId); - return this; - } - - public AuditEventContext build() { - return new AuditEventContext( - changeId, - requestId, - traceId, - sessionId, - actor, - actorType, - accessType, - ipAddress, - origin, - authMode, - jwtId, - bearerTokenContextId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java deleted file mode 100644 index bab4b42a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AuditEventData.Builder.class) -public final class AuditEventData { - private final Optional content; - - private final Map additionalProperties; - - private AuditEventData(Optional content, Map additionalProperties) { - this.content = content; - this.additionalProperties = additionalProperties; - } - - /** - * @return The entire body of the data requested or the query fired. - */ - @JsonProperty("content") - public Optional getContent() { - return content; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof AuditEventData && equalTo((AuditEventData) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(AuditEventData other) { - return content.equals(other.content); - } - - @Override - public int hashCode() { - return Objects.hash(this.content); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional content = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(AuditEventData other) { - content(other.getContent()); - return this; - } - - /** - *

                                  The entire body of the data requested or the query fired.

                                  - */ - @JsonSetter(value = "content", nulls = Nulls.SKIP) - public Builder content(Optional content) { - this.content = content; - return this; - } - - public Builder content(String content) { - this.content = Optional.ofNullable(content); - return this; - } - - public AuditEventData build() { - return new AuditEventData(content, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java deleted file mode 100644 index 9d3bbaed..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AuditEventHttpInfo.Builder.class) -public final class AuditEventHttpInfo { - private final Optional uri; - - private final Optional method; - - private final Map additionalProperties; - - private AuditEventHttpInfo( - Optional uri, Optional method, Map additionalProperties) { - this.uri = uri; - this.method = method; - this.additionalProperties = additionalProperties; - } - - /** - * @return The http URI that is used. - */ - @JsonProperty("URI") - public Optional getUri() { - return uri; - } - - /** - * @return http method used. - */ - @JsonProperty("method") - public Optional getMethod() { - return method; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof AuditEventHttpInfo && equalTo((AuditEventHttpInfo) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(AuditEventHttpInfo other) { - return uri.equals(other.uri) && method.equals(other.method); - } - - @Override - public int hashCode() { - return Objects.hash(this.uri, this.method); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional uri = Optional.empty(); - - private Optional method = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(AuditEventHttpInfo other) { - uri(other.getUri()); - method(other.getMethod()); - return this; - } - - /** - *

                                  The http URI that is used.

                                  - */ - @JsonSetter(value = "URI", nulls = Nulls.SKIP) - public Builder uri(Optional uri) { - this.uri = uri; - return this; - } - - public Builder uri(String uri) { - this.uri = Optional.ofNullable(uri); - return this; - } - - /** - *

                                  http method used.

                                  - */ - @JsonSetter(value = "method", nulls = Nulls.SKIP) - public Builder method(Optional method) { - this.method = method; - return this; - } - - public Builder method(String method) { - this.method = Optional.ofNullable(method); - return this; - } - - public AuditEventHttpInfo build() { - return new AuditEventHttpInfo(uri, method, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchOperationResponse.java similarity index 61% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/BatchOperationResponse.java index 8f5fb775..4b33661a 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchOperationResponse.java @@ -3,22 +3,31 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BatchOperationResponse.Builder.class) -public final class V1BatchOperationResponse { +@JsonDeserialize(builder = BatchOperationResponse.Builder.class) +public final class BatchOperationResponse { private final Optional vaultId; private final Optional>> responses; private final Map additionalProperties; - private V1BatchOperationResponse( + private BatchOperationResponse( Optional vaultId, Optional>> responses, Map additionalProperties) { @@ -36,17 +45,17 @@ public Optional getVaultId() { } /** - * @return Responses in the same order as in the request. Responses have the same payload structure as their corresponding APIs: <br/><ul><li>POST returns an Insert Records response.</li><li>PUT returns an Update Record response.</li><li>GET returns a Get Record response.</li><li>DELETE returns a Delete Record response.</li></ul> + * @return Responses in the same order as in the request. Responses have the same payload structure as their corresponding APIs:
                                  • POST returns an Insert Records response.
                                  • PUT returns an Update Record response.
                                  • GET returns a Get Record response.
                                  • DELETE returns a Delete Record response.
                                  */ @JsonProperty("responses") public Optional>> getResponses() { return responses; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1BatchOperationResponse && equalTo((V1BatchOperationResponse) other); + return other instanceof BatchOperationResponse && equalTo((BatchOperationResponse) other); } @JsonAnyGetter @@ -54,16 +63,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1BatchOperationResponse other) { + private boolean equalTo(BatchOperationResponse other) { return vaultId.equals(other.vaultId) && responses.equals(other.responses); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.vaultId, this.responses); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -83,7 +92,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1BatchOperationResponse other) { + public Builder from(BatchOperationResponse other) { vaultId(other.getVaultId()); responses(other.getResponses()); return this; @@ -104,7 +113,7 @@ public Builder vaultId(String vaultId) { } /** - *

                                  Responses in the same order as in the request. Responses have the same payload structure as their corresponding APIs: <br/><ul><li>POST returns an Insert Records response.</li><li>PUT returns an Update Record response.</li><li>GET returns a Get Record response.</li><li>DELETE returns a Delete Record response.</li></ul>

                                  + *

                                  Responses in the same order as in the request. Responses have the same payload structure as their corresponding APIs:

                                  • POST returns an Insert Records response.
                                  • PUT returns an Update Record response.
                                  • GET returns a Get Record response.
                                  • DELETE returns a Delete Record response.

                                  */ @JsonSetter(value = "responses", nulls = Nulls.SKIP) public Builder responses(Optional>> responses) { @@ -117,8 +126,18 @@ public Builder responses(List> responses) { return this; } - public V1BatchOperationResponse build() { - return new V1BatchOperationResponse(vaultId, responses, additionalProperties); + public BatchOperationResponse build() { + return new BatchOperationResponse(vaultId, responses, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecord.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecord.java new file mode 100644 index 00000000..af90505e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecord.java @@ -0,0 +1,594 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = BatchRecord.Builder.class) +public final class BatchRecord { + private final Map fields; + + private final String tableName; + + private final BatchRecordMethod method; + + private final Optional batchId; + + private final Optional redaction; + + private final Optional tokenization; + + private final Optional id; + + private final Optional downloadUrl; + + private final Optional upsert; + + private final Optional> tokens; + + private final Optional returnFileMetadata; + + private final Map additionalProperties; + + private BatchRecord( + Map fields, + String tableName, + BatchRecordMethod method, + Optional batchId, + Optional redaction, + Optional tokenization, + Optional id, + Optional downloadUrl, + Optional upsert, + Optional> tokens, + Optional returnFileMetadata, + Map additionalProperties) { + this.fields = fields; + this.tableName = tableName; + this.method = method; + this.batchId = batchId; + this.redaction = redaction; + this.tokenization = tokenization; + this.id = id; + this.downloadUrl = downloadUrl; + this.upsert = upsert; + this.tokens = tokens; + this.returnFileMetadata = returnFileMetadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT. + */ + @JsonProperty("fields") + public Map getFields() { + return fields; + } + + /** + * @return Name of the table to perform the operation on. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Method of the operation. + */ + @JsonProperty("method") + public BatchRecordMethod getMethod() { + return method; + } + + /** + * @return ID to group operations by. Operations in the same group are executed sequentially. + */ + @JsonProperty("batchID") + public Optional getBatchId() { + return batchId; + } + + /** + * @return Redaction level to enforce for the returned record. Subject to policies assigned to the API caller. + */ + @JsonProperty("redaction") + public Optional getRedaction() { + return redaction; + } + + /** + * @return If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified. + */ + @JsonProperty("tokenization") + public Optional getTokenization() { + return tokenization; + } + + /** + * @return skyflow_id for the record. Only valid when method is GET, DELETE, or PUT. + */ + @JsonProperty("ID") + public Optional getId() { + return id; + } + + /** + * @return If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean. + */ + @JsonProperty("downloadURL") + public Optional getDownloadUrl() { + return downloadUrl; + } + + /** + * @return Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST. + */ + @JsonProperty("upsert") + public Optional getUpsert() { + return upsert; + } + + /** + * @return Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}. + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return If true, returns metadata for files. + */ + @JsonProperty("returnFileMetadata") + public Optional getReturnFileMetadata() { + return returnFileMetadata; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof BatchRecord && equalTo((BatchRecord) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(BatchRecord other) { + return fields.equals(other.fields) + && tableName.equals(other.tableName) + && method.equals(other.method) + && batchId.equals(other.batchId) + && redaction.equals(other.redaction) + && tokenization.equals(other.tokenization) + && id.equals(other.id) + && downloadUrl.equals(other.downloadUrl) + && upsert.equals(other.upsert) + && tokens.equals(other.tokens) + && returnFileMetadata.equals(other.returnFileMetadata); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash( + this.fields, + this.tableName, + this.method, + this.batchId, + this.redaction, + this.tokenization, + this.id, + this.downloadUrl, + this.upsert, + this.tokens, + this.returnFileMetadata); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table to perform the operation on.

                                  + */ + MethodStage tableName(@NotNull String tableName); + + Builder from(BatchRecord other); + } + + public interface MethodStage { + /** + *

                                  Method of the operation.

                                  + */ + _FinalStage method(@NotNull BatchRecordMethod method); + } + + public interface _FinalStage { + BatchRecord build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  + */ + _FinalStage fields(Map fields); + + _FinalStage putAllFields(Map fields); + + _FinalStage fields(String key, Object value); + + /** + *

                                  ID to group operations by. Operations in the same group are executed sequentially.

                                  + */ + _FinalStage batchId(Optional batchId); + + _FinalStage batchId(String batchId); + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + */ + _FinalStage redaction(Optional redaction); + + _FinalStage redaction(BatchRecordRedaction redaction); + + /** + *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  + */ + _FinalStage tokenization(Optional tokenization); + + _FinalStage tokenization(Boolean tokenization); + + /** + *

                                  skyflow_id for the record. Only valid when method is GET, DELETE, or PUT.

                                  + */ + _FinalStage id(Optional id); + + _FinalStage id(String id); + + /** + *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  + */ + _FinalStage downloadUrl(Optional downloadUrl); + + _FinalStage downloadUrl(Boolean downloadUrl); + + /** + *

                                  Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST.

                                  + */ + _FinalStage upsert(Optional upsert); + + _FinalStage upsert(String upsert); + + /** + *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  + */ + _FinalStage tokens(Optional> tokens); + + _FinalStage tokens(Map tokens); + + /** + *

                                  If true, returns metadata for files.

                                  + */ + _FinalStage returnFileMetadata(Optional returnFileMetadata); + + _FinalStage returnFileMetadata(Boolean returnFileMetadata); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, MethodStage, _FinalStage { + private String tableName; + + private BatchRecordMethod method; + + private Optional returnFileMetadata = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional upsert = Optional.empty(); + + private Optional downloadUrl = Optional.empty(); + + private Optional id = Optional.empty(); + + private Optional tokenization = Optional.empty(); + + private Optional redaction = Optional.empty(); + + private Optional batchId = Optional.empty(); + + private Map fields = new LinkedHashMap<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(BatchRecord other) { + fields(other.getFields()); + tableName(other.getTableName()); + method(other.getMethod()); + batchId(other.getBatchId()); + redaction(other.getRedaction()); + tokenization(other.getTokenization()); + id(other.getId()); + downloadUrl(other.getDownloadUrl()); + upsert(other.getUpsert()); + tokens(other.getTokens()); + returnFileMetadata(other.getReturnFileMetadata()); + return this; + } + + /** + *

                                  Name of the table to perform the operation on.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public MethodStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  Method of the operation.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("method") + public _FinalStage method(@NotNull BatchRecordMethod method) { + this.method = Objects.requireNonNull(method, "method must not be null"); + return this; + } + + /** + *

                                  If true, returns metadata for files.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage returnFileMetadata(Boolean returnFileMetadata) { + this.returnFileMetadata = Optional.ofNullable(returnFileMetadata); + return this; + } + + /** + *

                                  If true, returns metadata for files.

                                  + */ + @java.lang.Override + @JsonSetter(value = "returnFileMetadata", nulls = Nulls.SKIP) + public _FinalStage returnFileMetadata(Optional returnFileMetadata) { + this.returnFileMetadata = returnFileMetadata; + return this; + } + + /** + *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokens(Map tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public _FinalStage tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + /** + *

                                  Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage upsert(String upsert) { + this.upsert = Optional.ofNullable(upsert); + return this; + } + + /** + *

                                  Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST.

                                  + */ + @java.lang.Override + @JsonSetter(value = "upsert", nulls = Nulls.SKIP) + public _FinalStage upsert(Optional upsert) { + this.upsert = upsert; + return this; + } + + /** + *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage downloadUrl(Boolean downloadUrl) { + this.downloadUrl = Optional.ofNullable(downloadUrl); + return this; + } + + /** + *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  + */ + @java.lang.Override + @JsonSetter(value = "downloadURL", nulls = Nulls.SKIP) + public _FinalStage downloadUrl(Optional downloadUrl) { + this.downloadUrl = downloadUrl; + return this; + } + + /** + *

                                  skyflow_id for the record. Only valid when method is GET, DELETE, or PUT.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage id(String id) { + this.id = Optional.ofNullable(id); + return this; + } + + /** + *

                                  skyflow_id for the record. Only valid when method is GET, DELETE, or PUT.

                                  + */ + @java.lang.Override + @JsonSetter(value = "ID", nulls = Nulls.SKIP) + public _FinalStage id(Optional id) { + this.id = id; + return this; + } + + /** + *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenization(Boolean tokenization) { + this.tokenization = Optional.ofNullable(tokenization); + return this; + } + + /** + *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenization", nulls = Nulls.SKIP) + public _FinalStage tokenization(Optional tokenization) { + this.tokenization = tokenization; + return this; + } + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage redaction(BatchRecordRedaction redaction) { + this.redaction = Optional.ofNullable(redaction); + return this; + } + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + */ + @java.lang.Override + @JsonSetter(value = "redaction", nulls = Nulls.SKIP) + public _FinalStage redaction(Optional redaction) { + this.redaction = redaction; + return this; + } + + /** + *

                                  ID to group operations by. Operations in the same group are executed sequentially.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage batchId(String batchId) { + this.batchId = Optional.ofNullable(batchId); + return this; + } + + /** + *

                                  ID to group operations by. Operations in the same group are executed sequentially.

                                  + */ + @java.lang.Override + @JsonSetter(value = "batchID", nulls = Nulls.SKIP) + public _FinalStage batchId(Optional batchId) { + this.batchId = batchId; + return this; + } + + /** + *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage fields(String key, Object value) { + this.fields.put(key, value); + return this; + } + + /** + *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage putAllFields(Map fields) { + if (fields != null) { + this.fields.putAll(fields); + } + return this; + } + + /** + *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  + */ + @java.lang.Override + @JsonSetter(value = "fields", nulls = Nulls.SKIP) + public _FinalStage fields(Map fields) { + this.fields.clear(); + if (fields != null) { + this.fields.putAll(fields); + } + return this; + } + + @java.lang.Override + public BatchRecord build() { + return new BatchRecord( + fields, + tableName, + method, + batchId, + redaction, + tokenization, + id, + downloadUrl, + upsert, + tokens, + returnFileMetadata, + additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java index a6f5e673..85fc6185 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java @@ -3,28 +3,101 @@ */ package com.skyflow.generated.rest.types; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -public enum BatchRecordMethod { - NONE("NONE"), +public final class BatchRecordMethod { + public static final BatchRecordMethod GET = new BatchRecordMethod(Value.GET, "GET"); - POST("POST"), + public static final BatchRecordMethod PUT = new BatchRecordMethod(Value.PUT, "PUT"); - PUT("PUT"), + public static final BatchRecordMethod DELETE = new BatchRecordMethod(Value.DELETE, "DELETE"); - GET("GET"), + public static final BatchRecordMethod POST = new BatchRecordMethod(Value.POST, "POST"); - DELETE("DELETE"); + private final Value value; - private final String value; + private final String string; - BatchRecordMethod(String value) { + BatchRecordMethod(Value value, String string) { this.value = value; + this.string = string; } + public Value getEnumValue() { + return value; + } + + @java.lang.Override @JsonValue - @Override public String toString() { - return this.value; + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof BatchRecordMethod && this.string.equals(((BatchRecordMethod) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case GET: + return visitor.visitGet(); + case PUT: + return visitor.visitPut(); + case DELETE: + return visitor.visitDelete(); + case POST: + return visitor.visitPost(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static BatchRecordMethod valueOf(String value) { + switch (value) { + case "GET": + return GET; + case "PUT": + return PUT; + case "DELETE": + return DELETE; + case "POST": + return POST; + default: + return new BatchRecordMethod(Value.UNKNOWN, value); + } + } + + public enum Value { + POST, + + PUT, + + GET, + + DELETE, + + UNKNOWN + } + + public interface Visitor { + T visitPost(); + + T visitPut(); + + T visitGet(); + + T visitDelete(); + + T visitUnknown(String unknownType); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordRedaction.java new file mode 100644 index 00000000..07361521 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordRedaction.java @@ -0,0 +1,103 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class BatchRecordRedaction { + public static final BatchRecordRedaction DEFAULT = new BatchRecordRedaction(Value.DEFAULT, "DEFAULT"); + + public static final BatchRecordRedaction PLAIN_TEXT = new BatchRecordRedaction(Value.PLAIN_TEXT, "PLAIN_TEXT"); + + public static final BatchRecordRedaction MASKED = new BatchRecordRedaction(Value.MASKED, "MASKED"); + + public static final BatchRecordRedaction REDACTED = new BatchRecordRedaction(Value.REDACTED, "REDACTED"); + + private final Value value; + + private final String string; + + BatchRecordRedaction(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof BatchRecordRedaction && this.string.equals(((BatchRecordRedaction) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DEFAULT: + return visitor.visitDefault(); + case PLAIN_TEXT: + return visitor.visitPlainText(); + case MASKED: + return visitor.visitMasked(); + case REDACTED: + return visitor.visitRedacted(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static BatchRecordRedaction valueOf(String value) { + switch (value) { + case "DEFAULT": + return DEFAULT; + case "PLAIN_TEXT": + return PLAIN_TEXT; + case "MASKED": + return MASKED; + case "REDACTED": + return REDACTED; + default: + return new BatchRecordRedaction(Value.UNKNOWN, value); + } + } + + public enum Value { + DEFAULT, + + REDACTED, + + MASKED, + + PLAIN_TEXT, + + UNKNOWN + } + + public interface Visitor { + T visitDefault(); + + T visitRedacted(); + + T visitMasked(); + + T visitPlainText(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkDeleteRecordResponse.java similarity index 61% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/BulkDeleteRecordResponse.java index b7151598..b698f904 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkDeleteRecordResponse.java @@ -3,20 +3,29 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BulkDeleteRecordResponse.Builder.class) -public final class V1BulkDeleteRecordResponse { +@JsonDeserialize(builder = BulkDeleteRecordResponse.Builder.class) +public final class BulkDeleteRecordResponse { private final Optional> recordIdResponse; private final Map additionalProperties; - private V1BulkDeleteRecordResponse( + private BulkDeleteRecordResponse( Optional> recordIdResponse, Map additionalProperties) { this.recordIdResponse = recordIdResponse; this.additionalProperties = additionalProperties; @@ -30,10 +39,10 @@ public Optional> getRecordIdResponse() { return recordIdResponse; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1BulkDeleteRecordResponse && equalTo((V1BulkDeleteRecordResponse) other); + return other instanceof BulkDeleteRecordResponse && equalTo((BulkDeleteRecordResponse) other); } @JsonAnyGetter @@ -41,16 +50,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1BulkDeleteRecordResponse other) { + private boolean equalTo(BulkDeleteRecordResponse other) { return recordIdResponse.equals(other.recordIdResponse); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.recordIdResponse); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -68,7 +77,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1BulkDeleteRecordResponse other) { + public Builder from(BulkDeleteRecordResponse other) { recordIdResponse(other.getRecordIdResponse()); return this; } @@ -87,8 +96,18 @@ public Builder recordIdResponse(List recordIdResponse) { return this; } - public V1BulkDeleteRecordResponse build() { - return new V1BulkDeleteRecordResponse(recordIdResponse, additionalProperties); + public BulkDeleteRecordResponse build() { + return new BulkDeleteRecordResponse(recordIdResponse, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkGetRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkGetRecordResponse.java new file mode 100644 index 00000000..c753c19b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkGetRecordResponse.java @@ -0,0 +1,112 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = BulkGetRecordResponse.Builder.class) +public final class BulkGetRecordResponse { + private final Optional> records; + + private final Map additionalProperties; + + private BulkGetRecordResponse(Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return The specified records. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof BulkGetRecordResponse && equalTo((BulkGetRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(BulkGetRecordResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(BulkGetRecordResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  The specified records.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public BulkGetRecordResponse build() { + return new BulkGetRecordResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ColumnRedactions.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ColumnRedactions.java new file mode 100644 index 00000000..d445af16 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ColumnRedactions.java @@ -0,0 +1,160 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ColumnRedactions.Builder.class) +public final class ColumnRedactions { + private final String columnName; + + private final String redaction; + + private final Map additionalProperties; + + private ColumnRedactions(String columnName, String redaction, Map additionalProperties) { + this.columnName = columnName; + this.redaction = redaction; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the column to redact. + */ + @JsonProperty("columnName") + public String getColumnName() { + return columnName; + } + + /** + * @return Name of the redaction type. + */ + @JsonProperty("redaction") + public String getRedaction() { + return redaction; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ColumnRedactions && equalTo((ColumnRedactions) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ColumnRedactions other) { + return columnName.equals(other.columnName) && redaction.equals(other.redaction); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.columnName, this.redaction); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static ColumnNameStage builder() { + return new Builder(); + } + + public interface ColumnNameStage { + /** + *

                                  Name of the column to redact.

                                  + */ + RedactionStage columnName(@NotNull String columnName); + + Builder from(ColumnRedactions other); + } + + public interface RedactionStage { + /** + *

                                  Name of the redaction type.

                                  + */ + _FinalStage redaction(@NotNull String redaction); + } + + public interface _FinalStage { + ColumnRedactions build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements ColumnNameStage, RedactionStage, _FinalStage { + private String columnName; + + private String redaction; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ColumnRedactions other) { + columnName(other.getColumnName()); + redaction(other.getRedaction()); + return this; + } + + /** + *

                                  Name of the column to redact.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("columnName") + public RedactionStage columnName(@NotNull String columnName) { + this.columnName = Objects.requireNonNull(columnName, "columnName must not be null"); + return this; + } + + /** + *

                                  Name of the redaction type.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("redaction") + public _FinalStage redaction(@NotNull String redaction) { + this.redaction = Objects.requireNonNull(redaction, "redaction must not be null"); + return this; + } + + @java.lang.Override + public ColumnRedactions build() { + return new ColumnRedactions(columnName, redaction, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java deleted file mode 100644 index 163e862e..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ContextAccessType { - ACCESS_NONE("ACCESS_NONE"), - - API("API"), - - SQL("SQL"); - - private final String value; - - ContextAccessType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java deleted file mode 100644 index 204ad039..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ContextAuthMode { - AUTH_NONE("AUTH_NONE"), - - OKTA_JWT("OKTA_JWT"), - - SERVICE_ACCOUNT_JWT("SERVICE_ACCOUNT_JWT"), - - PAT_JWT("PAT_JWT"); - - private final String value; - - ContextAuthMode(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java deleted file mode 100644 index dc244be8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifiedFileOutput.Builder.class) -public final class DeidentifiedFileOutput { - private final Optional processedFile; - - private final Optional processedFileType; - - private final Optional processedFileExtension; - - private final Map additionalProperties; - - private DeidentifiedFileOutput( - Optional processedFile, - Optional processedFileType, - Optional processedFileExtension, - Map additionalProperties) { - this.processedFile = processedFile; - this.processedFileType = processedFileType; - this.processedFileExtension = processedFileExtension; - this.additionalProperties = additionalProperties; - } - - /** - * @return File content in Base64 format. - */ - @JsonProperty("processedFile") - public Optional getProcessedFile() { - return processedFile; - } - - /** - * @return Type of the processed file. - */ - @JsonProperty("processedFileType") - public Optional getProcessedFileType() { - return processedFileType; - } - - /** - * @return Extension of the processed file. - */ - @JsonProperty("processedFileExtension") - public Optional getProcessedFileExtension() { - return processedFileExtension; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifiedFileOutput && equalTo((DeidentifiedFileOutput) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifiedFileOutput other) { - return processedFile.equals(other.processedFile) - && processedFileType.equals(other.processedFileType) - && processedFileExtension.equals(other.processedFileExtension); - } - - @Override - public int hashCode() { - return Objects.hash(this.processedFile, this.processedFileType, this.processedFileExtension); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional processedFile = Optional.empty(); - - private Optional processedFileType = Optional.empty(); - - private Optional processedFileExtension = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(DeidentifiedFileOutput other) { - processedFile(other.getProcessedFile()); - processedFileType(other.getProcessedFileType()); - processedFileExtension(other.getProcessedFileExtension()); - return this; - } - - /** - *

                                  File content in Base64 format.

                                  - */ - @JsonSetter(value = "processedFile", nulls = Nulls.SKIP) - public Builder processedFile(Optional processedFile) { - this.processedFile = processedFile; - return this; - } - - public Builder processedFile(String processedFile) { - this.processedFile = Optional.ofNullable(processedFile); - return this; - } - - /** - *

                                  Type of the processed file.

                                  - */ - @JsonSetter(value = "processedFileType", nulls = Nulls.SKIP) - public Builder processedFileType(Optional processedFileType) { - this.processedFileType = processedFileType; - return this; - } - - public Builder processedFileType(DeidentifiedFileOutputProcessedFileType processedFileType) { - this.processedFileType = Optional.ofNullable(processedFileType); - return this; - } - - /** - *

                                  Extension of the processed file.

                                  - */ - @JsonSetter(value = "processedFileExtension", nulls = Nulls.SKIP) - public Builder processedFileExtension( - Optional processedFileExtension) { - this.processedFileExtension = processedFileExtension; - return this; - } - - public Builder processedFileExtension(DeidentifiedFileOutputProcessedFileExtension processedFileExtension) { - this.processedFileExtension = Optional.ofNullable(processedFileExtension); - return this; - } - - public DeidentifiedFileOutput build() { - return new DeidentifiedFileOutput( - processedFile, processedFileType, processedFileExtension, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java deleted file mode 100644 index febaeca3..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifiedFileOutputProcessedFileExtension { - MP_3("mp3"), - - WAV("wav"), - - PDF("pdf"), - - TXT("txt"), - - CSV("csv"), - - JSON("json"), - - JPG("jpg"), - - JPEG("jpeg"), - - TIF("tif"), - - TIFF("tiff"), - - PNG("png"), - - BMP("bmp"), - - XLS("xls"), - - XLSX("xlsx"), - - DOC("doc"), - - DOCX("docx"), - - PPT("ppt"), - - PPTX("pptx"), - - XML("xml"), - - DCM("dcm"); - - private final String value; - - DeidentifiedFileOutputProcessedFileExtension(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java deleted file mode 100644 index e020b28f..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifiedFileOutputProcessedFileType { - REDACTED_AUDIO("redacted_audio"), - - REDACTED_IMAGE("redacted_image"), - - REDACTED_TRANSCRIPTION("redacted_transcription"), - - REDACTED_FILE("redacted_file"), - - REDACTED_TEXT("redacted_text"), - - ENTITIES("entities"), - - REDACTED_TRANSCRIPTION_DIARIZE_JSON("redacted_transcription_diarize_json"); - - private final String value; - - DeidentifiedFileOutputProcessedFileType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java deleted file mode 100644 index d5a2ebd5..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileResponse.Builder.class) -public final class DeidentifyFileResponse { - private final Optional runId; - - private final Map additionalProperties; - - private DeidentifyFileResponse(Optional runId, Map additionalProperties) { - this.runId = runId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Status URL for the Detect run. - */ - @JsonProperty("run_id") - public Optional getRunId() { - return runId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileResponse && equalTo((DeidentifyFileResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileResponse other) { - return runId.equals(other.runId); - } - - @Override - public int hashCode() { - return Objects.hash(this.runId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional runId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(DeidentifyFileResponse other) { - runId(other.getRunId()); - return this; - } - - /** - *

                                  Status URL for the Detect run.

                                  - */ - @JsonSetter(value = "run_id", nulls = Nulls.SKIP) - public Builder runId(Optional runId) { - this.runId = runId; - return this; - } - - public Builder runId(String runId) { - this.runId = Optional.ofNullable(runId); - return this; - } - - public DeidentifyFileResponse build() { - return new DeidentifyFileResponse(runId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java deleted file mode 100644 index 1389fa0f..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java +++ /dev/null @@ -1,186 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyStringResponse.Builder.class) -public final class DeidentifyStringResponse { - private final Optional processedText; - - private final Optional> entities; - - private final Optional wordCount; - - private final Optional characterCount; - - private final Map additionalProperties; - - private DeidentifyStringResponse( - Optional processedText, - Optional> entities, - Optional wordCount, - Optional characterCount, - Map additionalProperties) { - this.processedText = processedText; - this.entities = entities; - this.wordCount = wordCount; - this.characterCount = characterCount; - this.additionalProperties = additionalProperties; - } - - /** - * @return De-identified text. - */ - @JsonProperty("processed_text") - public Optional getProcessedText() { - return processedText; - } - - /** - * @return Detected entities. - */ - @JsonProperty("entities") - public Optional> getEntities() { - return entities; - } - - /** - * @return Number of words from the input text. - */ - @JsonProperty("word_count") - public Optional getWordCount() { - return wordCount; - } - - /** - * @return Number of characters from the input text. - */ - @JsonProperty("character_count") - public Optional getCharacterCount() { - return characterCount; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyStringResponse && equalTo((DeidentifyStringResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyStringResponse other) { - return processedText.equals(other.processedText) - && entities.equals(other.entities) - && wordCount.equals(other.wordCount) - && characterCount.equals(other.characterCount); - } - - @Override - public int hashCode() { - return Objects.hash(this.processedText, this.entities, this.wordCount, this.characterCount); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional processedText = Optional.empty(); - - private Optional> entities = Optional.empty(); - - private Optional wordCount = Optional.empty(); - - private Optional characterCount = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(DeidentifyStringResponse other) { - processedText(other.getProcessedText()); - entities(other.getEntities()); - wordCount(other.getWordCount()); - characterCount(other.getCharacterCount()); - return this; - } - - /** - *

                                  De-identified text.

                                  - */ - @JsonSetter(value = "processed_text", nulls = Nulls.SKIP) - public Builder processedText(Optional processedText) { - this.processedText = processedText; - return this; - } - - public Builder processedText(String processedText) { - this.processedText = Optional.ofNullable(processedText); - return this; - } - - /** - *

                                  Detected entities.

                                  - */ - @JsonSetter(value = "entities", nulls = Nulls.SKIP) - public Builder entities(Optional> entities) { - this.entities = entities; - return this; - } - - public Builder entities(List entities) { - this.entities = Optional.ofNullable(entities); - return this; - } - - /** - *

                                  Number of words from the input text.

                                  - */ - @JsonSetter(value = "word_count", nulls = Nulls.SKIP) - public Builder wordCount(Optional wordCount) { - this.wordCount = wordCount; - return this; - } - - public Builder wordCount(Integer wordCount) { - this.wordCount = Optional.ofNullable(wordCount); - return this; - } - - /** - *

                                  Number of characters from the input text.

                                  - */ - @JsonSetter(value = "character_count", nulls = Nulls.SKIP) - public Builder characterCount(Optional characterCount) { - this.characterCount = characterCount; - return this; - } - - public Builder characterCount(Integer characterCount) { - this.characterCount = Optional.ofNullable(characterCount); - return this; - } - - public DeidentifyStringResponse build() { - return new DeidentifyStringResponse( - processedText, entities, wordCount, characterCount, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteRecordResponse.java similarity index 70% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteRecordResponse.java index 5351d897..7b7c731b 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteRecordResponse.java @@ -3,25 +3,30 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DeleteRecordResponse.Builder.class) -public final class V1DeleteRecordResponse { +@JsonDeserialize(builder = DeleteRecordResponse.Builder.class) +public final class DeleteRecordResponse { private final Optional skyflowId; private final Optional deleted; private final Map additionalProperties; - private V1DeleteRecordResponse( + private DeleteRecordResponse( Optional skyflowId, Optional deleted, Map additionalProperties) { this.skyflowId = skyflowId; this.deleted = deleted; @@ -44,10 +49,10 @@ public Optional getDeleted() { return deleted; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1DeleteRecordResponse && equalTo((V1DeleteRecordResponse) other); + return other instanceof DeleteRecordResponse && equalTo((DeleteRecordResponse) other); } @JsonAnyGetter @@ -55,16 +60,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1DeleteRecordResponse other) { + private boolean equalTo(DeleteRecordResponse other) { return skyflowId.equals(other.skyflowId) && deleted.equals(other.deleted); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowId, this.deleted); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -84,7 +89,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1DeleteRecordResponse other) { + public Builder from(DeleteRecordResponse other) { skyflowId(other.getSkyflowId()); deleted(other.getDeleted()); return this; @@ -118,8 +123,18 @@ public Builder deleted(Boolean deleted) { return this; } - public V1DeleteRecordResponse build() { - return new V1DeleteRecordResponse(skyflowId, deleted, additionalProperties); + public DeleteRecordResponse build() { + return new DeleteRecordResponse(skyflowId, deleted, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponse.java new file mode 100644 index 00000000..8b2845c5 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteResponse.Builder.class) +public final class DeleteResponse { + private final List records; + + private final Map additionalProperties; + + private DeleteResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of deleted records with skyflow ID and any partial errors. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteResponse && equalTo((DeleteResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of deleted records with skyflow ID and any partial errors.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(DeleteResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public DeleteResponse build() { + return new DeleteResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponseObject.java new file mode 100644 index 00000000..2b743afa --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponseObject.java @@ -0,0 +1,204 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteResponseObject.Builder.class) +public final class DeleteResponseObject { + private final String skyflowId; + + private final Optional error; + + private final int httpCode; + + private final Map additionalProperties; + + private DeleteResponseObject( + String skyflowId, Optional error, int httpCode, Map additionalProperties) { + this.skyflowId = skyflowId; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID of the deleted record. + */ + @JsonProperty("skyflowID") + public String getSkyflowId() { + return skyflowId; + } + + /** + * @return Error message, if any. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public int getHttpCode() { + return httpCode; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteResponseObject && equalTo((DeleteResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteResponseObject other) { + return skyflowId.equals(other.skyflowId) && error.equals(other.error) && httpCode == other.httpCode; + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.error, this.httpCode); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static SkyflowIdStage builder() { + return new Builder(); + } + + public interface SkyflowIdStage { + /** + *

                                  Skyflow ID of the deleted record.

                                  + */ + HttpCodeStage skyflowId(@NotNull String skyflowId); + + Builder from(DeleteResponseObject other); + } + + public interface HttpCodeStage { + /** + *

                                  HTTP status code of the response.

                                  + */ + _FinalStage httpCode(int httpCode); + } + + public interface _FinalStage { + DeleteResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Error message, if any.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements SkyflowIdStage, HttpCodeStage, _FinalStage { + private String skyflowId; + + private int httpCode; + + private Optional error = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DeleteResponseObject other) { + skyflowId(other.getSkyflowId()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Skyflow ID of the deleted record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("skyflowID") + public HttpCodeStage skyflowId(@NotNull String skyflowId) { + this.skyflowId = Objects.requireNonNull(skyflowId, "skyflowId must not be null"); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("httpCode") + public _FinalStage httpCode(int httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + @java.lang.Override + public DeleteResponseObject build() { + return new DeleteResponseObject(skyflowId, error, httpCode, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponse.java new file mode 100644 index 00000000..d651c5d9 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteTokenResponse.Builder.class) +public final class DeleteTokenResponse { + private final List tokens; + + private final Map additionalProperties; + + private DeleteTokenResponse(List tokens, Map additionalProperties) { + this.tokens = tokens; + this.additionalProperties = additionalProperties; + } + + /** + * @return Tokens data for Delete + */ + @JsonProperty("tokens") + public List getTokens() { + return tokens; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteTokenResponse && equalTo((DeleteTokenResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteTokenResponse other) { + return tokens.equals(other.tokens); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tokens); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List tokens = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteTokenResponse other) { + tokens(other.getTokens()); + return this; + } + + /** + *

                                  Tokens data for Delete

                                  + */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(List tokens) { + this.tokens.clear(); + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + public Builder addTokens(DeleteTokenResponseObject tokens) { + this.tokens.add(tokens); + return this; + } + + public Builder addAllTokens(List tokens) { + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + public DeleteTokenResponse build() { + return new DeleteTokenResponse(tokens, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponseObject.java new file mode 100644 index 00000000..cd3c1698 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponseObject.java @@ -0,0 +1,171 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteTokenResponseObject.Builder.class) +public final class DeleteTokenResponseObject { + private final Optional value; + + private final Optional error; + + private final Optional httpCode; + + private final Map additionalProperties; + + private DeleteTokenResponseObject( + Optional value, + Optional error, + Optional httpCode, + Map additionalProperties) { + this.value = value; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token to be deleted. + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Error message, if any. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteTokenResponseObject && equalTo((DeleteTokenResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteTokenResponseObject other) { + return value.equals(other.value) && error.equals(other.error) && httpCode.equals(other.httpCode); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.value, this.error, this.httpCode); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional value = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional httpCode = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteTokenResponseObject other) { + value(other.getValue()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Token to be deleted.

                                  + */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(String value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional error) { + this.error = error; + return this; + } + + public Builder error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + */ + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public Builder httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + public Builder httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + public DeleteTokenResponseObject build() { + return new DeleteTokenResponseObject(value, error, httpCode, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java deleted file mode 100644 index 9cb2d319..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java +++ /dev/null @@ -1,231 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DetectGuardrailsResponse.Builder.class) -public final class DetectGuardrailsResponse { - private final String text; - - private final Optional toxic; - - private final Optional deniedTopic; - - private final DetectGuardrailsResponseValidation validation; - - private final Map additionalProperties; - - private DetectGuardrailsResponse( - String text, - Optional toxic, - Optional deniedTopic, - DetectGuardrailsResponseValidation validation, - Map additionalProperties) { - this.text = text; - this.toxic = toxic; - this.deniedTopic = deniedTopic; - this.validation = validation; - this.additionalProperties = additionalProperties; - } - - /** - * @return Text that was checked against guardrails. - */ - @JsonProperty("text") - public String getText() { - return text; - } - - /** - * @return Whether the text is toxic. - */ - @JsonProperty("toxic") - public Optional getToxic() { - return toxic; - } - - /** - * @return Whether the text included a denied topic. - */ - @JsonProperty("denied_topic") - public Optional getDeniedTopic() { - return deniedTopic; - } - - /** - * @return Whether the text passed validation. - */ - @JsonProperty("validation") - public DetectGuardrailsResponseValidation getValidation() { - return validation; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DetectGuardrailsResponse && equalTo((DetectGuardrailsResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DetectGuardrailsResponse other) { - return text.equals(other.text) - && toxic.equals(other.toxic) - && deniedTopic.equals(other.deniedTopic) - && validation.equals(other.validation); - } - - @Override - public int hashCode() { - return Objects.hash(this.text, this.toxic, this.deniedTopic, this.validation); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static TextStage builder() { - return new Builder(); - } - - public interface TextStage { - /** - * Text that was checked against guardrails. - */ - ValidationStage text(@NotNull String text); - - Builder from(DetectGuardrailsResponse other); - } - - public interface ValidationStage { - /** - * Whether the text passed validation. - */ - _FinalStage validation(@NotNull DetectGuardrailsResponseValidation validation); - } - - public interface _FinalStage { - DetectGuardrailsResponse build(); - - /** - *

                                  Whether the text is toxic.

                                  - */ - _FinalStage toxic(Optional toxic); - - _FinalStage toxic(Boolean toxic); - - /** - *

                                  Whether the text included a denied topic.

                                  - */ - _FinalStage deniedTopic(Optional deniedTopic); - - _FinalStage deniedTopic(Boolean deniedTopic); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TextStage, ValidationStage, _FinalStage { - private String text; - - private DetectGuardrailsResponseValidation validation; - - private Optional deniedTopic = Optional.empty(); - - private Optional toxic = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DetectGuardrailsResponse other) { - text(other.getText()); - toxic(other.getToxic()); - deniedTopic(other.getDeniedTopic()); - validation(other.getValidation()); - return this; - } - - /** - * Text that was checked against guardrails.

                                  Text that was checked against guardrails.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("text") - public ValidationStage text(@NotNull String text) { - this.text = Objects.requireNonNull(text, "text must not be null"); - return this; - } - - /** - * Whether the text passed validation.

                                  Whether the text passed validation.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("validation") - public _FinalStage validation(@NotNull DetectGuardrailsResponseValidation validation) { - this.validation = Objects.requireNonNull(validation, "validation must not be null"); - return this; - } - - /** - *

                                  Whether the text included a denied topic.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage deniedTopic(Boolean deniedTopic) { - this.deniedTopic = Optional.ofNullable(deniedTopic); - return this; - } - - /** - *

                                  Whether the text included a denied topic.

                                  - */ - @Override - @JsonSetter(value = "denied_topic", nulls = Nulls.SKIP) - public _FinalStage deniedTopic(Optional deniedTopic) { - this.deniedTopic = deniedTopic; - return this; - } - - /** - *

                                  Whether the text is toxic.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage toxic(Boolean toxic) { - this.toxic = Optional.ofNullable(toxic); - return this; - } - - /** - *

                                  Whether the text is toxic.

                                  - */ - @Override - @JsonSetter(value = "toxic", nulls = Nulls.SKIP) - public _FinalStage toxic(Optional toxic) { - this.toxic = toxic; - return this; - } - - @Override - public DetectGuardrailsResponse build() { - return new DetectGuardrailsResponse(text, toxic, deniedTopic, validation, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java deleted file mode 100644 index e8bf032e..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DetectGuardrailsResponseValidation { - FAILED("failed"), - - PASSED("passed"); - - private final String value; - - DetectGuardrailsResponseValidation(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java deleted file mode 100644 index b73f7845..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java +++ /dev/null @@ -1,348 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DetectRunsResponse.Builder.class) -public final class DetectRunsResponse { - private final Optional status; - - private final Optional outputType; - - private final Optional> output; - - private final Optional message; - - private final Optional size; - - private final Optional wordCharacterCount; - - private final Optional duration; - - private final Optional pages; - - private final Optional slides; - - private final Map additionalProperties; - - private DetectRunsResponse( - Optional status, - Optional outputType, - Optional> output, - Optional message, - Optional size, - Optional wordCharacterCount, - Optional duration, - Optional pages, - Optional slides, - Map additionalProperties) { - this.status = status; - this.outputType = outputType; - this.output = output; - this.message = message; - this.size = size; - this.wordCharacterCount = wordCharacterCount; - this.duration = duration; - this.pages = pages; - this.slides = slides; - this.additionalProperties = additionalProperties; - } - - /** - * @return Status of the operation. - */ - @JsonProperty("status") - public Optional getStatus() { - return status; - } - - /** - * @return Format of the output file. - */ - @JsonProperty("outputType") - public Optional getOutputType() { - return outputType; - } - - /** - * @return Details of output files. Files are specified as Base64-encoded data. - */ - @JsonProperty("output") - public Optional> getOutput() { - return output; - } - - /** - * @return Status details about the Detect run. - */ - @JsonProperty("message") - public Optional getMessage() { - return message; - } - - /** - * @return Size of the processed file in kilobytes (KB). - */ - @JsonProperty("size") - public Optional getSize() { - return size; - } - - @JsonProperty("wordCharacterCount") - public Optional getWordCharacterCount() { - return wordCharacterCount; - } - - /** - * @return Duration of the processed audio in seconds. - */ - @JsonProperty("duration") - public Optional getDuration() { - return duration; - } - - /** - * @return Number of pages in the processed PDF. - */ - @JsonProperty("pages") - public Optional getPages() { - return pages; - } - - /** - * @return Number of slides in the processed presentation. - */ - @JsonProperty("slides") - public Optional getSlides() { - return slides; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DetectRunsResponse && equalTo((DetectRunsResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DetectRunsResponse other) { - return status.equals(other.status) - && outputType.equals(other.outputType) - && output.equals(other.output) - && message.equals(other.message) - && size.equals(other.size) - && wordCharacterCount.equals(other.wordCharacterCount) - && duration.equals(other.duration) - && pages.equals(other.pages) - && slides.equals(other.slides); - } - - @Override - public int hashCode() { - return Objects.hash( - this.status, - this.outputType, - this.output, - this.message, - this.size, - this.wordCharacterCount, - this.duration, - this.pages, - this.slides); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional status = Optional.empty(); - - private Optional outputType = Optional.empty(); - - private Optional> output = Optional.empty(); - - private Optional message = Optional.empty(); - - private Optional size = Optional.empty(); - - private Optional wordCharacterCount = Optional.empty(); - - private Optional duration = Optional.empty(); - - private Optional pages = Optional.empty(); - - private Optional slides = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(DetectRunsResponse other) { - status(other.getStatus()); - outputType(other.getOutputType()); - output(other.getOutput()); - message(other.getMessage()); - size(other.getSize()); - wordCharacterCount(other.getWordCharacterCount()); - duration(other.getDuration()); - pages(other.getPages()); - slides(other.getSlides()); - return this; - } - - /** - *

                                  Status of the operation.

                                  - */ - @JsonSetter(value = "status", nulls = Nulls.SKIP) - public Builder status(Optional status) { - this.status = status; - return this; - } - - public Builder status(DetectRunsResponseStatus status) { - this.status = Optional.ofNullable(status); - return this; - } - - /** - *

                                  Format of the output file.

                                  - */ - @JsonSetter(value = "outputType", nulls = Nulls.SKIP) - public Builder outputType(Optional outputType) { - this.outputType = outputType; - return this; - } - - public Builder outputType(DetectRunsResponseOutputType outputType) { - this.outputType = Optional.ofNullable(outputType); - return this; - } - - /** - *

                                  Details of output files. Files are specified as Base64-encoded data.

                                  - */ - @JsonSetter(value = "output", nulls = Nulls.SKIP) - public Builder output(Optional> output) { - this.output = output; - return this; - } - - public Builder output(List output) { - this.output = Optional.ofNullable(output); - return this; - } - - /** - *

                                  Status details about the Detect run.

                                  - */ - @JsonSetter(value = "message", nulls = Nulls.SKIP) - public Builder message(Optional message) { - this.message = message; - return this; - } - - public Builder message(String message) { - this.message = Optional.ofNullable(message); - return this; - } - - /** - *

                                  Size of the processed file in kilobytes (KB).

                                  - */ - @JsonSetter(value = "size", nulls = Nulls.SKIP) - public Builder size(Optional size) { - this.size = size; - return this; - } - - public Builder size(Float size) { - this.size = Optional.ofNullable(size); - return this; - } - - @JsonSetter(value = "wordCharacterCount", nulls = Nulls.SKIP) - public Builder wordCharacterCount(Optional wordCharacterCount) { - this.wordCharacterCount = wordCharacterCount; - return this; - } - - public Builder wordCharacterCount(WordCharacterCount wordCharacterCount) { - this.wordCharacterCount = Optional.ofNullable(wordCharacterCount); - return this; - } - - /** - *

                                  Duration of the processed audio in seconds.

                                  - */ - @JsonSetter(value = "duration", nulls = Nulls.SKIP) - public Builder duration(Optional duration) { - this.duration = duration; - return this; - } - - public Builder duration(Float duration) { - this.duration = Optional.ofNullable(duration); - return this; - } - - /** - *

                                  Number of pages in the processed PDF.

                                  - */ - @JsonSetter(value = "pages", nulls = Nulls.SKIP) - public Builder pages(Optional pages) { - this.pages = pages; - return this; - } - - public Builder pages(Integer pages) { - this.pages = Optional.ofNullable(pages); - return this; - } - - /** - *

                                  Number of slides in the processed presentation.

                                  - */ - @JsonSetter(value = "slides", nulls = Nulls.SKIP) - public Builder slides(Optional slides) { - this.slides = slides; - return this; - } - - public Builder slides(Integer slides) { - this.slides = Optional.ofNullable(slides); - return this; - } - - public DetectRunsResponse build() { - return new DetectRunsResponse( - status, - outputType, - output, - message, - size, - wordCharacterCount, - duration, - pages, - slides, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java deleted file mode 100644 index 171dd153..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DetectRunsResponseOutputType { - UNKNOWN("UNKNOWN"), - - BASE_64("BASE64"); - - private final String value; - - DetectRunsResponseOutputType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java deleted file mode 100644 index e5fa80d4..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DetectRunsResponseStatus { - UNKNOWN("UNKNOWN"), - - FAILED("FAILED"), - - SUCCESS("SUCCESS"), - - IN_PROGRESS("IN_PROGRESS"); - - private final String value; - - DetectRunsResponseStatus(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequest.java new file mode 100644 index 00000000..2328e6fc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequest.java @@ -0,0 +1,174 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetokenizeRecordRequest.Builder.class) +public final class DetokenizeRecordRequest { + private final String token; + + private final Optional redaction; + + private final Map additionalProperties; + + private DetokenizeRecordRequest( + String token, + Optional redaction, + Map additionalProperties) { + this.token = token; + this.redaction = redaction; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token that identifies the record to detokenize. + */ + @JsonProperty("token") + public String getToken() { + return token; + } + + /** + * @return Redaction level to enforce for the returned record. Subject to policies assigned to the API caller. + */ + @JsonProperty("redaction") + public Optional getRedaction() { + return redaction; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetokenizeRecordRequest && equalTo((DetokenizeRecordRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetokenizeRecordRequest other) { + return token.equals(other.token) && redaction.equals(other.redaction); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.token, this.redaction); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TokenStage builder() { + return new Builder(); + } + + public interface TokenStage { + /** + *

                                  Token that identifies the record to detokenize.

                                  + */ + _FinalStage token(@NotNull String token); + + Builder from(DetokenizeRecordRequest other); + } + + public interface _FinalStage { + DetokenizeRecordRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + */ + _FinalStage redaction(Optional redaction); + + _FinalStage redaction(DetokenizeRecordRequestRedaction redaction); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TokenStage, _FinalStage { + private String token; + + private Optional redaction = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DetokenizeRecordRequest other) { + token(other.getToken()); + redaction(other.getRedaction()); + return this; + } + + /** + *

                                  Token that identifies the record to detokenize.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("token") + public _FinalStage token(@NotNull String token) { + this.token = Objects.requireNonNull(token, "token must not be null"); + return this; + } + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage redaction(DetokenizeRecordRequestRedaction redaction) { + this.redaction = Optional.ofNullable(redaction); + return this; + } + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + */ + @java.lang.Override + @JsonSetter(value = "redaction", nulls = Nulls.SKIP) + public _FinalStage redaction(Optional redaction) { + this.redaction = redaction; + return this; + } + + @java.lang.Override + public DetokenizeRecordRequest build() { + return new DetokenizeRecordRequest(token, redaction, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequestRedaction.java new file mode 100644 index 00000000..0578f30a --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequestRedaction.java @@ -0,0 +1,108 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetokenizeRecordRequestRedaction { + public static final DetokenizeRecordRequestRedaction DEFAULT = + new DetokenizeRecordRequestRedaction(Value.DEFAULT, "DEFAULT"); + + public static final DetokenizeRecordRequestRedaction PLAIN_TEXT = + new DetokenizeRecordRequestRedaction(Value.PLAIN_TEXT, "PLAIN_TEXT"); + + public static final DetokenizeRecordRequestRedaction MASKED = + new DetokenizeRecordRequestRedaction(Value.MASKED, "MASKED"); + + public static final DetokenizeRecordRequestRedaction REDACTED = + new DetokenizeRecordRequestRedaction(Value.REDACTED, "REDACTED"); + + private final Value value; + + private final String string; + + DetokenizeRecordRequestRedaction(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof DetokenizeRecordRequestRedaction + && this.string.equals(((DetokenizeRecordRequestRedaction) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DEFAULT: + return visitor.visitDefault(); + case PLAIN_TEXT: + return visitor.visitPlainText(); + case MASKED: + return visitor.visitMasked(); + case REDACTED: + return visitor.visitRedacted(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetokenizeRecordRequestRedaction valueOf(String value) { + switch (value) { + case "DEFAULT": + return DEFAULT; + case "PLAIN_TEXT": + return PLAIN_TEXT; + case "MASKED": + return MASKED; + case "REDACTED": + return REDACTED; + default: + return new DetokenizeRecordRequestRedaction(Value.UNKNOWN, value); + } + } + + public enum Value { + DEFAULT, + + REDACTED, + + MASKED, + + PLAIN_TEXT, + + UNKNOWN + } + + public interface Visitor { + T visitDefault(); + + T visitRedacted(); + + T visitMasked(); + + T visitPlainText(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponse.java similarity index 75% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponse.java index dd3a9c1f..2aeecd0e 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponse.java @@ -3,18 +3,23 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DetokenizeRecordResponse.Builder.class) -public final class V1DetokenizeRecordResponse { +@JsonDeserialize(builder = DetokenizeRecordResponse.Builder.class) +public final class DetokenizeRecordResponse { private final Optional token; private final Optional valueType; @@ -25,7 +30,7 @@ public final class V1DetokenizeRecordResponse { private final Map additionalProperties; - private V1DetokenizeRecordResponse( + private DetokenizeRecordResponse( Optional token, Optional valueType, Optional value, @@ -46,6 +51,9 @@ public Optional getToken() { return token; } + /** + * @return Data type of the value. + */ @JsonProperty("valueType") public Optional getValueType() { return valueType; @@ -67,10 +75,10 @@ public Optional getError() { return error; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1DetokenizeRecordResponse && equalTo((V1DetokenizeRecordResponse) other); + return other instanceof DetokenizeRecordResponse && equalTo((DetokenizeRecordResponse) other); } @JsonAnyGetter @@ -78,19 +86,19 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1DetokenizeRecordResponse other) { + private boolean equalTo(DetokenizeRecordResponse other) { return token.equals(other.token) && valueType.equals(other.valueType) && value.equals(other.value) && error.equals(other.error); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.token, this.valueType, this.value, this.error); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -114,7 +122,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1DetokenizeRecordResponse other) { + public Builder from(DetokenizeRecordResponse other) { token(other.getToken()); valueType(other.getValueType()); value(other.getValue()); @@ -136,6 +144,9 @@ public Builder token(String token) { return this; } + /** + *

                                  Data type of the value.

                                  + */ @JsonSetter(value = "valueType", nulls = Nulls.SKIP) public Builder valueType(Optional valueType) { this.valueType = valueType; @@ -175,8 +186,18 @@ public Builder error(String error) { return this; } - public V1DetokenizeRecordResponse build() { - return new V1DetokenizeRecordResponse(token, valueType, value, error, additionalProperties); + public DetokenizeRecordResponse build() { + return new DetokenizeRecordResponse(token, valueType, value, error, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java index e9f4be2a..990dac21 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java @@ -3,36 +3,161 @@ */ package com.skyflow.generated.rest.types; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -public enum DetokenizeRecordResponseValueType { - NONE("NONE"), +public final class DetokenizeRecordResponseValueType { + public static final DetokenizeRecordResponseValueType FLOAT = + new DetokenizeRecordResponseValueType(Value.FLOAT, "FLOAT"); - STRING("STRING"), + public static final DetokenizeRecordResponseValueType ARRAY = + new DetokenizeRecordResponseValueType(Value.ARRAY, "ARRAY"); - INTEGER("INTEGER"), + public static final DetokenizeRecordResponseValueType TIME = + new DetokenizeRecordResponseValueType(Value.TIME, "TIME"); - FLOAT("FLOAT"), + public static final DetokenizeRecordResponseValueType DATE = + new DetokenizeRecordResponseValueType(Value.DATE, "DATE"); - BOOL("BOOL"), + public static final DetokenizeRecordResponseValueType INTEGER = + new DetokenizeRecordResponseValueType(Value.INTEGER, "INTEGER"); - DATETIME("DATETIME"), + public static final DetokenizeRecordResponseValueType JSON = + new DetokenizeRecordResponseValueType(Value.JSON, "JSON"); - JSON("JSON"), + public static final DetokenizeRecordResponseValueType BOOL = + new DetokenizeRecordResponseValueType(Value.BOOL, "BOOL"); - ARRAY("ARRAY"), + public static final DetokenizeRecordResponseValueType DATETIME = + new DetokenizeRecordResponseValueType(Value.DATETIME, "DATETIME"); - DATE("DATE"); + public static final DetokenizeRecordResponseValueType STRING = + new DetokenizeRecordResponseValueType(Value.STRING, "STRING"); - private final String value; + private final Value value; - DetokenizeRecordResponseValueType(String value) { + private final String string; + + DetokenizeRecordResponseValueType(Value value, String string) { this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; } + @java.lang.Override @JsonValue - @Override public String toString() { - return this.value; + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof DetokenizeRecordResponseValueType + && this.string.equals(((DetokenizeRecordResponseValueType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case FLOAT: + return visitor.visitFloat(); + case ARRAY: + return visitor.visitArray(); + case TIME: + return visitor.visitTime(); + case DATE: + return visitor.visitDate(); + case INTEGER: + return visitor.visitInteger(); + case JSON: + return visitor.visitJson(); + case BOOL: + return visitor.visitBool(); + case DATETIME: + return visitor.visitDatetime(); + case STRING: + return visitor.visitString(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetokenizeRecordResponseValueType valueOf(String value) { + switch (value) { + case "FLOAT": + return FLOAT; + case "ARRAY": + return ARRAY; + case "TIME": + return TIME; + case "DATE": + return DATE; + case "INTEGER": + return INTEGER; + case "JSON": + return JSON; + case "BOOL": + return BOOL; + case "DATETIME": + return DATETIME; + case "STRING": + return STRING; + default: + return new DetokenizeRecordResponseValueType(Value.UNKNOWN, value); + } + } + + public enum Value { + STRING, + + INTEGER, + + FLOAT, + + BOOL, + + DATETIME, + + JSON, + + ARRAY, + + DATE, + + TIME, + + UNKNOWN + } + + public interface Visitor { + T visitString(); + + T visitInteger(); + + T visitFloat(); + + T visitBool(); + + T visitDatetime(); + + T visitJson(); + + T visitArray(); + + T visitDate(); + + T visitTime(); + + T visitUnknown(String unknownType); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponse.java new file mode 100644 index 00000000..c16f5cb3 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponse.java @@ -0,0 +1,113 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetokenizeResponse.Builder.class) +public final class DetokenizeResponse { + private final Optional> records; + + private final Map additionalProperties; + + private DetokenizeResponse( + Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Records corresponding to the specified tokens. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetokenizeResponse && equalTo((DetokenizeResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetokenizeResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DetokenizeResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Records corresponding to the specified tokens.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public DetokenizeResponse build() { + return new DetokenizeResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponseObject.java new file mode 100644 index 00000000..1848b425 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponseObject.java @@ -0,0 +1,335 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetokenizeResponseObject.Builder.class) +public final class DetokenizeResponseObject { + private final String token; + + private final Optional value; + + private final Optional tokenGroupName; + + private final Optional error; + + private final Optional httpCode; + + private final Optional> metadata; + + private final Map additionalProperties; + + private DetokenizeResponseObject( + String token, + Optional value, + Optional tokenGroupName, + Optional error, + Optional httpCode, + Optional> metadata, + Map additionalProperties) { + this.token = token; + this.value = value; + this.tokenGroupName = tokenGroupName; + this.error = error; + this.httpCode = httpCode; + this.metadata = metadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token that was detokenized. + */ + @JsonProperty("token") + public String getToken() { + return token; + } + + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Name of the token group. + */ + @JsonProperty("tokenGroupName") + public Optional getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Error message, if any. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + /** + * @return Additional metadata associated with the token, such as tableName or skyflowID. + */ + @JsonProperty("metadata") + public Optional> getMetadata() { + return metadata; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetokenizeResponseObject && equalTo((DetokenizeResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetokenizeResponseObject other) { + return token.equals(other.token) + && value.equals(other.value) + && tokenGroupName.equals(other.tokenGroupName) + && error.equals(other.error) + && httpCode.equals(other.httpCode) + && metadata.equals(other.metadata); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.token, this.value, this.tokenGroupName, this.error, this.httpCode, this.metadata); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TokenStage builder() { + return new Builder(); + } + + public interface TokenStage { + /** + *

                                  Token that was detokenized.

                                  + */ + _FinalStage token(@NotNull String token); + + Builder from(DetokenizeResponseObject other); + } + + public interface _FinalStage { + DetokenizeResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + _FinalStage value(Optional value); + + _FinalStage value(GoogleProtobufValue value); + + /** + *

                                  Name of the token group.

                                  + */ + _FinalStage tokenGroupName(Optional tokenGroupName); + + _FinalStage tokenGroupName(String tokenGroupName); + + /** + *

                                  Error message, if any.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + + /** + *

                                  HTTP status code of the response.

                                  + */ + _FinalStage httpCode(Optional httpCode); + + _FinalStage httpCode(Integer httpCode); + + /** + *

                                  Additional metadata associated with the token, such as tableName or skyflowID.

                                  + */ + _FinalStage metadata(Optional> metadata); + + _FinalStage metadata(Map metadata); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TokenStage, _FinalStage { + private String token; + + private Optional> metadata = Optional.empty(); + + private Optional httpCode = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional tokenGroupName = Optional.empty(); + + private Optional value = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DetokenizeResponseObject other) { + token(other.getToken()); + value(other.getValue()); + tokenGroupName(other.getTokenGroupName()); + error(other.getError()); + httpCode(other.getHttpCode()); + metadata(other.getMetadata()); + return this; + } + + /** + *

                                  Token that was detokenized.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("token") + public _FinalStage token(@NotNull String token) { + this.token = Objects.requireNonNull(token, "token must not be null"); + return this; + } + + /** + *

                                  Additional metadata associated with the token, such as tableName or skyflowID.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage metadata(Map metadata) { + this.metadata = Optional.ofNullable(metadata); + return this; + } + + /** + *

                                  Additional metadata associated with the token, such as tableName or skyflowID.

                                  + */ + @java.lang.Override + @JsonSetter(value = "metadata", nulls = Nulls.SKIP) + public _FinalStage metadata(Optional> metadata) { + this.metadata = metadata; + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + */ + @java.lang.Override + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public _FinalStage httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Name of the token group.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

                                  Name of the token group.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public _FinalStage tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + @java.lang.Override + public _FinalStage value(GoogleProtobufValue value) { + this.value = Optional.ofNullable(value); + return this; + } + + @java.lang.Override + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public _FinalStage value(Optional value) { + this.value = value; + return this; + } + + @java.lang.Override + public DetokenizeResponseObject build() { + return new DetokenizeResponseObject( + token, value, tokenGroupName, error, httpCode, metadata, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java index 4113b998..3becce63 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java @@ -3,14 +3,18 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - import java.util.HashMap; import java.util.Map; import java.util.Objects; +import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = ErrorResponse.Builder.class) @@ -29,7 +33,7 @@ public ErrorResponseError getError() { return error; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; return other instanceof ErrorResponse && equalTo((ErrorResponse) other); @@ -44,12 +48,12 @@ private boolean equalTo(ErrorResponse other) { return error.equals(other.error); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.error); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -66,6 +70,10 @@ public interface ErrorStage { public interface _FinalStage { ErrorResponse build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); } @JsonIgnoreProperties(ignoreUnknown = true) @@ -77,22 +85,34 @@ public static final class Builder implements ErrorStage, _FinalStage { private Builder() {} - @Override + @java.lang.Override public Builder from(ErrorResponse other) { error(other.getError()); return this; } - @Override + @java.lang.Override @JsonSetter("error") public _FinalStage error(@NotNull ErrorResponseError error) { this.error = Objects.requireNonNull(error, "error must not be null"); return this; } - @Override + @java.lang.Override public ErrorResponse build() { return new ErrorResponse(error, additionalProperties); } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java index 4774fa57..a10d36cc 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java @@ -3,13 +3,22 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import org.jetbrains.annotations.NotNull; -import java.util.*; - @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = ErrorResponseError.Builder.class) public final class ErrorResponseError { @@ -68,7 +77,7 @@ public Optional>> getDetails() { return details; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; return other instanceof ErrorResponseError && equalTo((ErrorResponseError) other); @@ -87,12 +96,12 @@ private boolean equalTo(ErrorResponseError other) { && details.equals(other.details); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.grpcCode, this.httpCode, this.httpStatus, this.message, this.details); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -103,7 +112,7 @@ public static GrpcCodeStage builder() { public interface GrpcCodeStage { /** - * gRPC status codes. See https://grpc.io/docs/guides/status-codes. + *

                                  gRPC status codes. See https://grpc.io/docs/guides/status-codes.

                                  */ HttpCodeStage grpcCode(int grpcCode); @@ -125,6 +134,10 @@ public interface MessageStage { public interface _FinalStage { ErrorResponseError build(); + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + _FinalStage details(Optional>> details); _FinalStage details(List> details); @@ -148,7 +161,7 @@ public static final class Builder private Builder() {} - @Override + @java.lang.Override public Builder from(ErrorResponseError other) { grpcCode(other.getGrpcCode()); httpCode(other.getHttpCode()); @@ -159,53 +172,65 @@ public Builder from(ErrorResponseError other) { } /** - * gRPC status codes. See https://grpc.io/docs/guides/status-codes.

                                  gRPC status codes. See https://grpc.io/docs/guides/status-codes.

                                  + *

                                  gRPC status codes. See https://grpc.io/docs/guides/status-codes.

                                  * @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override @JsonSetter("grpc_code") public HttpCodeStage grpcCode(int grpcCode) { this.grpcCode = grpcCode; return this; } - @Override + @java.lang.Override @JsonSetter("http_code") public HttpStatusStage httpCode(int httpCode) { this.httpCode = httpCode; return this; } - @Override + @java.lang.Override @JsonSetter("http_status") public MessageStage httpStatus(@NotNull String httpStatus) { this.httpStatus = Objects.requireNonNull(httpStatus, "httpStatus must not be null"); return this; } - @Override + @java.lang.Override @JsonSetter("message") public _FinalStage message(@NotNull String message) { this.message = Objects.requireNonNull(message, "message must not be null"); return this; } - @Override + @java.lang.Override public _FinalStage details(List> details) { this.details = Optional.ofNullable(details); return this; } - @Override + @java.lang.Override @JsonSetter(value = "details", nulls = Nulls.SKIP) public _FinalStage details(Optional>> details) { this.details = details; return this; } - @Override + @java.lang.Override public ErrorResponseError build() { return new ErrorResponseError(grpcCode, httpCode, httpStatus, message, details, additionalProperties); } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryRecordResponse.java new file mode 100644 index 00000000..5c3433f4 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryRecordResponse.java @@ -0,0 +1,111 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ExecuteQueryRecordResponse.Builder.class) +public final class ExecuteQueryRecordResponse { + private final Optional> data; + + private final Map additionalProperties; + + private ExecuteQueryRecordResponse(Optional> data, Map additionalProperties) { + this.data = data; + this.additionalProperties = additionalProperties; + } + + /** + * @return Fields and values for the record. + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ExecuteQueryRecordResponse && equalTo((ExecuteQueryRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ExecuteQueryRecordResponse other) { + return data.equals(other.data); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.data); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> data = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(ExecuteQueryRecordResponse other) { + data(other.getData()); + return this; + } + + /** + *

                                  Fields and values for the record.

                                  + */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Optional> data) { + this.data = data; + return this; + } + + public Builder data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + public ExecuteQueryRecordResponse build() { + return new ExecuteQueryRecordResponse(data, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponse.java new file mode 100644 index 00000000..98eceffa --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponse.java @@ -0,0 +1,137 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ExecuteQueryResponse.Builder.class) +public final class ExecuteQueryResponse { + private final Optional> records; + + private final Optional metadata; + + private final Map additionalProperties; + + private ExecuteQueryResponse( + Optional> records, + Optional metadata, + Map additionalProperties) { + this.records = records; + this.metadata = metadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Records corresponding to the specified query. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @JsonProperty("metadata") + public Optional getMetadata() { + return metadata; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ExecuteQueryResponse && equalTo((ExecuteQueryResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ExecuteQueryResponse other) { + return records.equals(other.records) && metadata.equals(other.metadata); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records, this.metadata); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + private Optional metadata = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(ExecuteQueryResponse other) { + records(other.getRecords()); + metadata(other.getMetadata()); + return this; + } + + /** + *

                                  Records corresponding to the specified query.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + @JsonSetter(value = "metadata", nulls = Nulls.SKIP) + public Builder metadata(Optional metadata) { + this.metadata = metadata; + return this; + } + + public Builder metadata(ExecuteQueryResponseMetadata metadata) { + this.metadata = Optional.ofNullable(metadata); + return this; + } + + public ExecuteQueryResponse build() { + return new ExecuteQueryResponse(records, metadata, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponseMetadata.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponseMetadata.java new file mode 100644 index 00000000..0c98eaee --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponseMetadata.java @@ -0,0 +1,112 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ExecuteQueryResponseMetadata.Builder.class) +public final class ExecuteQueryResponseMetadata { + private final Optional> columns; + + private final Map additionalProperties; + + private ExecuteQueryResponseMetadata(Optional> columns, Map additionalProperties) { + this.columns = columns; + this.additionalProperties = additionalProperties; + } + + /** + * @return Columns returned for the query. + */ + @JsonProperty("columns") + public Optional> getColumns() { + return columns; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ExecuteQueryResponseMetadata && equalTo((ExecuteQueryResponseMetadata) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ExecuteQueryResponseMetadata other) { + return columns.equals(other.columns); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.columns); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> columns = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(ExecuteQueryResponseMetadata other) { + columns(other.getColumns()); + return this; + } + + /** + *

                                  Columns returned for the query.

                                  + */ + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public Builder columns(Optional> columns) { + this.columns = columns; + return this; + } + + public Builder columns(List columns) { + this.columns = Optional.ofNullable(columns); + return this; + } + + public ExecuteQueryResponseMetadata build() { + return new ExecuteQueryResponseMetadata(columns, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FieldRecords.java similarity index 73% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/FieldRecords.java index b64b8792..3fa42675 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FieldRecords.java @@ -3,25 +3,30 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1FieldRecords.Builder.class) -public final class V1FieldRecords { +@JsonDeserialize(builder = FieldRecords.Builder.class) +public final class FieldRecords { private final Optional> fields; private final Optional> tokens; private final Map additionalProperties; - private V1FieldRecords( + private FieldRecords( Optional> fields, Optional> tokens, Map additionalProperties) { @@ -46,10 +51,10 @@ public Optional> getTokens() { return tokens; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1FieldRecords && equalTo((V1FieldRecords) other); + return other instanceof FieldRecords && equalTo((FieldRecords) other); } @JsonAnyGetter @@ -57,16 +62,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1FieldRecords other) { + private boolean equalTo(FieldRecords other) { return fields.equals(other.fields) && tokens.equals(other.tokens); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.fields, this.tokens); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -86,7 +91,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1FieldRecords other) { + public Builder from(FieldRecords other) { fields(other.getFields()); tokens(other.getTokens()); return this; @@ -120,8 +125,18 @@ public Builder tokens(Map tokens) { return this; } - public V1FieldRecords build() { - return new V1FieldRecords(fields, tokens, additionalProperties); + public FieldRecords build() { + return new FieldRecords(fields, tokens, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileData.java deleted file mode 100644 index fd6fa822..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileData.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileData.Builder.class) -public final class FileData { - private final String base64; - - private final FileDataDataFormat dataFormat; - - private final Map additionalProperties; - - private FileData(String base64, FileDataDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileData && equalTo((FileData) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileData other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileData other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDataFormat dataFormat); - } - - public interface _FinalStage { - FileData build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileData other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileData build() { - return new FileData(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java deleted file mode 100644 index 8ed06e57..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDataFormat { - MP_3("mp3"), - - WAV("wav"), - - PDF("pdf"), - - TXT("txt"), - - CSV("csv"), - - JSON("json"), - - JPG("jpg"), - - JPEG("jpeg"), - - TIF("tif"), - - TIFF("tiff"), - - PNG("png"), - - BMP("bmp"), - - XLS("xls"), - - XLSX("xlsx"), - - DOC("doc"), - - DOCX("docx"), - - PPT("ppt"), - - PPTX("pptx"), - - XML("xml"), - - DCM("dcm"), - - JSONL("jsonl"); - - private final String value; - - FileDataDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java deleted file mode 100644 index b6a5ea11..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyAudio.Builder.class) -public final class FileDataDeidentifyAudio { - private final String base64; - - private final FileDataDeidentifyAudioDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyAudio( - String base64, FileDataDeidentifyAudioDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyAudioDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyAudio && equalTo((FileDataDeidentifyAudio) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyAudio other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyAudio other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyAudioDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyAudio build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyAudioDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyAudio other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyAudioDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyAudio build() { - return new FileDataDeidentifyAudio(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java deleted file mode 100644 index 06121b27..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyAudioDataFormat { - MP_3("mp3"), - - WAV("wav"); - - private final String value; - - FileDataDeidentifyAudioDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java deleted file mode 100644 index 5fb12fba..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyDocument.Builder.class) -public final class FileDataDeidentifyDocument { - private final String base64; - - private final FileDataDeidentifyDocumentDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyDocument( - String base64, FileDataDeidentifyDocumentDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyDocumentDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyDocument && equalTo((FileDataDeidentifyDocument) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyDocument other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyDocument other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyDocumentDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyDocument build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyDocumentDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyDocument other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyDocumentDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyDocument build() { - return new FileDataDeidentifyDocument(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java deleted file mode 100644 index a68ee832..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyDocumentDataFormat { - PDF("pdf"), - - DOC("doc"), - - DOCX("docx"); - - private final String value; - - FileDataDeidentifyDocumentDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java deleted file mode 100644 index bc5e2c6b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyImage.Builder.class) -public final class FileDataDeidentifyImage { - private final String base64; - - private final FileDataDeidentifyImageDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyImage( - String base64, FileDataDeidentifyImageDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyImageDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyImage && equalTo((FileDataDeidentifyImage) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyImage other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyImage other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyImageDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyImage build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyImageDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyImage other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyImageDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyImage build() { - return new FileDataDeidentifyImage(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java deleted file mode 100644 index 34541314..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyImageDataFormat { - JPG("jpg"), - - JPEG("jpeg"), - - TIF("tif"), - - TIFF("tiff"), - - PNG("png"), - - BMP("bmp"); - - private final String value; - - FileDataDeidentifyImageDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java deleted file mode 100644 index 5606e917..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyPdf.Builder.class) -public final class FileDataDeidentifyPdf { - private final String base64; - - private final Map additionalProperties; - - private FileDataDeidentifyPdf(String base64, Map additionalProperties) { - this.base64 = base64; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public String getDataFormat() { - return "pdf"; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyPdf && equalTo((FileDataDeidentifyPdf) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyPdf other) { - return base64.equals(other.base64); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - _FinalStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyPdf other); - } - - public interface _FinalStage { - FileDataDeidentifyPdf build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, _FinalStage { - private String base64; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyPdf other) { - base64(other.getBase64()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public _FinalStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - @Override - public FileDataDeidentifyPdf build() { - return new FileDataDeidentifyPdf(base64, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java deleted file mode 100644 index 0bedabc5..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyPresentation.Builder.class) -public final class FileDataDeidentifyPresentation { - private final String base64; - - private final FileDataDeidentifyPresentationDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyPresentation( - String base64, - FileDataDeidentifyPresentationDataFormat dataFormat, - Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyPresentationDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyPresentation && equalTo((FileDataDeidentifyPresentation) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyPresentation other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyPresentation other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyPresentationDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyPresentation build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyPresentationDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyPresentation other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyPresentationDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyPresentation build() { - return new FileDataDeidentifyPresentation(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java deleted file mode 100644 index 6aed659d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyPresentationDataFormat { - PPT("ppt"), - - PPTX("pptx"); - - private final String value; - - FileDataDeidentifyPresentationDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java deleted file mode 100644 index dd017bb8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifySpreadsheet.Builder.class) -public final class FileDataDeidentifySpreadsheet { - private final String base64; - - private final FileDataDeidentifySpreadsheetDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifySpreadsheet( - String base64, - FileDataDeidentifySpreadsheetDataFormat dataFormat, - Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifySpreadsheetDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifySpreadsheet && equalTo((FileDataDeidentifySpreadsheet) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifySpreadsheet other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifySpreadsheet other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifySpreadsheetDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifySpreadsheet build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifySpreadsheetDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifySpreadsheet other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifySpreadsheetDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifySpreadsheet build() { - return new FileDataDeidentifySpreadsheet(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java deleted file mode 100644 index 9fc8b8ae..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifySpreadsheetDataFormat { - CSV("csv"), - - XLS("xls"), - - XLSX("xlsx"); - - private final String value; - - FileDataDeidentifySpreadsheetDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java deleted file mode 100644 index 814d51c3..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyStructuredText.Builder.class) -public final class FileDataDeidentifyStructuredText { - private final String base64; - - private final FileDataDeidentifyStructuredTextDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyStructuredText( - String base64, - FileDataDeidentifyStructuredTextDataFormat dataFormat, - Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyStructuredTextDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyStructuredText && equalTo((FileDataDeidentifyStructuredText) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyStructuredText other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyStructuredText other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyStructuredTextDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyStructuredText build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyStructuredTextDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyStructuredText other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyStructuredTextDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyStructuredText build() { - return new FileDataDeidentifyStructuredText(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java deleted file mode 100644 index 29d9548b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyStructuredTextDataFormat { - JSON("json"), - - XML("xml"); - - private final String value; - - FileDataDeidentifyStructuredTextDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java deleted file mode 100644 index e5c88180..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyText.Builder.class) -public final class FileDataDeidentifyText { - private final String base64; - - private final Map additionalProperties; - - private FileDataDeidentifyText(String base64, Map additionalProperties) { - this.base64 = base64; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public String getDataFormat() { - return "txt"; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyText && equalTo((FileDataDeidentifyText) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyText other) { - return base64.equals(other.base64); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - _FinalStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyText other); - } - - public interface _FinalStage { - FileDataDeidentifyText build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, _FinalStage { - private String base64; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyText other) { - base64(other.getBase64()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public _FinalStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - @Override - public FileDataDeidentifyText build() { - return new FileDataDeidentifyText(base64, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java deleted file mode 100644 index 9148703c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataReidentifyFile.Builder.class) -public final class FileDataReidentifyFile { - private final String base64; - - private final FileDataReidentifyFileDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataReidentifyFile( - String base64, FileDataReidentifyFileDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataReidentifyFileDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataReidentifyFile && equalTo((FileDataReidentifyFile) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataReidentifyFile other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataReidentifyFile other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataReidentifyFileDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataReidentifyFile build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataReidentifyFileDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataReidentifyFile other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataReidentifyFileDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataReidentifyFile build() { - return new FileDataReidentifyFile(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java deleted file mode 100644 index cc8293d2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataReidentifyFileDataFormat { - TXT("txt"), - - CSV("csv"), - - JSON("json"), - - XLS("xls"), - - XLSX("xlsx"), - - DOC("doc"), - - DOCX("docx"), - - XML("xml"); - - private final String value; - - FileDataReidentifyFileDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteRecord.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteRecord.java new file mode 100644 index 00000000..5d3aad52 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteRecord.java @@ -0,0 +1,280 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileDeleteRecord.Builder.class) +public final class FileDeleteRecord { + private final String tableName; + + private final Optional skyflowId; + + private final List columns; + + private final Optional> uniqueValues; + + private final Map additionalProperties; + + private FileDeleteRecord( + String tableName, + Optional skyflowId, + List columns, + Optional> uniqueValues, + Map additionalProperties) { + this.tableName = tableName; + this.skyflowId = skyflowId; + this.columns = columns; + this.uniqueValues = uniqueValues; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Skyflow ID of the record containing the file column(s) to delete. Either skyflowID or uniqueValues must be specified, not both. + */ + @JsonProperty("skyflowID") + public Optional getSkyflowId() { + return skyflowId; + } + + /** + * @return Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record. + */ + @JsonProperty("columns") + public List getColumns() { + return columns; + } + + /** + * @return List of unique constraint values used to look up the record(s) to delete, in place of skyflowID. If more than one object is provided, each is resolved independently and the specified columns are deleted from every matching record. + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileDeleteRecord && equalTo((FileDeleteRecord) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileDeleteRecord other) { + return tableName.equals(other.tableName) + && skyflowId.equals(other.skyflowId) + && columns.equals(other.columns) + && uniqueValues.equals(other.uniqueValues); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tableName, this.skyflowId, this.columns, this.uniqueValues); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + + Builder from(FileDeleteRecord other); + } + + public interface _FinalStage { + FileDeleteRecord build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow ID of the record containing the file column(s) to delete. Either skyflowID or uniqueValues must be specified, not both.

                                  + */ + _FinalStage skyflowId(Optional skyflowId); + + _FinalStage skyflowId(String skyflowId); + + /** + *

                                  Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record.

                                  + */ + _FinalStage columns(List columns); + + _FinalStage addColumns(String columns); + + _FinalStage addAllColumns(List columns); + + /** + *

                                  List of unique constraint values used to look up the record(s) to delete, in place of skyflowID. If more than one object is provided, each is resolved independently and the specified columns are deleted from every matching record.

                                  + */ + _FinalStage uniqueValues(Optional> uniqueValues); + + _FinalStage uniqueValues(List uniqueValues); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, _FinalStage { + private String tableName; + + private Optional> uniqueValues = Optional.empty(); + + private List columns = new ArrayList<>(); + + private Optional skyflowId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileDeleteRecord other) { + tableName(other.getTableName()); + skyflowId(other.getSkyflowId()); + columns(other.getColumns()); + uniqueValues(other.getUniqueValues()); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  List of unique constraint values used to look up the record(s) to delete, in place of skyflowID. If more than one object is provided, each is resolved independently and the specified columns are deleted from every matching record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + /** + *

                                  List of unique constraint values used to look up the record(s) to delete, in place of skyflowID. If more than one object is provided, each is resolved independently and the specified columns are deleted from every matching record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public _FinalStage uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + /** + *

                                  Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllColumns(List columns) { + if (columns != null) { + this.columns.addAll(columns); + } + return this; + } + + /** + *

                                  Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addColumns(String columns) { + this.columns.add(columns); + return this; + } + + /** + *

                                  Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public _FinalStage columns(List columns) { + this.columns.clear(); + if (columns != null) { + this.columns.addAll(columns); + } + return this; + } + + /** + *

                                  Skyflow ID of the record containing the file column(s) to delete. Either skyflowID or uniqueValues must be specified, not both.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

                                  Skyflow ID of the record containing the file column(s) to delete. Either skyflowID or uniqueValues must be specified, not both.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public _FinalStage skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + @java.lang.Override + public FileDeleteRecord build() { + return new FileDeleteRecord(tableName, skyflowId, columns, uniqueValues, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponse.java new file mode 100644 index 00000000..5062fdf2 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileDeleteResponse.Builder.class) +public final class FileDeleteResponse { + private final List records; + + private final Map additionalProperties; + + private FileDeleteResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of records (max 100) with the result of the delete operation. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileDeleteResponse && equalTo((FileDeleteResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileDeleteResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(FileDeleteResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of records (max 100) with the result of the delete operation.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(FileDeleteResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public FileDeleteResponse build() { + return new FileDeleteResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponseObject.java new file mode 100644 index 00000000..61427130 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponseObject.java @@ -0,0 +1,295 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileDeleteResponseObject.Builder.class) +public final class FileDeleteResponseObject { + private final Optional skyflowId; + + private final String tableName; + + private final Optional> data; + + private final Optional error; + + private final int httpCode; + + private final Map additionalProperties; + + private FileDeleteResponseObject( + Optional skyflowId, + String tableName, + Optional> data, + Optional error, + int httpCode, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.tableName = tableName; + this.data = data; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID of the record that was targeted. When the request specifies uniqueValues, this is the skyflowID resolved from the matching record. Null if the record failed validation before a skyflowID could be resolved. + */ + @JsonProperty("skyflowID") + public Optional getSkyflowId() { + return skyflowId; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Map of column name to deletion result. Populated only when the record's delete succeeds, with one entry per requested column with status DELETED. Null if any requested column has no file present, in which case error is populated instead. + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + /** + * @return Error message describing any issue with the specific record. Null if no error occurred. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code representing the result of the API request for this record. + */ + @JsonProperty("httpCode") + public int getHttpCode() { + return httpCode; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileDeleteResponseObject && equalTo((FileDeleteResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileDeleteResponseObject other) { + return skyflowId.equals(other.skyflowId) + && tableName.equals(other.tableName) + && data.equals(other.data) + && error.equals(other.error) + && httpCode == other.httpCode; + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.tableName, this.data, this.error, this.httpCode); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + HttpCodeStage tableName(@NotNull String tableName); + + Builder from(FileDeleteResponseObject other); + } + + public interface HttpCodeStage { + /** + *

                                  HTTP status code representing the result of the API request for this record.

                                  + */ + _FinalStage httpCode(int httpCode); + } + + public interface _FinalStage { + FileDeleteResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow ID of the record that was targeted. When the request specifies uniqueValues, this is the skyflowID resolved from the matching record. Null if the record failed validation before a skyflowID could be resolved.

                                  + */ + _FinalStage skyflowId(Optional skyflowId); + + _FinalStage skyflowId(String skyflowId); + + /** + *

                                  Map of column name to deletion result. Populated only when the record's delete succeeds, with one entry per requested column with status DELETED. Null if any requested column has no file present, in which case error is populated instead.

                                  + */ + _FinalStage data(Optional> data); + + _FinalStage data(Map data); + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, HttpCodeStage, _FinalStage { + private String tableName; + + private int httpCode; + + private Optional error = Optional.empty(); + + private Optional> data = Optional.empty(); + + private Optional skyflowId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileDeleteResponseObject other) { + skyflowId(other.getSkyflowId()); + tableName(other.getTableName()); + data(other.getData()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public HttpCodeStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  HTTP status code representing the result of the API request for this record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("httpCode") + public _FinalStage httpCode(int httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Map of column name to deletion result. Populated only when the record's delete succeeds, with one entry per requested column with status DELETED. Null if any requested column has no file present, in which case error is populated instead.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

                                  Map of column name to deletion result. Populated only when the record's delete succeeds, with one entry per requested column with status DELETED. Null if any requested column has no file present, in which case error is populated instead.

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(Optional> data) { + this.data = data; + return this; + } + + /** + *

                                  Skyflow ID of the record that was targeted. When the request specifies uniqueValues, this is the skyflowID resolved from the matching record. Null if the record failed validation before a skyflowID could be resolved.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

                                  Skyflow ID of the record that was targeted. When the request specifies uniqueValues, this is the skyflowID resolved from the matching record. Null if the record failed validation before a skyflowID could be resolved.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public _FinalStage skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + @java.lang.Override + public FileDeleteResponseObject build() { + return new FileDeleteResponseObject(skyflowId, tableName, data, error, httpCode, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileMetadata.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileMetadata.java new file mode 100644 index 00000000..ff30111e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileMetadata.java @@ -0,0 +1,173 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileMetadata.Builder.class) +public final class FileMetadata { + private final Optional fileName; + + private final Optional fileSizeKb; + + private final Optional fileType; + + private final Map additionalProperties; + + private FileMetadata( + Optional fileName, + Optional fileSizeKb, + Optional fileType, + Map additionalProperties) { + this.fileName = fileName; + this.fileSizeKb = fileSizeKb; + this.fileType = fileType; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the file, including the extension if provided. + */ + @JsonProperty("fileName") + public Optional getFileName() { + return fileName; + } + + /** + * @return Size of the file in kilobytes (KB), rounded up from bytes to the nearest KB. + */ + @JsonProperty("fileSizeKB") + public Optional getFileSizeKb() { + return fileSizeKb; + } + + /** + * @return Type of the file, detected based on its content (MIME type). + */ + @JsonProperty("fileType") + public Optional getFileType() { + return fileType; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileMetadata && equalTo((FileMetadata) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileMetadata other) { + return fileName.equals(other.fileName) + && fileSizeKb.equals(other.fileSizeKb) + && fileType.equals(other.fileType); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.fileName, this.fileSizeKb, this.fileType); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional fileName = Optional.empty(); + + private Optional fileSizeKb = Optional.empty(); + + private Optional fileType = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(FileMetadata other) { + fileName(other.getFileName()); + fileSizeKb(other.getFileSizeKb()); + fileType(other.getFileType()); + return this; + } + + /** + *

                                  Name of the file, including the extension if provided.

                                  + */ + @JsonSetter(value = "fileName", nulls = Nulls.SKIP) + public Builder fileName(Optional fileName) { + this.fileName = fileName; + return this; + } + + public Builder fileName(String fileName) { + this.fileName = Optional.ofNullable(fileName); + return this; + } + + /** + *

                                  Size of the file in kilobytes (KB), rounded up from bytes to the nearest KB.

                                  + */ + @JsonSetter(value = "fileSizeKB", nulls = Nulls.SKIP) + public Builder fileSizeKb(Optional fileSizeKb) { + this.fileSizeKb = fileSizeKb; + return this; + } + + public Builder fileSizeKb(Integer fileSizeKb) { + this.fileSizeKb = Optional.ofNullable(fileSizeKb); + return this; + } + + /** + *

                                  Type of the file, detected based on its content (MIME type).

                                  + */ + @JsonSetter(value = "fileType", nulls = Nulls.SKIP) + public Builder fileType(Optional fileType) { + this.fileType = fileType; + return this; + } + + public Builder fileType(String fileType) { + this.fileType = Optional.ofNullable(fileType); + return this; + } + + public FileMetadata build() { + return new FileMetadata(fileName, fileSizeKb, fileType, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadColumn.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadColumn.java new file mode 100644 index 00000000..73d3f27e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadColumn.java @@ -0,0 +1,171 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadColumn.Builder.class) +public final class FileUploadColumn { + private final String column; + + private final Optional fileName; + + private final Map additionalProperties; + + private FileUploadColumn(String column, Optional fileName, Map additionalProperties) { + this.column = column; + this.fileName = fileName; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the column where the file is being uploaded. + */ + @JsonProperty("column") + public String getColumn() { + return column; + } + + /** + * @return Name of the file being uploaded to the file column. If not provided, a random 16-byte UUID name is generated. + */ + @JsonProperty("fileName") + public Optional getFileName() { + return fileName; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadColumn && equalTo((FileUploadColumn) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadColumn other) { + return column.equals(other.column) && fileName.equals(other.fileName); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.column, this.fileName); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static ColumnStage builder() { + return new Builder(); + } + + public interface ColumnStage { + /** + *

                                  Name of the column where the file is being uploaded.

                                  + */ + _FinalStage column(@NotNull String column); + + Builder from(FileUploadColumn other); + } + + public interface _FinalStage { + FileUploadColumn build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Name of the file being uploaded to the file column. If not provided, a random 16-byte UUID name is generated.

                                  + */ + _FinalStage fileName(Optional fileName); + + _FinalStage fileName(String fileName); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements ColumnStage, _FinalStage { + private String column; + + private Optional fileName = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileUploadColumn other) { + column(other.getColumn()); + fileName(other.getFileName()); + return this; + } + + /** + *

                                  Name of the column where the file is being uploaded.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("column") + public _FinalStage column(@NotNull String column) { + this.column = Objects.requireNonNull(column, "column must not be null"); + return this; + } + + /** + *

                                  Name of the file being uploaded to the file column. If not provided, a random 16-byte UUID name is generated.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage fileName(String fileName) { + this.fileName = Optional.ofNullable(fileName); + return this; + } + + /** + *

                                  Name of the file being uploaded to the file column. If not provided, a random 16-byte UUID name is generated.

                                  + */ + @java.lang.Override + @JsonSetter(value = "fileName", nulls = Nulls.SKIP) + public _FinalStage fileName(Optional fileName) { + this.fileName = fileName; + return this; + } + + @java.lang.Override + public FileUploadColumn build() { + return new FileUploadColumn(column, fileName, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadRecord.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadRecord.java new file mode 100644 index 00000000..976b0bfb --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadRecord.java @@ -0,0 +1,235 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadRecord.Builder.class) +public final class FileUploadRecord { + private final String tableName; + + private final Optional skyflowId; + + private final List columns; + + private final Map additionalProperties; + + private FileUploadRecord( + String tableName, + Optional skyflowId, + List columns, + Map additionalProperties) { + this.tableName = tableName; + this.skyflowId = skyflowId; + this.columns = columns; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Skyflow ID of the record. If not provided, a new record is created and its skyflowID is used for the file upload. + */ + @JsonProperty("skyflowID") + public Optional getSkyflowId() { + return skyflowId; + } + + /** + * @return List of file columns to generate signed upload URLs for. + */ + @JsonProperty("columns") + public List getColumns() { + return columns; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadRecord && equalTo((FileUploadRecord) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadRecord other) { + return tableName.equals(other.tableName) && skyflowId.equals(other.skyflowId) && columns.equals(other.columns); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tableName, this.skyflowId, this.columns); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + + Builder from(FileUploadRecord other); + } + + public interface _FinalStage { + FileUploadRecord build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow ID of the record. If not provided, a new record is created and its skyflowID is used for the file upload.

                                  + */ + _FinalStage skyflowId(Optional skyflowId); + + _FinalStage skyflowId(String skyflowId); + + /** + *

                                  List of file columns to generate signed upload URLs for.

                                  + */ + _FinalStage columns(List columns); + + _FinalStage addColumns(FileUploadColumn columns); + + _FinalStage addAllColumns(List columns); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, _FinalStage { + private String tableName; + + private List columns = new ArrayList<>(); + + private Optional skyflowId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileUploadRecord other) { + tableName(other.getTableName()); + skyflowId(other.getSkyflowId()); + columns(other.getColumns()); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  List of file columns to generate signed upload URLs for.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllColumns(List columns) { + if (columns != null) { + this.columns.addAll(columns); + } + return this; + } + + /** + *

                                  List of file columns to generate signed upload URLs for.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addColumns(FileUploadColumn columns) { + this.columns.add(columns); + return this; + } + + /** + *

                                  List of file columns to generate signed upload URLs for.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public _FinalStage columns(List columns) { + this.columns.clear(); + if (columns != null) { + this.columns.addAll(columns); + } + return this; + } + + /** + *

                                  Skyflow ID of the record. If not provided, a new record is created and its skyflowID is used for the file upload.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

                                  Skyflow ID of the record. If not provided, a new record is created and its skyflowID is used for the file upload.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public _FinalStage skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + @java.lang.Override + public FileUploadRecord build() { + return new FileUploadRecord(tableName, skyflowId, columns, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponse.java new file mode 100644 index 00000000..6ef52d52 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadResponse.Builder.class) +public final class FileUploadResponse { + private final List records; + + private final Map additionalProperties; + + private FileUploadResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of records with signed upload URLs. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadResponse && equalTo((FileUploadResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(FileUploadResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of records with signed upload URLs.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(FileUploadResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public FileUploadResponse build() { + return new FileUploadResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponseObject.java new file mode 100644 index 00000000..5a2d674c --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponseObject.java @@ -0,0 +1,286 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadResponseObject.Builder.class) +public final class FileUploadResponseObject { + private final String skyflowId; + + private final String tableName; + + private final Optional> data; + + private final Optional error; + + private final int httpCode; + + private final Map additionalProperties; + + private FileUploadResponseObject( + String skyflowId, + String tableName, + Optional> data, + Optional error, + int httpCode, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.tableName = tableName; + this.data = data; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID of the record. A new skyflowID is returned if one was not provided in the request. + */ + @JsonProperty("skyflowID") + public String getSkyflowId() { + return skyflowId; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Map of column names to signed upload URLs. Each signed URL expires after 15 minutes by default. + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + /** + * @return Error message describing any issue with the specific record. Null if no error occurred. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code representing the result of the API request for this record. + */ + @JsonProperty("httpCode") + public int getHttpCode() { + return httpCode; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadResponseObject && equalTo((FileUploadResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadResponseObject other) { + return skyflowId.equals(other.skyflowId) + && tableName.equals(other.tableName) + && data.equals(other.data) + && error.equals(other.error) + && httpCode == other.httpCode; + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.tableName, this.data, this.error, this.httpCode); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static SkyflowIdStage builder() { + return new Builder(); + } + + public interface SkyflowIdStage { + /** + *

                                  Skyflow ID of the record. A new skyflowID is returned if one was not provided in the request.

                                  + */ + TableNameStage skyflowId(@NotNull String skyflowId); + + Builder from(FileUploadResponseObject other); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + HttpCodeStage tableName(@NotNull String tableName); + } + + public interface HttpCodeStage { + /** + *

                                  HTTP status code representing the result of the API request for this record.

                                  + */ + _FinalStage httpCode(int httpCode); + } + + public interface _FinalStage { + FileUploadResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Map of column names to signed upload URLs. Each signed URL expires after 15 minutes by default.

                                  + */ + _FinalStage data(Optional> data); + + _FinalStage data(Map data); + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements SkyflowIdStage, TableNameStage, HttpCodeStage, _FinalStage { + private String skyflowId; + + private String tableName; + + private int httpCode; + + private Optional error = Optional.empty(); + + private Optional> data = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileUploadResponseObject other) { + skyflowId(other.getSkyflowId()); + tableName(other.getTableName()); + data(other.getData()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Skyflow ID of the record. A new skyflowID is returned if one was not provided in the request.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("skyflowID") + public TableNameStage skyflowId(@NotNull String skyflowId) { + this.skyflowId = Objects.requireNonNull(skyflowId, "skyflowId must not be null"); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public HttpCodeStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  HTTP status code representing the result of the API request for this record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("httpCode") + public _FinalStage httpCode(int httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Map of column names to signed upload URLs. Each signed URL expires after 15 minutes by default.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

                                  Map of column names to signed upload URLs. Each signed URL expires after 15 minutes by default.

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(Optional> data) { + this.data = data; + return this; + } + + @java.lang.Override + public FileUploadResponseObject build() { + return new FileUploadResponseObject(skyflowId, tableName, data, error, httpCode, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/Format.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/Format.java deleted file mode 100644 index 1563b90a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/Format.java +++ /dev/null @@ -1,153 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = Format.Builder.class) -public final class Format { - private final Optional> redacted; - - private final Optional> masked; - - private final Optional> plaintext; - - private final Map additionalProperties; - - private Format( - Optional> redacted, - Optional> masked, - Optional> plaintext, - Map additionalProperties) { - this.redacted = redacted; - this.masked = masked; - this.plaintext = plaintext; - this.additionalProperties = additionalProperties; - } - - /** - * @return Entity types to fully redact. - */ - @JsonProperty("redacted") - public Optional> getRedacted() { - return redacted; - } - - /** - * @return Entity types to mask. - */ - @JsonProperty("masked") - public Optional> getMasked() { - return masked; - } - - /** - * @return Entity types to return in plaintext. - */ - @JsonProperty("plaintext") - public Optional> getPlaintext() { - return plaintext; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof Format && equalTo((Format) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(Format other) { - return redacted.equals(other.redacted) && masked.equals(other.masked) && plaintext.equals(other.plaintext); - } - - @Override - public int hashCode() { - return Objects.hash(this.redacted, this.masked, this.plaintext); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> redacted = Optional.empty(); - - private Optional> masked = Optional.empty(); - - private Optional> plaintext = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(Format other) { - redacted(other.getRedacted()); - masked(other.getMasked()); - plaintext(other.getPlaintext()); - return this; - } - - /** - *

                                  Entity types to fully redact.

                                  - */ - @JsonSetter(value = "redacted", nulls = Nulls.SKIP) - public Builder redacted(Optional> redacted) { - this.redacted = redacted; - return this; - } - - public Builder redacted(List redacted) { - this.redacted = Optional.ofNullable(redacted); - return this; - } - - /** - *

                                  Entity types to mask.

                                  - */ - @JsonSetter(value = "masked", nulls = Nulls.SKIP) - public Builder masked(Optional> masked) { - this.masked = masked; - return this; - } - - public Builder masked(List masked) { - this.masked = Optional.ofNullable(masked); - return this; - } - - /** - *

                                  Entity types to return in plaintext.

                                  - */ - @JsonSetter(value = "plaintext", nulls = Nulls.SKIP) - public Builder plaintext(Optional> plaintext) { - this.plaintext = plaintext; - return this; - } - - public Builder plaintext(List plaintext) { - this.plaintext = Optional.ofNullable(plaintext); - return this; - } - - public Format build() { - return new Format(redacted, masked, plaintext, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java deleted file mode 100644 index 77d18a2b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FormatMaskedItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - FormatMaskedItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java deleted file mode 100644 index 0a5e97f8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FormatPlaintextItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - FormatPlaintextItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java deleted file mode 100644 index 92eb291a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FormatRedactedItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - FormatRedactedItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GetFieldRecords.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetFieldRecords.java new file mode 100644 index 00000000..230ddbbc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetFieldRecords.java @@ -0,0 +1,171 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetFieldRecords.Builder.class) +public final class GetFieldRecords { + private final Optional> fields; + + private final Optional> tokens; + + private final Optional> fileMetadata; + + private final Map additionalProperties; + + private GetFieldRecords( + Optional> fields, + Optional> tokens, + Optional> fileMetadata, + Map additionalProperties) { + this.fields = fields; + this.tokens = tokens; + this.fileMetadata = fileMetadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Fields and values for the record. For example, {'field_1':'value_1', 'field_2':'value_2'}. + */ + @JsonProperty("fields") + public Optional> getFields() { + return fields; + } + + /** + * @return Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}. + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return Metadata for the uploaded file, keyed by dynamic column name. + */ + @JsonProperty("fileMetadata") + public Optional> getFileMetadata() { + return fileMetadata; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetFieldRecords && equalTo((GetFieldRecords) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetFieldRecords other) { + return fields.equals(other.fields) && tokens.equals(other.tokens) && fileMetadata.equals(other.fileMetadata); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.fields, this.tokens, this.fileMetadata); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> fields = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional> fileMetadata = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GetFieldRecords other) { + fields(other.getFields()); + tokens(other.getTokens()); + fileMetadata(other.getFileMetadata()); + return this; + } + + /** + *

                                  Fields and values for the record. For example, {'field_1':'value_1', 'field_2':'value_2'}.

                                  + */ + @JsonSetter(value = "fields", nulls = Nulls.SKIP) + public Builder fields(Optional> fields) { + this.fields = fields; + return this; + } + + public Builder fields(Map fields) { + this.fields = Optional.ofNullable(fields); + return this; + } + + /** + *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  + */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + public Builder tokens(Map tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

                                  Metadata for the uploaded file, keyed by dynamic column name.

                                  + */ + @JsonSetter(value = "fileMetadata", nulls = Nulls.SKIP) + public Builder fileMetadata(Optional> fileMetadata) { + this.fileMetadata = fileMetadata; + return this; + } + + public Builder fileMetadata(Map fileMetadata) { + this.fileMetadata = Optional.ofNullable(fileMetadata); + return this; + } + + public GetFieldRecords build() { + return new GetFieldRecords(fields, tokens, fileMetadata, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GetQueryResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetQueryResponse.java new file mode 100644 index 00000000..0b9baf81 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetQueryResponse.java @@ -0,0 +1,112 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetQueryResponse.Builder.class) +public final class GetQueryResponse { + private final Optional> records; + + private final Map additionalProperties; + + private GetQueryResponse(Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Records returned by the query. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetQueryResponse && equalTo((GetQueryResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetQueryResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GetQueryResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Records returned by the query.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public GetQueryResponse build() { + return new GetQueryResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GetRequestData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetRequestData.java new file mode 100644 index 00000000..dbe46db3 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetRequestData.java @@ -0,0 +1,324 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetRequestData.Builder.class) +public final class GetRequestData { + private final String tableName; + + private final List skyflowIDs; + + private final Optional> columnRedactions; + + private final Optional> columns; + + private final Optional> uniqueValues; + + private final Map additionalProperties; + + private GetRequestData( + String tableName, + List skyflowIDs, + Optional> columnRedactions, + Optional> columns, + Optional> uniqueValues, + Map additionalProperties) { + this.tableName = tableName; + this.skyflowIDs = skyflowIDs; + this.columnRedactions = columnRedactions; + this.columns = columns; + this.uniqueValues = uniqueValues; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Skyflow IDs of the records to return. + */ + @JsonProperty("skyflowIDs") + public List getSkyflowIDs() { + return skyflowIDs; + } + + /** + * @return List of columns to redact. + */ + @JsonProperty("columnRedactions") + public Optional> getColumnRedactions() { + return columnRedactions; + } + + /** + * @return List of columns to return. + */ + @JsonProperty("columns") + public Optional> getColumns() { + return columns; + } + + /** + * @return List of unique constraint values to query records by data. + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetRequestData && equalTo((GetRequestData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetRequestData other) { + return tableName.equals(other.tableName) + && skyflowIDs.equals(other.skyflowIDs) + && columnRedactions.equals(other.columnRedactions) + && columns.equals(other.columns) + && uniqueValues.equals(other.uniqueValues); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tableName, this.skyflowIDs, this.columnRedactions, this.columns, this.uniqueValues); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + + Builder from(GetRequestData other); + } + + public interface _FinalStage { + GetRequestData build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow IDs of the records to return.

                                  + */ + _FinalStage skyflowIDs(List skyflowIDs); + + _FinalStage addSkyflowIDs(String skyflowIDs); + + _FinalStage addAllSkyflowIDs(List skyflowIDs); + + /** + *

                                  List of columns to redact.

                                  + */ + _FinalStage columnRedactions(Optional> columnRedactions); + + _FinalStage columnRedactions(List columnRedactions); + + /** + *

                                  List of columns to return.

                                  + */ + _FinalStage columns(Optional> columns); + + _FinalStage columns(List columns); + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + _FinalStage uniqueValues(Optional> uniqueValues); + + _FinalStage uniqueValues(List uniqueValues); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, _FinalStage { + private String tableName; + + private Optional> uniqueValues = Optional.empty(); + + private Optional> columns = Optional.empty(); + + private Optional> columnRedactions = Optional.empty(); + + private List skyflowIDs = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetRequestData other) { + tableName(other.getTableName()); + skyflowIDs(other.getSkyflowIDs()); + columnRedactions(other.getColumnRedactions()); + columns(other.getColumns()); + uniqueValues(other.getUniqueValues()); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + @java.lang.Override + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public _FinalStage uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + /** + *

                                  List of columns to return.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage columns(List columns) { + this.columns = Optional.ofNullable(columns); + return this; + } + + /** + *

                                  List of columns to return.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public _FinalStage columns(Optional> columns) { + this.columns = columns; + return this; + } + + /** + *

                                  List of columns to redact.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage columnRedactions(List columnRedactions) { + this.columnRedactions = Optional.ofNullable(columnRedactions); + return this; + } + + /** + *

                                  List of columns to redact.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columnRedactions", nulls = Nulls.SKIP) + public _FinalStage columnRedactions(Optional> columnRedactions) { + this.columnRedactions = columnRedactions; + return this; + } + + /** + *

                                  Skyflow IDs of the records to return.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllSkyflowIDs(List skyflowIDs) { + if (skyflowIDs != null) { + this.skyflowIDs.addAll(skyflowIDs); + } + return this; + } + + /** + *

                                  Skyflow IDs of the records to return.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addSkyflowIDs(String skyflowIDs) { + this.skyflowIDs.add(skyflowIDs); + return this; + } + + /** + *

                                  Skyflow IDs of the records to return.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowIDs", nulls = Nulls.SKIP) + public _FinalStage skyflowIDs(List skyflowIDs) { + this.skyflowIDs.clear(); + if (skyflowIDs != null) { + this.skyflowIDs.addAll(skyflowIDs); + } + return this; + } + + @java.lang.Override + public GetRequestData build() { + return new GetRequestData( + tableName, skyflowIDs, columnRedactions, columns, uniqueValues, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GetResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetResponse.java new file mode 100644 index 00000000..fa49bbb4 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetResponse.Builder.class) +public final class GetResponse { + private final List records; + + private final Map additionalProperties; + + private GetResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of fetched records. For file columns, the value in the data map is an object containing: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (non-null only when fileStatus is FAILED), url (pre-signed download URL, non-null only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL). + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetResponse && equalTo((GetResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GetResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of fetched records. For file columns, the value in the data map is an object containing: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (non-null only when fileStatus is FAILED), url (pre-signed download URL, non-null only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL).

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(RecordResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public GetResponse build() { + return new GetResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesRequestObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesRequestObject.java new file mode 100644 index 00000000..c0fab010 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesRequestObject.java @@ -0,0 +1,151 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetTokensFromValuesRequestObject.Builder.class) +public final class GetTokensFromValuesRequestObject { + private final GoogleProtobufValue value; + + private final String tokenGroupName; + + private final Map additionalProperties; + + private GetTokensFromValuesRequestObject( + GoogleProtobufValue value, String tokenGroupName, Map additionalProperties) { + this.value = value; + this.tokenGroupName = tokenGroupName; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("value") + public GoogleProtobufValue getValue() { + return value; + } + + /** + * @return Name of the deterministic token group. + */ + @JsonProperty("tokenGroupName") + public String getTokenGroupName() { + return tokenGroupName; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetTokensFromValuesRequestObject && equalTo((GetTokensFromValuesRequestObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetTokensFromValuesRequestObject other) { + return value.equals(other.value) && tokenGroupName.equals(other.tokenGroupName); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.value, this.tokenGroupName); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static ValueStage builder() { + return new Builder(); + } + + public interface ValueStage { + TokenGroupNameStage value(@NotNull GoogleProtobufValue value); + + Builder from(GetTokensFromValuesRequestObject other); + } + + public interface TokenGroupNameStage { + /** + *

                                  Name of the deterministic token group.

                                  + */ + _FinalStage tokenGroupName(@NotNull String tokenGroupName); + } + + public interface _FinalStage { + GetTokensFromValuesRequestObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements ValueStage, TokenGroupNameStage, _FinalStage { + private GoogleProtobufValue value; + + private String tokenGroupName; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetTokensFromValuesRequestObject other) { + value(other.getValue()); + tokenGroupName(other.getTokenGroupName()); + return this; + } + + @java.lang.Override + @JsonSetter("value") + public TokenGroupNameStage value(@NotNull GoogleProtobufValue value) { + this.value = Objects.requireNonNull(value, "value must not be null"); + return this; + } + + /** + *

                                  Name of the deterministic token group.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tokenGroupName") + public _FinalStage tokenGroupName(@NotNull String tokenGroupName) { + this.tokenGroupName = Objects.requireNonNull(tokenGroupName, "tokenGroupName must not be null"); + return this; + } + + @java.lang.Override + public GetTokensFromValuesRequestObject build() { + return new GetTokensFromValuesRequestObject(value, tokenGroupName, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesResponse.java new file mode 100644 index 00000000..de800b47 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesResponse.java @@ -0,0 +1,123 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetTokensFromValuesResponse.Builder.class) +public final class GetTokensFromValuesResponse { + private final List records; + + private final Map additionalProperties; + + private GetTokensFromValuesResponse( + List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Array of token result objects, one per input entry, in the same order as the request. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetTokensFromValuesResponse && equalTo((GetTokensFromValuesResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetTokensFromValuesResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GetTokensFromValuesResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Array of token result objects, one per input entry, in the same order as the request.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(TokenizeResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public GetTokensFromValuesResponse build() { + return new GetTokensFromValuesResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GoogleProtobufValue.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GoogleProtobufValue.java new file mode 100644 index 00000000..0b0efc95 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GoogleProtobufValue.java @@ -0,0 +1,42 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.skyflow.generated.rest.core.WrappedAlias; + +public final class GoogleProtobufValue implements WrappedAlias { + private final Object value; + + private GoogleProtobufValue(Object value) { + this.value = value; + } + + @JsonValue + public Object get() { + return this.value; + } + + @java.lang.Override + public boolean equals(Object other) { + return this == other + || (other instanceof GoogleProtobufValue && this.value.equals(((GoogleProtobufValue) other).value)); + } + + @java.lang.Override + public int hashCode() { + return value.hashCode(); + } + + @java.lang.Override + public String toString() { + return value.toString(); + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static GoogleProtobufValue of(Object value) { + return new GoogleProtobufValue(value); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java deleted file mode 100644 index 55be5699..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java +++ /dev/null @@ -1,135 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = GooglerpcStatus.Builder.class) -public final class GooglerpcStatus { - private final Optional code; - - private final Optional message; - - private final Optional> details; - - private final Map additionalProperties; - - private GooglerpcStatus( - Optional code, - Optional message, - Optional> details, - Map additionalProperties) { - this.code = code; - this.message = message; - this.details = details; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("code") - public Optional getCode() { - return code; - } - - @JsonProperty("message") - public Optional getMessage() { - return message; - } - - @JsonProperty("details") - public Optional> getDetails() { - return details; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof GooglerpcStatus && equalTo((GooglerpcStatus) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(GooglerpcStatus other) { - return code.equals(other.code) && message.equals(other.message) && details.equals(other.details); - } - - @Override - public int hashCode() { - return Objects.hash(this.code, this.message, this.details); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional code = Optional.empty(); - - private Optional message = Optional.empty(); - - private Optional> details = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(GooglerpcStatus other) { - code(other.getCode()); - message(other.getMessage()); - details(other.getDetails()); - return this; - } - - @JsonSetter(value = "code", nulls = Nulls.SKIP) - public Builder code(Optional code) { - this.code = code; - return this; - } - - public Builder code(Integer code) { - this.code = Optional.ofNullable(code); - return this; - } - - @JsonSetter(value = "message", nulls = Nulls.SKIP) - public Builder message(Optional message) { - this.message = message; - return this; - } - - public Builder message(String message) { - this.message = Optional.ofNullable(message); - return this; - } - - @JsonSetter(value = "details", nulls = Nulls.SKIP) - public Builder details(Optional> details) { - this.details = details; - return this; - } - - public Builder details(List details) { - this.details = Optional.ofNullable(details); - return this; - } - - public GooglerpcStatus build() { - return new GooglerpcStatus(code, message, details, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java deleted file mode 100644 index c1bd23c6..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = IdentifyResponse.Builder.class) -public final class IdentifyResponse { - private final String text; - - private final Map additionalProperties; - - private IdentifyResponse(String text, Map additionalProperties) { - this.text = text; - this.additionalProperties = additionalProperties; - } - - /** - * @return Re-identified text. - */ - @JsonProperty("text") - public String getText() { - return text; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof IdentifyResponse && equalTo((IdentifyResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(IdentifyResponse other) { - return text.equals(other.text); - } - - @Override - public int hashCode() { - return Objects.hash(this.text); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static TextStage builder() { - return new Builder(); - } - - public interface TextStage { - /** - * Re-identified text. - */ - _FinalStage text(@NotNull String text); - - Builder from(IdentifyResponse other); - } - - public interface _FinalStage { - IdentifyResponse build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TextStage, _FinalStage { - private String text; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(IdentifyResponse other) { - text(other.getText()); - return this; - } - - /** - * Re-identified text.

                                  Re-identified text.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("text") - public _FinalStage text(@NotNull String text) { - this.text = Objects.requireNonNull(text, "text must not be null"); - return this; - } - - @Override - public IdentifyResponse build() { - return new IdentifyResponse(text, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordData.java new file mode 100644 index 00000000..0b0ea516 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordData.java @@ -0,0 +1,176 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = InsertRecordData.Builder.class) +public final class InsertRecordData { + private final Map data; + + private final Optional tableName; + + private final Optional upsert; + + private final Map additionalProperties; + + private InsertRecordData( + Map data, + Optional tableName, + Optional upsert, + Map additionalProperties) { + this.data = data; + this.tableName = tableName; + this.upsert = upsert; + this.additionalProperties = additionalProperties; + } + + /** + * @return Columns and values for the record. + */ + @JsonProperty("data") + public Map getData() { + return data; + } + + /** + * @return Name of the table to insert data into. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + @JsonProperty("upsert") + public Optional getUpsert() { + return upsert; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof InsertRecordData && equalTo((InsertRecordData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(InsertRecordData other) { + return data.equals(other.data) && tableName.equals(other.tableName) && upsert.equals(other.upsert); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.data, this.tableName, this.upsert); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Map data = new LinkedHashMap<>(); + + private Optional tableName = Optional.empty(); + + private Optional upsert = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(InsertRecordData other) { + data(other.getData()); + tableName(other.getTableName()); + upsert(other.getUpsert()); + return this; + } + + /** + *

                                  Columns and values for the record.

                                  + */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Map data) { + this.data.clear(); + if (data != null) { + this.data.putAll(data); + } + return this; + } + + public Builder putAllData(Map data) { + if (data != null) { + this.data.putAll(data); + } + return this; + } + + public Builder data(String key, Object value) { + this.data.put(key, value); + return this; + } + + /** + *

                                  Name of the table to insert data into.

                                  + */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + @JsonSetter(value = "upsert", nulls = Nulls.SKIP) + public Builder upsert(Optional upsert) { + this.upsert = upsert; + return this; + } + + public Builder upsert(Upsert upsert) { + this.upsert = Optional.ofNullable(upsert); + return this; + } + + public InsertRecordData build() { + return new InsertRecordData(data, tableName, upsert, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordResponse.java new file mode 100644 index 00000000..a38b5dc1 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordResponse.java @@ -0,0 +1,113 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = InsertRecordResponse.Builder.class) +public final class InsertRecordResponse { + private final Optional> records; + + private final Map additionalProperties; + + private InsertRecordResponse( + Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Inserted records. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof InsertRecordResponse && equalTo((InsertRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(InsertRecordResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(InsertRecordResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Inserted records.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public InsertRecordResponse build() { + return new InsertRecordResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertResponse.java new file mode 100644 index 00000000..63814444 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = InsertResponse.Builder.class) +public final class InsertResponse { + private final List records; + + private final Map additionalProperties; + + private InsertResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of inserted records. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof InsertResponse && equalTo((InsertResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(InsertResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(InsertResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of inserted records.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(RecordResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public InsertResponse build() { + return new InsertResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/Locations.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/Locations.java deleted file mode 100644 index 4b95c485..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/Locations.java +++ /dev/null @@ -1,188 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = Locations.Builder.class) -public final class Locations { - private final Optional startIndex; - - private final Optional endIndex; - - private final Optional startIndexProcessed; - - private final Optional endIndexProcessed; - - private final Map additionalProperties; - - private Locations( - Optional startIndex, - Optional endIndex, - Optional startIndexProcessed, - Optional endIndexProcessed, - Map additionalProperties) { - this.startIndex = startIndex; - this.endIndex = endIndex; - this.startIndexProcessed = startIndexProcessed; - this.endIndexProcessed = endIndexProcessed; - this.additionalProperties = additionalProperties; - } - - /** - * @return Index of the first character of the string in the original text. - */ - @JsonProperty("start_index") - public Optional getStartIndex() { - return startIndex; - } - - /** - * @return Index of the last character of the string in the original text. - */ - @JsonProperty("end_index") - public Optional getEndIndex() { - return endIndex; - } - - /** - * @return Index of the first character of the string in the processed text. - */ - @JsonProperty("start_index_processed") - public Optional getStartIndexProcessed() { - return startIndexProcessed; - } - - /** - * @return Index of the last character of the string in the processed text. - */ - @JsonProperty("end_index_processed") - public Optional getEndIndexProcessed() { - return endIndexProcessed; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof Locations && equalTo((Locations) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(Locations other) { - return startIndex.equals(other.startIndex) - && endIndex.equals(other.endIndex) - && startIndexProcessed.equals(other.startIndexProcessed) - && endIndexProcessed.equals(other.endIndexProcessed); - } - - @Override - public int hashCode() { - return Objects.hash(this.startIndex, this.endIndex, this.startIndexProcessed, this.endIndexProcessed); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional startIndex = Optional.empty(); - - private Optional endIndex = Optional.empty(); - - private Optional startIndexProcessed = Optional.empty(); - - private Optional endIndexProcessed = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(Locations other) { - startIndex(other.getStartIndex()); - endIndex(other.getEndIndex()); - startIndexProcessed(other.getStartIndexProcessed()); - endIndexProcessed(other.getEndIndexProcessed()); - return this; - } - - /** - *

                                  Index of the first character of the string in the original text.

                                  - */ - @JsonSetter(value = "start_index", nulls = Nulls.SKIP) - public Builder startIndex(Optional startIndex) { - this.startIndex = startIndex; - return this; - } - - public Builder startIndex(Integer startIndex) { - this.startIndex = Optional.ofNullable(startIndex); - return this; - } - - /** - *

                                  Index of the last character of the string in the original text.

                                  - */ - @JsonSetter(value = "end_index", nulls = Nulls.SKIP) - public Builder endIndex(Optional endIndex) { - this.endIndex = endIndex; - return this; - } - - public Builder endIndex(Integer endIndex) { - this.endIndex = Optional.ofNullable(endIndex); - return this; - } - - /** - *

                                  Index of the first character of the string in the processed text.

                                  - */ - @JsonSetter(value = "start_index_processed", nulls = Nulls.SKIP) - public Builder startIndexProcessed(Optional startIndexProcessed) { - this.startIndexProcessed = startIndexProcessed; - return this; - } - - public Builder startIndexProcessed(Integer startIndexProcessed) { - this.startIndexProcessed = Optional.ofNullable(startIndexProcessed); - return this; - } - - /** - *

                                  Index of the last character of the string in the processed text.

                                  - */ - @JsonSetter(value = "end_index_processed", nulls = Nulls.SKIP) - public Builder endIndexProcessed(Optional endIndexProcessed) { - this.endIndexProcessed = endIndexProcessed; - return this; - } - - public Builder endIndexProcessed(Integer endIndexProcessed) { - this.endIndexProcessed = Optional.ofNullable(endIndexProcessed); - return this; - } - - public Locations build() { - return new Locations(startIndex, endIndex, startIndexProcessed, endIndexProcessed, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java deleted file mode 100644 index 40e73b99..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ProtobufAny.Builder.class) -public final class ProtobufAny { - private final Optional type; - - private final Map additionalProperties; - - private ProtobufAny(Optional type, Map additionalProperties) { - this.type = type; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("@type") - public Optional getType() { - return type; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ProtobufAny && equalTo((ProtobufAny) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ProtobufAny other) { - return type.equals(other.type); - } - - @Override - public int hashCode() { - return Objects.hash(this.type); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional type = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ProtobufAny other) { - type(other.getType()); - return this; - } - - @JsonSetter(value = "@type", nulls = Nulls.SKIP) - public Builder type(Optional type) { - this.type = type; - return this; - } - - public Builder type(String type) { - this.type = Optional.ofNullable(type); - return this; - } - - public ProtobufAny build() { - return new ProtobufAny(type, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordMetaProperties.java similarity index 70% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/RecordMetaProperties.java index 17f77df6..d6c890d5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordMetaProperties.java @@ -3,25 +3,30 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1RecordMetaProperties.Builder.class) -public final class V1RecordMetaProperties { +@JsonDeserialize(builder = RecordMetaProperties.Builder.class) +public final class RecordMetaProperties { private final Optional skyflowId; private final Optional> tokens; private final Map additionalProperties; - private V1RecordMetaProperties( + private RecordMetaProperties( Optional skyflowId, Optional> tokens, Map additionalProperties) { @@ -46,10 +51,10 @@ public Optional> getTokens() { return tokens; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1RecordMetaProperties && equalTo((V1RecordMetaProperties) other); + return other instanceof RecordMetaProperties && equalTo((RecordMetaProperties) other); } @JsonAnyGetter @@ -57,16 +62,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1RecordMetaProperties other) { + private boolean equalTo(RecordMetaProperties other) { return skyflowId.equals(other.skyflowId) && tokens.equals(other.tokens); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowId, this.tokens); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -86,7 +91,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1RecordMetaProperties other) { + public Builder from(RecordMetaProperties other) { skyflowId(other.getSkyflowId()); tokens(other.getTokens()); return this; @@ -120,8 +125,18 @@ public Builder tokens(Map tokens) { return this; } - public V1RecordMetaProperties build() { - return new V1RecordMetaProperties(skyflowId, tokens, additionalProperties); + public RecordMetaProperties build() { + return new RecordMetaProperties(skyflowId, tokens, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordResponseObject.java new file mode 100644 index 00000000..a00428e2 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordResponseObject.java @@ -0,0 +1,448 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.Nullable; +import com.skyflow.generated.rest.core.NullableNonemptyFilter; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = RecordResponseObject.Builder.class) +public final class RecordResponseObject { + private final Optional skyflowId; + + private final Optional> tokens; + + private final Optional> data; + + private final Optional> hashedData; + + private final Optional error; + + private final int httpCode; + + private final Optional tableName; + + private final Map additionalProperties; + + private RecordResponseObject( + Optional skyflowId, + Optional> tokens, + Optional> data, + Optional> hashedData, + Optional error, + int httpCode, + Optional tableName, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.tokens = tokens; + this.data = data; + this.hashedData = hashedData; + this.error = error; + this.httpCode = httpCode; + this.tableName = tableName; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID for the inserted record + */ + @JsonIgnore + public Optional getSkyflowId() { + if (skyflowId == null) { + return Optional.empty(); + } + return skyflowId; + } + + /** + * @return Columns and tokens for the record. + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return Columns and values for the record. For file columns, the value is an object containing file metadata: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (populated only when fileStatus is FAILED), url (pre-signed download URL, populated only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL). + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + /** + * @return Columns and hashed values for the record. + */ + @JsonProperty("hashedData") + public Optional> getHashedData() { + return hashedData; + } + + /** + * @return Error message, if any. + */ + @JsonIgnore + public Optional getError() { + if (error == null) { + return Optional.empty(); + } + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public int getHttpCode() { + return httpCode; + } + + /** + * @return Name of the table that the record belongs to. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NullableNonemptyFilter.class) + @JsonProperty("skyflowID") + private Optional _getSkyflowId() { + return skyflowId; + } + + @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NullableNonemptyFilter.class) + @JsonProperty("error") + private Optional _getError() { + return error; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof RecordResponseObject && equalTo((RecordResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(RecordResponseObject other) { + return skyflowId.equals(other.skyflowId) + && tokens.equals(other.tokens) + && data.equals(other.data) + && hashedData.equals(other.hashedData) + && error.equals(other.error) + && httpCode == other.httpCode + && tableName.equals(other.tableName); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash( + this.skyflowId, this.tokens, this.data, this.hashedData, this.error, this.httpCode, this.tableName); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static HttpCodeStage builder() { + return new Builder(); + } + + public interface HttpCodeStage { + /** + *

                                  HTTP status code of the response.

                                  + */ + _FinalStage httpCode(int httpCode); + + Builder from(RecordResponseObject other); + } + + public interface _FinalStage { + RecordResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow ID for the inserted record

                                  + */ + _FinalStage skyflowId(Optional skyflowId); + + _FinalStage skyflowId(String skyflowId); + + _FinalStage skyflowId(Nullable skyflowId); + + /** + *

                                  Columns and tokens for the record.

                                  + */ + _FinalStage tokens(Optional> tokens); + + _FinalStage tokens(Map tokens); + + /** + *

                                  Columns and values for the record. For file columns, the value is an object containing file metadata: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (populated only when fileStatus is FAILED), url (pre-signed download URL, populated only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL).

                                  + */ + _FinalStage data(Optional> data); + + _FinalStage data(Map data); + + /** + *

                                  Columns and hashed values for the record.

                                  + */ + _FinalStage hashedData(Optional> hashedData); + + _FinalStage hashedData(Map hashedData); + + /** + *

                                  Error message, if any.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + + _FinalStage error(Nullable error); + + /** + *

                                  Name of the table that the record belongs to.

                                  + */ + _FinalStage tableName(Optional tableName); + + _FinalStage tableName(String tableName); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements HttpCodeStage, _FinalStage { + private int httpCode; + + private Optional tableName = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional> hashedData = Optional.empty(); + + private Optional> data = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional skyflowId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(RecordResponseObject other) { + skyflowId(other.getSkyflowId()); + tokens(other.getTokens()); + data(other.getData()); + hashedData(other.getHashedData()); + error(other.getError()); + httpCode(other.getHttpCode()); + tableName(other.getTableName()); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("httpCode") + public _FinalStage httpCode(int httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Name of the table that the record belongs to.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

                                  Name of the table that the record belongs to.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public _FinalStage tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(Nullable error) { + if (error.isNull()) { + this.error = null; + } else if (error.isEmpty()) { + this.error = Optional.empty(); + } else { + this.error = Optional.of(error.get()); + } + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Columns and hashed values for the record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage hashedData(Map hashedData) { + this.hashedData = Optional.ofNullable(hashedData); + return this; + } + + /** + *

                                  Columns and hashed values for the record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "hashedData", nulls = Nulls.SKIP) + public _FinalStage hashedData(Optional> hashedData) { + this.hashedData = hashedData; + return this; + } + + /** + *

                                  Columns and values for the record. For file columns, the value is an object containing file metadata: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (populated only when fileStatus is FAILED), url (pre-signed download URL, populated only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL).

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

                                  Columns and values for the record. For file columns, the value is an object containing file metadata: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (populated only when fileStatus is FAILED), url (pre-signed download URL, populated only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL).

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(Optional> data) { + this.data = data; + return this; + } + + /** + *

                                  Columns and tokens for the record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokens(Map tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

                                  Columns and tokens for the record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public _FinalStage tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + /** + *

                                  Skyflow ID for the inserted record

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(Nullable skyflowId) { + if (skyflowId.isNull()) { + this.skyflowId = null; + } else if (skyflowId.isEmpty()) { + this.skyflowId = Optional.empty(); + } else { + this.skyflowId = Optional.of(skyflowId.get()); + } + return this; + } + + /** + *

                                  Skyflow ID for the inserted record

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

                                  Skyflow ID for the inserted record

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public _FinalStage skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + @java.lang.Override + public RecordResponseObject build() { + return new RecordResponseObject( + skyflowId, tokens, data, hashedData, error, httpCode, tableName, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java deleted file mode 100644 index 88022df8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RedactionEnumRedaction { - DEFAULT("DEFAULT"), - - REDACTED("REDACTED"), - - MASKED("MASKED"), - - PLAIN_TEXT("PLAIN_TEXT"); - - private final String value; - - RedactionEnumRedaction(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java deleted file mode 100644 index a12660cb..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ReidentifiedFileOutput.Builder.class) -public final class ReidentifiedFileOutput { - private final Optional processedFile; - - private final Optional processedFileType; - - private final Optional processedFileExtension; - - private final Map additionalProperties; - - private ReidentifiedFileOutput( - Optional processedFile, - Optional processedFileType, - Optional processedFileExtension, - Map additionalProperties) { - this.processedFile = processedFile; - this.processedFileType = processedFileType; - this.processedFileExtension = processedFileExtension; - this.additionalProperties = additionalProperties; - } - - /** - * @return File content in Base64 format. - */ - @JsonProperty("processed_file") - public Optional getProcessedFile() { - return processedFile; - } - - /** - * @return Type of the processed file. - */ - @JsonProperty("processed_file_type") - public Optional getProcessedFileType() { - return processedFileType; - } - - /** - * @return Extension of the processed file. - */ - @JsonProperty("processed_file_extension") - public Optional getProcessedFileExtension() { - return processedFileExtension; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ReidentifiedFileOutput && equalTo((ReidentifiedFileOutput) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ReidentifiedFileOutput other) { - return processedFile.equals(other.processedFile) - && processedFileType.equals(other.processedFileType) - && processedFileExtension.equals(other.processedFileExtension); - } - - @Override - public int hashCode() { - return Objects.hash(this.processedFile, this.processedFileType, this.processedFileExtension); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional processedFile = Optional.empty(); - - private Optional processedFileType = Optional.empty(); - - private Optional processedFileExtension = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ReidentifiedFileOutput other) { - processedFile(other.getProcessedFile()); - processedFileType(other.getProcessedFileType()); - processedFileExtension(other.getProcessedFileExtension()); - return this; - } - - /** - *

                                  File content in Base64 format.

                                  - */ - @JsonSetter(value = "processed_file", nulls = Nulls.SKIP) - public Builder processedFile(Optional processedFile) { - this.processedFile = processedFile; - return this; - } - - public Builder processedFile(String processedFile) { - this.processedFile = Optional.ofNullable(processedFile); - return this; - } - - /** - *

                                  Type of the processed file.

                                  - */ - @JsonSetter(value = "processed_file_type", nulls = Nulls.SKIP) - public Builder processedFileType(Optional processedFileType) { - this.processedFileType = processedFileType; - return this; - } - - public Builder processedFileType(String processedFileType) { - this.processedFileType = Optional.ofNullable(processedFileType); - return this; - } - - /** - *

                                  Extension of the processed file.

                                  - */ - @JsonSetter(value = "processed_file_extension", nulls = Nulls.SKIP) - public Builder processedFileExtension( - Optional processedFileExtension) { - this.processedFileExtension = processedFileExtension; - return this; - } - - public Builder processedFileExtension(ReidentifiedFileOutputProcessedFileExtension processedFileExtension) { - this.processedFileExtension = Optional.ofNullable(processedFileExtension); - return this; - } - - public ReidentifiedFileOutput build() { - return new ReidentifiedFileOutput( - processedFile, processedFileType, processedFileExtension, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java deleted file mode 100644 index b99612e2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ReidentifiedFileOutputProcessedFileExtension { - MP_3("mp3"), - - WAV("wav"), - - PDF("pdf"), - - TXT("txt"), - - CSV("csv"), - - JSON("json"), - - JPG("jpg"), - - JPEG("jpeg"), - - TIF("tif"), - - TIFF("tiff"), - - PNG("png"), - - BMP("bmp"), - - XLS("xls"), - - XLSX("xlsx"), - - DOC("doc"), - - DOCX("docx"), - - PPT("ppt"), - - PPTX("pptx"), - - XML("xml"), - - DCM("dcm"); - - private final String value; - - ReidentifiedFileOutputProcessedFileExtension(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java deleted file mode 100644 index b7bc22ca..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ReidentifyFileResponse.Builder.class) -public final class ReidentifyFileResponse { - private final Optional status; - - private final Optional outputType; - - private final Optional output; - - private final Map additionalProperties; - - private ReidentifyFileResponse( - Optional status, - Optional outputType, - Optional output, - Map additionalProperties) { - this.status = status; - this.outputType = outputType; - this.output = output; - this.additionalProperties = additionalProperties; - } - - /** - * @return Status of the operation. - */ - @JsonProperty("status") - public Optional getStatus() { - return status; - } - - /** - * @return Format of the output file. - */ - @JsonProperty("output_type") - public Optional getOutputType() { - return outputType; - } - - @JsonProperty("output") - public Optional getOutput() { - return output; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ReidentifyFileResponse && equalTo((ReidentifyFileResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ReidentifyFileResponse other) { - return status.equals(other.status) && outputType.equals(other.outputType) && output.equals(other.output); - } - - @Override - public int hashCode() { - return Objects.hash(this.status, this.outputType, this.output); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional status = Optional.empty(); - - private Optional outputType = Optional.empty(); - - private Optional output = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ReidentifyFileResponse other) { - status(other.getStatus()); - outputType(other.getOutputType()); - output(other.getOutput()); - return this; - } - - /** - *

                                  Status of the operation.

                                  - */ - @JsonSetter(value = "status", nulls = Nulls.SKIP) - public Builder status(Optional status) { - this.status = status; - return this; - } - - public Builder status(ReidentifyFileResponseStatus status) { - this.status = Optional.ofNullable(status); - return this; - } - - /** - *

                                  Format of the output file.

                                  - */ - @JsonSetter(value = "output_type", nulls = Nulls.SKIP) - public Builder outputType(Optional outputType) { - this.outputType = outputType; - return this; - } - - public Builder outputType(ReidentifyFileResponseOutputType outputType) { - this.outputType = Optional.ofNullable(outputType); - return this; - } - - @JsonSetter(value = "output", nulls = Nulls.SKIP) - public Builder output(Optional output) { - this.output = output; - return this; - } - - public Builder output(ReidentifiedFileOutput output) { - this.output = Optional.ofNullable(output); - return this; - } - - public ReidentifyFileResponse build() { - return new ReidentifyFileResponse(status, outputType, output, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java deleted file mode 100644 index 342e3d93..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ReidentifyFileResponseOutputType { - UNKNOWN("UNKNOWN"), - - BASE_64("BASE64"); - - private final String value; - - ReidentifyFileResponseOutputType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java deleted file mode 100644 index 2b6aaa85..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ReidentifyFileResponseStatus { - UNKNOWN("UNKNOWN"), - - FAILED("FAILED"), - - SUCCESS("SUCCESS"), - - IN_PROGRESS("IN_PROGRESS"); - - private final String value; - - ReidentifyFileResponseStatus(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java deleted file mode 100644 index ad0a32a7..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RequestActionType { - NONE("NONE"), - - ASSIGN("ASSIGN"), - - CREATE("CREATE"), - - DELETE("DELETE"), - - EXECUTE("EXECUTE"), - - LIST("LIST"), - - READ("READ"), - - UNASSIGN("UNASSIGN"), - - UPDATE("UPDATE"), - - VALIDATE("VALIDATE"), - - LOGIN("LOGIN"), - - ROTATE("ROTATE"), - - SCHEDULEROTATION("SCHEDULEROTATION"), - - SCHEDULEROTATIONALERT("SCHEDULEROTATIONALERT"), - - IMPORT("IMPORT"), - - GETIMPORTPARAMETERS("GETIMPORTPARAMETERS"), - - PING("PING"), - - GETCLOUDPROVIDER("GETCLOUDPROVIDER"); - - private final String value; - - RequestActionType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java deleted file mode 100644 index 37ef8cdf..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java +++ /dev/null @@ -1,153 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ShiftDates.Builder.class) -public final class ShiftDates { - private final Optional minDays; - - private final Optional maxDays; - - private final Optional> entityTypes; - - private final Map additionalProperties; - - private ShiftDates( - Optional minDays, - Optional maxDays, - Optional> entityTypes, - Map additionalProperties) { - this.minDays = minDays; - this.maxDays = maxDays; - this.entityTypes = entityTypes; - this.additionalProperties = additionalProperties; - } - - /** - * @return Minimum number of days to shift the date by. - */ - @JsonProperty("min_days") - public Optional getMinDays() { - return minDays; - } - - /** - * @return Maximum number of days to shift the date by. - */ - @JsonProperty("max_days") - public Optional getMaxDays() { - return maxDays; - } - - /** - * @return Entity types to shift dates for. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ShiftDates && equalTo((ShiftDates) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ShiftDates other) { - return minDays.equals(other.minDays) && maxDays.equals(other.maxDays) && entityTypes.equals(other.entityTypes); - } - - @Override - public int hashCode() { - return Objects.hash(this.minDays, this.maxDays, this.entityTypes); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional minDays = Optional.empty(); - - private Optional maxDays = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ShiftDates other) { - minDays(other.getMinDays()); - maxDays(other.getMaxDays()); - entityTypes(other.getEntityTypes()); - return this; - } - - /** - *

                                  Minimum number of days to shift the date by.

                                  - */ - @JsonSetter(value = "min_days", nulls = Nulls.SKIP) - public Builder minDays(Optional minDays) { - this.minDays = minDays; - return this; - } - - public Builder minDays(Integer minDays) { - this.minDays = Optional.ofNullable(minDays); - return this; - } - - /** - *

                                  Maximum number of days to shift the date by.

                                  - */ - @JsonSetter(value = "max_days", nulls = Nulls.SKIP) - public Builder maxDays(Optional maxDays) { - this.maxDays = maxDays; - return this; - } - - public Builder maxDays(Integer maxDays) { - this.maxDays = Optional.ofNullable(maxDays); - return this; - } - - /** - *

                                  Entity types to shift dates for.

                                  - */ - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public Builder entityTypes(Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - public Builder entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - public ShiftDates build() { - return new ShiftDates(minDays, maxDays, entityTypes, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java deleted file mode 100644 index a2fb5e64..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ShiftDatesEntityTypesItem { - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"); - - private final String value; - - ShiftDatesEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java deleted file mode 100644 index 78df8838..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java +++ /dev/null @@ -1,212 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = StringResponseEntities.Builder.class) -public final class StringResponseEntities { - private final Optional token; - - private final Optional value; - - private final Optional location; - - private final Optional entityType; - - private final Optional> entityScores; - - private final Map additionalProperties; - - private StringResponseEntities( - Optional token, - Optional value, - Optional location, - Optional entityType, - Optional> entityScores, - Map additionalProperties) { - this.token = token; - this.value = value; - this.location = location; - this.entityType = entityType; - this.entityScores = entityScores; - this.additionalProperties = additionalProperties; - } - - /** - * @return Processed text of the entity. - */ - @JsonProperty("token") - public Optional getToken() { - return token; - } - - /** - * @return Original text of the entity. - */ - @JsonProperty("value") - public Optional getValue() { - return value; - } - - @JsonProperty("location") - public Optional getLocation() { - return location; - } - - /** - * @return Highest-rated label. - */ - @JsonProperty("entity_type") - public Optional getEntityType() { - return entityType; - } - - /** - * @return Labels and their scores. - */ - @JsonProperty("entity_scores") - public Optional> getEntityScores() { - return entityScores; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof StringResponseEntities && equalTo((StringResponseEntities) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(StringResponseEntities other) { - return token.equals(other.token) - && value.equals(other.value) - && location.equals(other.location) - && entityType.equals(other.entityType) - && entityScores.equals(other.entityScores); - } - - @Override - public int hashCode() { - return Objects.hash(this.token, this.value, this.location, this.entityType, this.entityScores); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional token = Optional.empty(); - - private Optional value = Optional.empty(); - - private Optional location = Optional.empty(); - - private Optional entityType = Optional.empty(); - - private Optional> entityScores = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(StringResponseEntities other) { - token(other.getToken()); - value(other.getValue()); - location(other.getLocation()); - entityType(other.getEntityType()); - entityScores(other.getEntityScores()); - return this; - } - - /** - *

                                  Processed text of the entity.

                                  - */ - @JsonSetter(value = "token", nulls = Nulls.SKIP) - public Builder token(Optional token) { - this.token = token; - return this; - } - - public Builder token(String token) { - this.token = Optional.ofNullable(token); - return this; - } - - /** - *

                                  Original text of the entity.

                                  - */ - @JsonSetter(value = "value", nulls = Nulls.SKIP) - public Builder value(Optional value) { - this.value = value; - return this; - } - - public Builder value(String value) { - this.value = Optional.ofNullable(value); - return this; - } - - @JsonSetter(value = "location", nulls = Nulls.SKIP) - public Builder location(Optional location) { - this.location = location; - return this; - } - - public Builder location(Locations location) { - this.location = Optional.ofNullable(location); - return this; - } - - /** - *

                                  Highest-rated label.

                                  - */ - @JsonSetter(value = "entity_type", nulls = Nulls.SKIP) - public Builder entityType(Optional entityType) { - this.entityType = entityType; - return this; - } - - public Builder entityType(String entityType) { - this.entityType = Optional.ofNullable(entityType); - return this; - } - - /** - *

                                  Labels and their scores.

                                  - */ - @JsonSetter(value = "entity_scores", nulls = Nulls.SKIP) - public Builder entityScores(Optional> entityScores) { - this.entityScores = entityScores; - return this; - } - - public Builder entityScores(Map entityScores) { - this.entityScores = Optional.ofNullable(entityScores); - return this; - } - - public StringResponseEntities build() { - return new StringResponseEntities(token, value, location, entityType, entityScores, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenGroupRedactions.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenGroupRedactions.java new file mode 100644 index 00000000..a05b6681 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenGroupRedactions.java @@ -0,0 +1,140 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenGroupRedactions.Builder.class) +public final class TokenGroupRedactions { + private final Optional tokenGroupName; + + private final Optional redaction; + + private final Map additionalProperties; + + private TokenGroupRedactions( + Optional tokenGroupName, Optional redaction, Map additionalProperties) { + this.tokenGroupName = tokenGroupName; + this.redaction = redaction; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the token group to redact. + */ + @JsonProperty("tokenGroupName") + public Optional getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Name of the redaction to perform. + */ + @JsonProperty("redaction") + public Optional getRedaction() { + return redaction; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenGroupRedactions && equalTo((TokenGroupRedactions) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenGroupRedactions other) { + return tokenGroupName.equals(other.tokenGroupName) && redaction.equals(other.redaction); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tokenGroupName, this.redaction); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional tokenGroupName = Optional.empty(); + + private Optional redaction = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(TokenGroupRedactions other) { + tokenGroupName(other.getTokenGroupName()); + redaction(other.getRedaction()); + return this; + } + + /** + *

                                  Name of the token group to redact.

                                  + */ + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public Builder tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + public Builder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

                                  Name of the redaction to perform.

                                  + */ + @JsonSetter(value = "redaction", nulls = Nulls.SKIP) + public Builder redaction(Optional redaction) { + this.redaction = redaction; + return this; + } + + public Builder redaction(String redaction) { + this.redaction = Optional.ofNullable(redaction); + return this; + } + + public TokenGroupRedactions build() { + return new TokenGroupRedactions(tokenGroupName, redaction, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java deleted file mode 100644 index b703895d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java +++ /dev/null @@ -1,185 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = TokenTypeMapping.Builder.class) -public final class TokenTypeMapping { - private final Optional> vaultToken; - - private final Optional> entityOnly; - - private final Optional> entityUnqCounter; - - private final Optional default_; - - private final Map additionalProperties; - - private TokenTypeMapping( - Optional> vaultToken, - Optional> entityOnly, - Optional> entityUnqCounter, - Optional default_, - Map additionalProperties) { - this.vaultToken = vaultToken; - this.entityOnly = entityOnly; - this.entityUnqCounter = entityUnqCounter; - this.default_ = default_; - this.additionalProperties = additionalProperties; - } - - /** - * @return Entity types to replace with vault tokens. - */ - @JsonProperty("vault_token") - public Optional> getVaultToken() { - return vaultToken; - } - - /** - * @return Entity types to replace with entity tokens. - */ - @JsonProperty("entity_only") - public Optional> getEntityOnly() { - return entityOnly; - } - - /** - * @return Entity types to replace with entity tokens with unique counters. - */ - @JsonProperty("entity_unq_counter") - public Optional> getEntityUnqCounter() { - return entityUnqCounter; - } - - /** - * @return Default token type to generate for detected entities. - */ - @JsonProperty("default") - public Optional getDefault() { - return default_; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof TokenTypeMapping && equalTo((TokenTypeMapping) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(TokenTypeMapping other) { - return vaultToken.equals(other.vaultToken) - && entityOnly.equals(other.entityOnly) - && entityUnqCounter.equals(other.entityUnqCounter) - && default_.equals(other.default_); - } - - @Override - public int hashCode() { - return Objects.hash(this.vaultToken, this.entityOnly, this.entityUnqCounter, this.default_); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> vaultToken = Optional.empty(); - - private Optional> entityOnly = Optional.empty(); - - private Optional> entityUnqCounter = Optional.empty(); - - private Optional default_ = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(TokenTypeMapping other) { - vaultToken(other.getVaultToken()); - entityOnly(other.getEntityOnly()); - entityUnqCounter(other.getEntityUnqCounter()); - default_(other.getDefault()); - return this; - } - - /** - *

                                  Entity types to replace with vault tokens.

                                  - */ - @JsonSetter(value = "vault_token", nulls = Nulls.SKIP) - public Builder vaultToken(Optional> vaultToken) { - this.vaultToken = vaultToken; - return this; - } - - public Builder vaultToken(List vaultToken) { - this.vaultToken = Optional.ofNullable(vaultToken); - return this; - } - - /** - *

                                  Entity types to replace with entity tokens.

                                  - */ - @JsonSetter(value = "entity_only", nulls = Nulls.SKIP) - public Builder entityOnly(Optional> entityOnly) { - this.entityOnly = entityOnly; - return this; - } - - public Builder entityOnly(List entityOnly) { - this.entityOnly = Optional.ofNullable(entityOnly); - return this; - } - - /** - *

                                  Entity types to replace with entity tokens with unique counters.

                                  - */ - @JsonSetter(value = "entity_unq_counter", nulls = Nulls.SKIP) - public Builder entityUnqCounter(Optional> entityUnqCounter) { - this.entityUnqCounter = entityUnqCounter; - return this; - } - - public Builder entityUnqCounter(List entityUnqCounter) { - this.entityUnqCounter = Optional.ofNullable(entityUnqCounter); - return this; - } - - /** - *

                                  Default token type to generate for detected entities.

                                  - */ - @JsonSetter(value = "default", nulls = Nulls.SKIP) - public Builder default_(Optional default_) { - this.default_ = default_; - return this; - } - - public Builder default_(TokenTypeMappingDefault default_) { - this.default_ = Optional.ofNullable(default_); - return this; - } - - public TokenTypeMapping build() { - return new TokenTypeMapping(vaultToken, entityOnly, entityUnqCounter, default_, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java deleted file mode 100644 index 17893bad..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TokenTypeMappingDefault { - ENTITY_UNQ_COUNTER("entity_unq_counter"), - - ENTITY_ONLY("entity_only"), - - VAULT_TOKEN("vault_token"); - - private final String value; - - TokenTypeMappingDefault(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java deleted file mode 100644 index c1daa680..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TokenTypeMappingEntityOnlyItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - TokenTypeMappingEntityOnlyItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java deleted file mode 100644 index 6fcf08a9..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TokenTypeMappingEntityUnqCounterItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - TokenTypeMappingEntityUnqCounterItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java deleted file mode 100644 index 1ffe9a26..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TokenTypeMappingVaultTokenItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - TokenTypeMappingVaultTokenItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordRequest.java new file mode 100644 index 00000000..764f5af5 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordRequest.java @@ -0,0 +1,203 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeRecordRequest.Builder.class) +public final class TokenizeRecordRequest { + private final Optional value; + + private final Optional table; + + private final Optional column; + + private final Optional columnGroup; + + private final Map additionalProperties; + + private TokenizeRecordRequest( + Optional value, + Optional table, + Optional column, + Optional columnGroup, + Map additionalProperties) { + this.value = value; + this.table = table; + this.column = column; + this.columnGroup = columnGroup; + this.additionalProperties = additionalProperties; + } + + /** + * @return Existing value to return a token for. Must be specified with either columnGroup or both table and column. + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Name of the table that the value belongs to. Must be specified with column. Can't be specified with columnGroup. + */ + @JsonProperty("table") + public Optional getTable() { + return table; + } + + /** + * @return Name of the column that the value belongs to. Must be specified with table. Can't be specified with columnGroup. + */ + @JsonProperty("column") + public Optional getColumn() { + return column; + } + + /** + * @return Name of the column group that the value belongs to. Can't be specified with table or column. + */ + @JsonProperty("columnGroup") + public Optional getColumnGroup() { + return columnGroup; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeRecordRequest && equalTo((TokenizeRecordRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeRecordRequest other) { + return value.equals(other.value) + && table.equals(other.table) + && column.equals(other.column) + && columnGroup.equals(other.columnGroup); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.value, this.table, this.column, this.columnGroup); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional value = Optional.empty(); + + private Optional table = Optional.empty(); + + private Optional column = Optional.empty(); + + private Optional columnGroup = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(TokenizeRecordRequest other) { + value(other.getValue()); + table(other.getTable()); + column(other.getColumn()); + columnGroup(other.getColumnGroup()); + return this; + } + + /** + *

                                  Existing value to return a token for. Must be specified with either columnGroup or both table and column.

                                  + */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(String value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

                                  Name of the table that the value belongs to. Must be specified with column. Can't be specified with columnGroup.

                                  + */ + @JsonSetter(value = "table", nulls = Nulls.SKIP) + public Builder table(Optional table) { + this.table = table; + return this; + } + + public Builder table(String table) { + this.table = Optional.ofNullable(table); + return this; + } + + /** + *

                                  Name of the column that the value belongs to. Must be specified with table. Can't be specified with columnGroup.

                                  + */ + @JsonSetter(value = "column", nulls = Nulls.SKIP) + public Builder column(Optional column) { + this.column = column; + return this; + } + + public Builder column(String column) { + this.column = Optional.ofNullable(column); + return this; + } + + /** + *

                                  Name of the column group that the value belongs to. Can't be specified with table or column.

                                  + */ + @JsonSetter(value = "columnGroup", nulls = Nulls.SKIP) + public Builder columnGroup(Optional columnGroup) { + this.columnGroup = columnGroup; + return this; + } + + public Builder columnGroup(String columnGroup) { + this.columnGroup = Optional.ofNullable(columnGroup); + return this; + } + + public TokenizeRecordRequest build() { + return new TokenizeRecordRequest(value, table, column, columnGroup, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordResponse.java new file mode 100644 index 00000000..9de12f17 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordResponse.java @@ -0,0 +1,128 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeRecordResponse.Builder.class) +public final class TokenizeRecordResponse { + private final String token; + + private final Map additionalProperties; + + private TokenizeRecordResponse(String token, Map additionalProperties) { + this.token = token; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token corresponding to a value. + */ + @JsonProperty("token") + public String getToken() { + return token; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeRecordResponse && equalTo((TokenizeRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeRecordResponse other) { + return token.equals(other.token); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.token); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TokenStage builder() { + return new Builder(); + } + + public interface TokenStage { + /** + *

                                  Token corresponding to a value.

                                  + */ + _FinalStage token(@NotNull String token); + + Builder from(TokenizeRecordResponse other); + } + + public interface _FinalStage { + TokenizeRecordResponse build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TokenStage, _FinalStage { + private String token; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(TokenizeRecordResponse other) { + token(other.getToken()); + return this; + } + + /** + *

                                  Token corresponding to a value.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("token") + public _FinalStage token(@NotNull String token) { + this.token = Objects.requireNonNull(token, "token must not be null"); + return this; + } + + @java.lang.Override + public TokenizeRecordResponse build() { + return new TokenizeRecordResponse(token, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRequestObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRequestObject.java new file mode 100644 index 00000000..6cffce95 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRequestObject.java @@ -0,0 +1,212 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeRequestObject.Builder.class) +public final class TokenizeRequestObject { + private final GoogleProtobufValue value; + + private final List tokenGroupNames; + + private final Optional token; + + private final Map additionalProperties; + + private TokenizeRequestObject( + GoogleProtobufValue value, + List tokenGroupNames, + Optional token, + Map additionalProperties) { + this.value = value; + this.tokenGroupNames = tokenGroupNames; + this.token = token; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("value") + public GoogleProtobufValue getValue() { + return value; + } + + /** + * @return Names of token groups the value might be present in. + */ + @JsonProperty("tokenGroupNames") + public List getTokenGroupNames() { + return tokenGroupNames; + } + + @JsonProperty("token") + public Optional getToken() { + return token; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeRequestObject && equalTo((TokenizeRequestObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeRequestObject other) { + return value.equals(other.value) && tokenGroupNames.equals(other.tokenGroupNames) && token.equals(other.token); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.value, this.tokenGroupNames, this.token); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static ValueStage builder() { + return new Builder(); + } + + public interface ValueStage { + _FinalStage value(@NotNull GoogleProtobufValue value); + + Builder from(TokenizeRequestObject other); + } + + public interface _FinalStage { + TokenizeRequestObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Names of token groups the value might be present in.

                                  + */ + _FinalStage tokenGroupNames(List tokenGroupNames); + + _FinalStage addTokenGroupNames(String tokenGroupNames); + + _FinalStage addAllTokenGroupNames(List tokenGroupNames); + + _FinalStage token(Optional token); + + _FinalStage token(GoogleProtobufValue token); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements ValueStage, _FinalStage { + private GoogleProtobufValue value; + + private Optional token = Optional.empty(); + + private List tokenGroupNames = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(TokenizeRequestObject other) { + value(other.getValue()); + tokenGroupNames(other.getTokenGroupNames()); + token(other.getToken()); + return this; + } + + @java.lang.Override + @JsonSetter("value") + public _FinalStage value(@NotNull GoogleProtobufValue value) { + this.value = Objects.requireNonNull(value, "value must not be null"); + return this; + } + + @java.lang.Override + public _FinalStage token(GoogleProtobufValue token) { + this.token = Optional.ofNullable(token); + return this; + } + + @java.lang.Override + @JsonSetter(value = "token", nulls = Nulls.SKIP) + public _FinalStage token(Optional token) { + this.token = token; + return this; + } + + /** + *

                                  Names of token groups the value might be present in.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllTokenGroupNames(List tokenGroupNames) { + if (tokenGroupNames != null) { + this.tokenGroupNames.addAll(tokenGroupNames); + } + return this; + } + + /** + *

                                  Names of token groups the value might be present in.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addTokenGroupNames(String tokenGroupNames) { + this.tokenGroupNames.add(tokenGroupNames); + return this; + } + + /** + *

                                  Names of token groups the value might be present in.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenGroupNames", nulls = Nulls.SKIP) + public _FinalStage tokenGroupNames(List tokenGroupNames) { + this.tokenGroupNames.clear(); + if (tokenGroupNames != null) { + this.tokenGroupNames.addAll(tokenGroupNames); + } + return this; + } + + @java.lang.Override + public TokenizeRequestObject build() { + return new TokenizeRequestObject(value, tokenGroupNames, token, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponse.java new file mode 100644 index 00000000..739059f4 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeResponse.Builder.class) +public final class TokenizeResponse { + private final List records; + + private final Map additionalProperties; + + private TokenizeResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Tokens corresponding to the specified values. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeResponse && equalTo((TokenizeResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(TokenizeResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Tokens corresponding to the specified values.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(TokenizeRecordResponse records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public TokenizeResponse build() { + return new TokenizeResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponseObject.java new file mode 100644 index 00000000..70f9d9dc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponseObject.java @@ -0,0 +1,321 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.Nullable; +import com.skyflow.generated.rest.core.NullableNonemptyFilter; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeResponseObject.Builder.class) +public final class TokenizeResponseObject { + private final String token; + + private final Optional value; + + private final Optional tokenGroupName; + + private final Optional error; + + private final Optional httpCode; + + private final Map additionalProperties; + + private TokenizeResponseObject( + String token, + Optional value, + Optional tokenGroupName, + Optional error, + Optional httpCode, + Map additionalProperties) { + this.token = token; + this.value = value; + this.tokenGroupName = tokenGroupName; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token that was generated. + */ + @JsonProperty("token") + public String getToken() { + return token; + } + + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Name of the token group. + */ + @JsonIgnore + public Optional getTokenGroupName() { + if (tokenGroupName == null) { + return Optional.empty(); + } + return tokenGroupName; + } + + /** + * @return Error message, if any. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NullableNonemptyFilter.class) + @JsonProperty("tokenGroupName") + private Optional _getTokenGroupName() { + return tokenGroupName; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeResponseObject && equalTo((TokenizeResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeResponseObject other) { + return token.equals(other.token) + && value.equals(other.value) + && tokenGroupName.equals(other.tokenGroupName) + && error.equals(other.error) + && httpCode.equals(other.httpCode); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.token, this.value, this.tokenGroupName, this.error, this.httpCode); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TokenStage builder() { + return new Builder(); + } + + public interface TokenStage { + /** + *

                                  Token that was generated.

                                  + */ + _FinalStage token(@NotNull String token); + + Builder from(TokenizeResponseObject other); + } + + public interface _FinalStage { + TokenizeResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + _FinalStage value(Optional value); + + _FinalStage value(GoogleProtobufValue value); + + /** + *

                                  Name of the token group.

                                  + */ + _FinalStage tokenGroupName(Optional tokenGroupName); + + _FinalStage tokenGroupName(String tokenGroupName); + + _FinalStage tokenGroupName(Nullable tokenGroupName); + + /** + *

                                  Error message, if any.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + + /** + *

                                  HTTP status code of the response.

                                  + */ + _FinalStage httpCode(Optional httpCode); + + _FinalStage httpCode(Integer httpCode); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TokenStage, _FinalStage { + private String token; + + private Optional httpCode = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional tokenGroupName = Optional.empty(); + + private Optional value = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(TokenizeResponseObject other) { + token(other.getToken()); + value(other.getValue()); + tokenGroupName(other.getTokenGroupName()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Token that was generated.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("token") + public _FinalStage token(@NotNull String token) { + this.token = Objects.requireNonNull(token, "token must not be null"); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + */ + @java.lang.Override + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public _FinalStage httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Name of the token group.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenGroupName(Nullable tokenGroupName) { + if (tokenGroupName.isNull()) { + this.tokenGroupName = null; + } else if (tokenGroupName.isEmpty()) { + this.tokenGroupName = Optional.empty(); + } else { + this.tokenGroupName = Optional.of(tokenGroupName.get()); + } + return this; + } + + /** + *

                                  Name of the token group.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

                                  Name of the token group.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public _FinalStage tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + @java.lang.Override + public _FinalStage value(GoogleProtobufValue value) { + this.value = Optional.ofNullable(value); + return this; + } + + @java.lang.Override + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public _FinalStage value(Optional value) { + this.value = value; + return this; + } + + @java.lang.Override + public TokenizeResponseObject build() { + return new TokenizeResponseObject(token, value, tokenGroupName, error, httpCode, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/Transformations.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/Transformations.java deleted file mode 100644 index c9165409..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/Transformations.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = Transformations.Builder.class) -public final class Transformations { - private final Optional shiftDates; - - private final Map additionalProperties; - - private Transformations(Optional shiftDates, Map additionalProperties) { - this.shiftDates = shiftDates; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("shift_dates") - public Optional getShiftDates() { - return shiftDates; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof Transformations && equalTo((Transformations) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(Transformations other) { - return shiftDates.equals(other.shiftDates); - } - - @Override - public int hashCode() { - return Objects.hash(this.shiftDates); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional shiftDates = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(Transformations other) { - shiftDates(other.getShiftDates()); - return this; - } - - @JsonSetter(value = "shift_dates", nulls = Nulls.SKIP) - public Builder shiftDates(Optional shiftDates) { - this.shiftDates = shiftDates; - return this; - } - - public Builder shiftDates(ShiftDates shiftDates) { - this.shiftDates = Optional.ofNullable(shiftDates); - return this; - } - - public Transformations build() { - return new Transformations(shiftDates, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/UniqueValue.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UniqueValue.java new file mode 100644 index 00000000..7c185437 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UniqueValue.java @@ -0,0 +1,121 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = UniqueValue.Builder.class) +public final class UniqueValue { + private final Map data; + + private final Map additionalProperties; + + private UniqueValue(Map data, Map additionalProperties) { + this.data = data; + this.additionalProperties = additionalProperties; + } + + /** + * @return Columns names and values for the unique value entry. + */ + @JsonProperty("data") + public Map getData() { + return data; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof UniqueValue && equalTo((UniqueValue) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(UniqueValue other) { + return data.equals(other.data); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.data); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Map data = new LinkedHashMap<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(UniqueValue other) { + data(other.getData()); + return this; + } + + /** + *

                                  Columns names and values for the unique value entry.

                                  + */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Map data) { + this.data.clear(); + if (data != null) { + this.data.putAll(data); + } + return this; + } + + public Builder putAllData(Map data) { + if (data != null) { + this.data.putAll(data); + } + return this; + } + + public Builder data(String key, Object value) { + this.data.put(key, value); + return this; + } + + public UniqueValue build() { + return new UniqueValue(data, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordData.java new file mode 100644 index 00000000..83a11ab0 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordData.java @@ -0,0 +1,279 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = UpdateRecordData.Builder.class) +public final class UpdateRecordData { + private final String skyflowId; + + private final Map data; + + private final Optional tableName; + + private final Optional updateType; + + private final Map additionalProperties; + + private UpdateRecordData( + String skyflowId, + Map data, + Optional tableName, + Optional updateType, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.data = data; + this.tableName = tableName; + this.updateType = updateType; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID of the record to update. + */ + @JsonProperty("skyflowID") + public String getSkyflowId() { + return skyflowId; + } + + /** + * @return Columns and values for the record. + */ + @JsonProperty("data") + public Map getData() { + return data; + } + + /** + * @return Name of the table to update data in. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return Type of update operation to perform. + */ + @JsonProperty("updateType") + public Optional getUpdateType() { + return updateType; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof UpdateRecordData && equalTo((UpdateRecordData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(UpdateRecordData other) { + return skyflowId.equals(other.skyflowId) + && data.equals(other.data) + && tableName.equals(other.tableName) + && updateType.equals(other.updateType); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.data, this.tableName, this.updateType); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static SkyflowIdStage builder() { + return new Builder(); + } + + public interface SkyflowIdStage { + /** + *

                                  Skyflow ID of the record to update.

                                  + */ + _FinalStage skyflowId(@NotNull String skyflowId); + + Builder from(UpdateRecordData other); + } + + public interface _FinalStage { + UpdateRecordData build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Columns and values for the record.

                                  + */ + _FinalStage data(Map data); + + _FinalStage putAllData(Map data); + + _FinalStage data(String key, Object value); + + /** + *

                                  Name of the table to update data in.

                                  + */ + _FinalStage tableName(Optional tableName); + + _FinalStage tableName(String tableName); + + /** + *

                                  Type of update operation to perform.

                                  + */ + _FinalStage updateType(Optional updateType); + + _FinalStage updateType(UpdateRecordDataUpdateType updateType); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements SkyflowIdStage, _FinalStage { + private String skyflowId; + + private Optional updateType = Optional.empty(); + + private Optional tableName = Optional.empty(); + + private Map data = new LinkedHashMap<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(UpdateRecordData other) { + skyflowId(other.getSkyflowId()); + data(other.getData()); + tableName(other.getTableName()); + updateType(other.getUpdateType()); + return this; + } + + /** + *

                                  Skyflow ID of the record to update.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("skyflowID") + public _FinalStage skyflowId(@NotNull String skyflowId) { + this.skyflowId = Objects.requireNonNull(skyflowId, "skyflowId must not be null"); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage updateType(UpdateRecordDataUpdateType updateType) { + this.updateType = Optional.ofNullable(updateType); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + */ + @java.lang.Override + @JsonSetter(value = "updateType", nulls = Nulls.SKIP) + public _FinalStage updateType(Optional updateType) { + this.updateType = updateType; + return this; + } + + /** + *

                                  Name of the table to update data in.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

                                  Name of the table to update data in.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public _FinalStage tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + /** + *

                                  Columns and values for the record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage data(String key, Object value) { + this.data.put(key, value); + return this; + } + + /** + *

                                  Columns and values for the record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage putAllData(Map data) { + if (data != null) { + this.data.putAll(data); + } + return this; + } + + /** + *

                                  Columns and values for the record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(Map data) { + this.data.clear(); + if (data != null) { + this.data.putAll(data); + } + return this; + } + + @java.lang.Override + public UpdateRecordData build() { + return new UpdateRecordData(skyflowId, data, tableName, updateType, additionalProperties); + } + + @java.lang.Override + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + @java.lang.Override + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordDataUpdateType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordDataUpdateType.java new file mode 100644 index 00000000..2fe52e9d --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordDataUpdateType.java @@ -0,0 +1,84 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class UpdateRecordDataUpdateType { + public static final UpdateRecordDataUpdateType REPLACE = new UpdateRecordDataUpdateType(Value.REPLACE, "REPLACE"); + + public static final UpdateRecordDataUpdateType UPDATE = new UpdateRecordDataUpdateType(Value.UPDATE, "UPDATE"); + + private final Value value; + + private final String string; + + UpdateRecordDataUpdateType(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof UpdateRecordDataUpdateType + && this.string.equals(((UpdateRecordDataUpdateType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case REPLACE: + return visitor.visitReplace(); + case UPDATE: + return visitor.visitUpdate(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static UpdateRecordDataUpdateType valueOf(String value) { + switch (value) { + case "REPLACE": + return REPLACE; + case "UPDATE": + return UPDATE; + default: + return new UpdateRecordDataUpdateType(Value.UNKNOWN, value); + } + } + + public enum Value { + UPDATE, + + REPLACE, + + UNKNOWN + } + + public interface Visitor { + T visitUpdate(); + + T visitReplace(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordResponse.java similarity index 70% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordResponse.java index d2fcbf1b..a4b4fd87 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordResponse.java @@ -3,25 +3,30 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1UpdateRecordResponse.Builder.class) -public final class V1UpdateRecordResponse { +@JsonDeserialize(builder = UpdateRecordResponse.Builder.class) +public final class UpdateRecordResponse { private final Optional skyflowId; private final Optional> tokens; private final Map additionalProperties; - private V1UpdateRecordResponse( + private UpdateRecordResponse( Optional skyflowId, Optional> tokens, Map additionalProperties) { @@ -46,10 +51,10 @@ public Optional> getTokens() { return tokens; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1UpdateRecordResponse && equalTo((V1UpdateRecordResponse) other); + return other instanceof UpdateRecordResponse && equalTo((UpdateRecordResponse) other); } @JsonAnyGetter @@ -57,16 +62,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1UpdateRecordResponse other) { + private boolean equalTo(UpdateRecordResponse other) { return skyflowId.equals(other.skyflowId) && tokens.equals(other.tokens); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowId, this.tokens); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -86,7 +91,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1UpdateRecordResponse other) { + public Builder from(UpdateRecordResponse other) { skyflowId(other.getSkyflowId()); tokens(other.getTokens()); return this; @@ -120,8 +125,18 @@ public Builder tokens(Map tokens) { return this; } - public V1UpdateRecordResponse build() { - return new V1UpdateRecordResponse(skyflowId, tokens, additionalProperties); + public UpdateRecordResponse build() { + return new UpdateRecordResponse(skyflowId, tokens, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateResponse.java new file mode 100644 index 00000000..7f509065 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = UpdateResponse.Builder.class) +public final class UpdateResponse { + private final List records; + + private final Map additionalProperties; + + private UpdateResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of updated records. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof UpdateResponse && equalTo((UpdateResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(UpdateResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(UpdateResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of updated records.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(RecordResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public UpdateResponse build() { + return new UpdateResponse(records, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileResponseV2.java similarity index 53% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileResponseV2.java index 8f5fea5a..b4d0ca27 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileResponseV2.java @@ -3,48 +3,58 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = UploadFileV2Response.Builder.class) -public final class UploadFileV2Response { +@JsonDeserialize(builder = UploadFileResponseV2.Builder.class) +public final class UploadFileResponseV2 { private final Optional skyflowId; - private final Optional fileMetadata; + private final Optional> fileMetadata; private final Map additionalProperties; - private UploadFileV2Response( - Optional skyflowId, Optional fileMetadata, Map additionalProperties) { + private UploadFileResponseV2( + Optional skyflowId, + Optional> fileMetadata, + Map additionalProperties) { this.skyflowId = skyflowId; this.fileMetadata = fileMetadata; this.additionalProperties = additionalProperties; } /** - * @return Skyflow ID of the record the file was uploaded to. + * @return ID of the record to update. */ @JsonProperty("skyflowID") public Optional getSkyflowId() { return skyflowId; } + /** + * @return Metadata for the uploaded file with keys based on the name of the column containing the file. + */ @JsonProperty("fileMetadata") - public Optional getFileMetadata() { + public Optional> getFileMetadata() { return fileMetadata; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof UploadFileV2Response && equalTo((UploadFileV2Response) other); + return other instanceof UploadFileResponseV2 && equalTo((UploadFileResponseV2) other); } @JsonAnyGetter @@ -52,16 +62,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(UploadFileV2Response other) { + private boolean equalTo(UploadFileResponseV2 other) { return skyflowId.equals(other.skyflowId) && fileMetadata.equals(other.fileMetadata); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowId, this.fileMetadata); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -74,21 +84,21 @@ public static Builder builder() { public static final class Builder { private Optional skyflowId = Optional.empty(); - private Optional fileMetadata = Optional.empty(); + private Optional> fileMetadata = Optional.empty(); @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(UploadFileV2Response other) { + public Builder from(UploadFileResponseV2 other) { skyflowId(other.getSkyflowId()); fileMetadata(other.getFileMetadata()); return this; } /** - *

                                  Skyflow ID of the record the file was uploaded to.

                                  + *

                                  ID of the record to update.

                                  */ @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) public Builder skyflowId(Optional skyflowId) { @@ -101,19 +111,32 @@ public Builder skyflowId(String skyflowId) { return this; } + /** + *

                                  Metadata for the uploaded file with keys based on the name of the column containing the file.

                                  + */ @JsonSetter(value = "fileMetadata", nulls = Nulls.SKIP) - public Builder fileMetadata(Optional fileMetadata) { + public Builder fileMetadata(Optional> fileMetadata) { this.fileMetadata = fileMetadata; return this; } - public Builder fileMetadata(Object fileMetadata) { + public Builder fileMetadata(Map fileMetadata) { this.fileMetadata = Optional.ofNullable(fileMetadata); return this; } - public UploadFileV2Response build() { - return new UploadFileV2Response(skyflowId, fileMetadata, additionalProperties); + public UploadFileResponseV2 build() { + return new UploadFileResponseV2(skyflowId, fileMetadata, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/Upsert.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/Upsert.java new file mode 100644 index 00000000..d413f637 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/Upsert.java @@ -0,0 +1,154 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = Upsert.Builder.class) +public final class Upsert { + private final Optional updateType; + + private final List uniqueColumns; + + private final Map additionalProperties; + + private Upsert( + Optional updateType, + List uniqueColumns, + Map additionalProperties) { + this.updateType = updateType; + this.uniqueColumns = uniqueColumns; + this.additionalProperties = additionalProperties; + } + + /** + * @return Type of update operation to perform. + */ + @JsonProperty("updateType") + public Optional getUpdateType() { + return updateType; + } + + /** + * @return List of unique columns in the table that upsert operations use to identify if a record with matching values exists. If a matching record exists, the record updates with the specified values. If a matching record doesn't exist, the upsert operation inserts a new record. + */ + @JsonProperty("uniqueColumns") + public List getUniqueColumns() { + return uniqueColumns; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof Upsert && equalTo((Upsert) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(Upsert other) { + return updateType.equals(other.updateType) && uniqueColumns.equals(other.uniqueColumns); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.updateType, this.uniqueColumns); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional updateType = Optional.empty(); + + private List uniqueColumns = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(Upsert other) { + updateType(other.getUpdateType()); + uniqueColumns(other.getUniqueColumns()); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + */ + @JsonSetter(value = "updateType", nulls = Nulls.SKIP) + public Builder updateType(Optional updateType) { + this.updateType = updateType; + return this; + } + + public Builder updateType(UpsertUpdateType updateType) { + this.updateType = Optional.ofNullable(updateType); + return this; + } + + /** + *

                                  List of unique columns in the table that upsert operations use to identify if a record with matching values exists. If a matching record exists, the record updates with the specified values. If a matching record doesn't exist, the upsert operation inserts a new record.

                                  + */ + @JsonSetter(value = "uniqueColumns", nulls = Nulls.SKIP) + public Builder uniqueColumns(List uniqueColumns) { + this.uniqueColumns.clear(); + if (uniqueColumns != null) { + this.uniqueColumns.addAll(uniqueColumns); + } + return this; + } + + public Builder addUniqueColumns(String uniqueColumns) { + this.uniqueColumns.add(uniqueColumns); + return this; + } + + public Builder addAllUniqueColumns(List uniqueColumns) { + if (uniqueColumns != null) { + this.uniqueColumns.addAll(uniqueColumns); + } + return this; + } + + public Upsert build() { + return new Upsert(updateType, uniqueColumns, additionalProperties); + } + + public Builder additionalProperty(String key, Object value) { + this.additionalProperties.put(key, value); + return this; + } + + public Builder additionalProperties(Map additionalProperties) { + this.additionalProperties.putAll(additionalProperties); + return this; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/UpsertUpdateType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpsertUpdateType.java new file mode 100644 index 00000000..09196134 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpsertUpdateType.java @@ -0,0 +1,83 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class UpsertUpdateType { + public static final UpsertUpdateType REPLACE = new UpsertUpdateType(Value.REPLACE, "REPLACE"); + + public static final UpsertUpdateType UPDATE = new UpsertUpdateType(Value.UPDATE, "UPDATE"); + + private final Value value; + + private final String string; + + UpsertUpdateType(Value value, String string) { + this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; + } + + @java.lang.Override + @JsonValue + public String toString() { + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof UpsertUpdateType && this.string.equals(((UpsertUpdateType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case REPLACE: + return visitor.visitReplace(); + case UPDATE: + return visitor.visitUpdate(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static UpsertUpdateType valueOf(String value) { + switch (value) { + case "REPLACE": + return REPLACE; + case "UPDATE": + return UPDATE; + default: + return new UpsertUpdateType(Value.UNKNOWN, value); + } + } + + public enum Value { + UPDATE, + + REPLACE, + + UNKNOWN + } + + public interface Visitor { + T visitUpdate(); + + T visitReplace(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java deleted file mode 100644 index 037b80bf..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditAfterOptions.Builder.class) -public final class V1AuditAfterOptions { - private final Optional timestamp; - - private final Optional changeId; - - private final Map additionalProperties; - - private V1AuditAfterOptions( - Optional timestamp, Optional changeId, Map additionalProperties) { - this.timestamp = timestamp; - this.changeId = changeId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank. - */ - @JsonProperty("timestamp") - public Optional getTimestamp() { - return timestamp; - } - - /** - * @return Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank. - */ - @JsonProperty("changeID") - public Optional getChangeId() { - return changeId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditAfterOptions && equalTo((V1AuditAfterOptions) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditAfterOptions other) { - return timestamp.equals(other.timestamp) && changeId.equals(other.changeId); - } - - @Override - public int hashCode() { - return Objects.hash(this.timestamp, this.changeId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional timestamp = Optional.empty(); - - private Optional changeId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditAfterOptions other) { - timestamp(other.getTimestamp()); - changeId(other.getChangeId()); - return this; - } - - /** - *

                                  Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

                                  - */ - @JsonSetter(value = "timestamp", nulls = Nulls.SKIP) - public Builder timestamp(Optional timestamp) { - this.timestamp = timestamp; - return this; - } - - public Builder timestamp(String timestamp) { - this.timestamp = Optional.ofNullable(timestamp); - return this; - } - - /** - *

                                  Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

                                  - */ - @JsonSetter(value = "changeID", nulls = Nulls.SKIP) - public Builder changeId(Optional changeId) { - this.changeId = changeId; - return this; - } - - public Builder changeId(String changeId) { - this.changeId = Optional.ofNullable(changeId); - return this; - } - - public V1AuditAfterOptions build() { - return new V1AuditAfterOptions(timestamp, changeId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java deleted file mode 100644 index f7ca73f0..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java +++ /dev/null @@ -1,182 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditEventResponse.Builder.class) -public final class V1AuditEventResponse { - private final Optional code; - - private final Optional message; - - private final Optional data; - - private final Optional timestamp; - - private final Map additionalProperties; - - private V1AuditEventResponse( - Optional code, - Optional message, - Optional data, - Optional timestamp, - Map additionalProperties) { - this.code = code; - this.message = message; - this.data = data; - this.timestamp = timestamp; - this.additionalProperties = additionalProperties; - } - - /** - * @return The status of the overall operation. - */ - @JsonProperty("code") - public Optional getCode() { - return code; - } - - /** - * @return The status message for the overall operation. - */ - @JsonProperty("message") - public Optional getMessage() { - return message; - } - - @JsonProperty("data") - public Optional getData() { - return data; - } - - /** - * @return time when this response is generated, use extention method to set it. - */ - @JsonProperty("timestamp") - public Optional getTimestamp() { - return timestamp; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditEventResponse && equalTo((V1AuditEventResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditEventResponse other) { - return code.equals(other.code) - && message.equals(other.message) - && data.equals(other.data) - && timestamp.equals(other.timestamp); - } - - @Override - public int hashCode() { - return Objects.hash(this.code, this.message, this.data, this.timestamp); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional code = Optional.empty(); - - private Optional message = Optional.empty(); - - private Optional data = Optional.empty(); - - private Optional timestamp = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditEventResponse other) { - code(other.getCode()); - message(other.getMessage()); - data(other.getData()); - timestamp(other.getTimestamp()); - return this; - } - - /** - *

                                  The status of the overall operation.

                                  - */ - @JsonSetter(value = "code", nulls = Nulls.SKIP) - public Builder code(Optional code) { - this.code = code; - return this; - } - - public Builder code(Integer code) { - this.code = Optional.ofNullable(code); - return this; - } - - /** - *

                                  The status message for the overall operation.

                                  - */ - @JsonSetter(value = "message", nulls = Nulls.SKIP) - public Builder message(Optional message) { - this.message = message; - return this; - } - - public Builder message(String message) { - this.message = Optional.ofNullable(message); - return this; - } - - @JsonSetter(value = "data", nulls = Nulls.SKIP) - public Builder data(Optional data) { - this.data = data; - return this; - } - - public Builder data(AuditEventData data) { - this.data = Optional.ofNullable(data); - return this; - } - - /** - *

                                  time when this response is generated, use extention method to set it.

                                  - */ - @JsonSetter(value = "timestamp", nulls = Nulls.SKIP) - public Builder timestamp(Optional timestamp) { - this.timestamp = timestamp; - return this; - } - - public Builder timestamp(String timestamp) { - this.timestamp = Optional.ofNullable(timestamp); - return this; - } - - public V1AuditEventResponse build() { - return new V1AuditEventResponse(code, message, data, timestamp, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java deleted file mode 100644 index 36d7ccce..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java +++ /dev/null @@ -1,118 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditResponse.Builder.class) -public final class V1AuditResponse { - private final Optional> event; - - private final Optional nextOps; - - private final Map additionalProperties; - - private V1AuditResponse( - Optional> event, - Optional nextOps, - Map additionalProperties) { - this.event = event; - this.nextOps = nextOps; - this.additionalProperties = additionalProperties; - } - - /** - * @return Events matching the query. - */ - @JsonProperty("event") - public Optional> getEvent() { - return event; - } - - @JsonProperty("nextOps") - public Optional getNextOps() { - return nextOps; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditResponse && equalTo((V1AuditResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditResponse other) { - return event.equals(other.event) && nextOps.equals(other.nextOps); - } - - @Override - public int hashCode() { - return Objects.hash(this.event, this.nextOps); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> event = Optional.empty(); - - private Optional nextOps = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditResponse other) { - event(other.getEvent()); - nextOps(other.getNextOps()); - return this; - } - - /** - *

                                  Events matching the query.

                                  - */ - @JsonSetter(value = "event", nulls = Nulls.SKIP) - public Builder event(Optional> event) { - this.event = event; - return this; - } - - public Builder event(List event) { - this.event = Optional.ofNullable(event); - return this; - } - - @JsonSetter(value = "nextOps", nulls = Nulls.SKIP) - public Builder nextOps(Optional nextOps) { - this.nextOps = nextOps; - return this; - } - - public Builder nextOps(V1AuditAfterOptions nextOps) { - this.nextOps = Optional.ofNullable(nextOps); - return this; - } - - public V1AuditResponse build() { - return new V1AuditResponse(event, nextOps, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java deleted file mode 100644 index a54eec6c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java +++ /dev/null @@ -1,229 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditResponseEvent.Builder.class) -public final class V1AuditResponseEvent { - private final Optional context; - - private final Optional request; - - private final Optional response; - - private final Optional parentAccountId; - - private final Optional accountId; - - private final Optional> resourceIDs; - - private final Map additionalProperties; - - private V1AuditResponseEvent( - Optional context, - Optional request, - Optional response, - Optional parentAccountId, - Optional accountId, - Optional> resourceIDs, - Map additionalProperties) { - this.context = context; - this.request = request; - this.response = response; - this.parentAccountId = parentAccountId; - this.accountId = accountId; - this.resourceIDs = resourceIDs; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("context") - public Optional getContext() { - return context; - } - - @JsonProperty("request") - public Optional getRequest() { - return request; - } - - @JsonProperty("response") - public Optional getResponse() { - return response; - } - - /** - * @return Parent account ID of the account that made the request, if any. - */ - @JsonProperty("parentAccountID") - public Optional getParentAccountId() { - return parentAccountId; - } - - /** - * @return ID of the account that made the request. - */ - @JsonProperty("accountID") - public Optional getAccountId() { - return accountId; - } - - /** - * @return IDs for resources involved in the event. Presented in {resourceType}/{resourceID} format. For example, VAULT/cd1d815aa09b4cbfbb803bd20349f202. - */ - @JsonProperty("resourceIDs") - public Optional> getResourceIDs() { - return resourceIDs; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditResponseEvent && equalTo((V1AuditResponseEvent) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditResponseEvent other) { - return context.equals(other.context) - && request.equals(other.request) - && response.equals(other.response) - && parentAccountId.equals(other.parentAccountId) - && accountId.equals(other.accountId) - && resourceIDs.equals(other.resourceIDs); - } - - @Override - public int hashCode() { - return Objects.hash( - this.context, this.request, this.response, this.parentAccountId, this.accountId, this.resourceIDs); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional context = Optional.empty(); - - private Optional request = Optional.empty(); - - private Optional response = Optional.empty(); - - private Optional parentAccountId = Optional.empty(); - - private Optional accountId = Optional.empty(); - - private Optional> resourceIDs = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditResponseEvent other) { - context(other.getContext()); - request(other.getRequest()); - response(other.getResponse()); - parentAccountId(other.getParentAccountId()); - accountId(other.getAccountId()); - resourceIDs(other.getResourceIDs()); - return this; - } - - @JsonSetter(value = "context", nulls = Nulls.SKIP) - public Builder context(Optional context) { - this.context = context; - return this; - } - - public Builder context(AuditEventContext context) { - this.context = Optional.ofNullable(context); - return this; - } - - @JsonSetter(value = "request", nulls = Nulls.SKIP) - public Builder request(Optional request) { - this.request = request; - return this; - } - - public Builder request(V1AuditResponseEventRequest request) { - this.request = Optional.ofNullable(request); - return this; - } - - @JsonSetter(value = "response", nulls = Nulls.SKIP) - public Builder response(Optional response) { - this.response = response; - return this; - } - - public Builder response(V1AuditEventResponse response) { - this.response = Optional.ofNullable(response); - return this; - } - - /** - *

                                  Parent account ID of the account that made the request, if any.

                                  - */ - @JsonSetter(value = "parentAccountID", nulls = Nulls.SKIP) - public Builder parentAccountId(Optional parentAccountId) { - this.parentAccountId = parentAccountId; - return this; - } - - public Builder parentAccountId(String parentAccountId) { - this.parentAccountId = Optional.ofNullable(parentAccountId); - return this; - } - - /** - *

                                  ID of the account that made the request.

                                  - */ - @JsonSetter(value = "accountID", nulls = Nulls.SKIP) - public Builder accountId(Optional accountId) { - this.accountId = accountId; - return this; - } - - public Builder accountId(String accountId) { - this.accountId = Optional.ofNullable(accountId); - return this; - } - - /** - *

                                  IDs for resources involved in the event. Presented in {resourceType}/{resourceID} format. For example, VAULT/cd1d815aa09b4cbfbb803bd20349f202.

                                  - */ - @JsonSetter(value = "resourceIDs", nulls = Nulls.SKIP) - public Builder resourceIDs(Optional> resourceIDs) { - this.resourceIDs = resourceIDs; - return this; - } - - public Builder resourceIDs(List resourceIDs) { - this.resourceIDs = Optional.ofNullable(resourceIDs); - return this; - } - - public V1AuditResponseEvent build() { - return new V1AuditResponseEvent( - context, request, response, parentAccountId, accountId, resourceIDs, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java deleted file mode 100644 index 90d9c538..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java +++ /dev/null @@ -1,330 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditResponseEventRequest.Builder.class) -public final class V1AuditResponseEventRequest { - private final Optional data; - - private final Optional apiName; - - private final Optional workspaceId; - - private final Optional vaultId; - - private final Optional> tags; - - private final Optional timestamp; - - private final Optional actionType; - - private final Optional resourceType; - - private final Optional httpInfo; - - private final Map additionalProperties; - - private V1AuditResponseEventRequest( - Optional data, - Optional apiName, - Optional workspaceId, - Optional vaultId, - Optional> tags, - Optional timestamp, - Optional actionType, - Optional resourceType, - Optional httpInfo, - Map additionalProperties) { - this.data = data; - this.apiName = apiName; - this.workspaceId = workspaceId; - this.vaultId = vaultId; - this.tags = tags; - this.timestamp = timestamp; - this.actionType = actionType; - this.resourceType = resourceType; - this.httpInfo = httpInfo; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("data") - public Optional getData() { - return data; - } - - /** - * @return API name. - */ - @JsonProperty("apiName") - public Optional getApiName() { - return apiName; - } - - /** - * @return The workspaceID (if any) of the request. - */ - @JsonProperty("workspaceID") - public Optional getWorkspaceId() { - return workspaceId; - } - - /** - * @return The vaultID (if any) of the request. - */ - @JsonProperty("vaultID") - public Optional getVaultId() { - return vaultId; - } - - /** - * @return Tags associated with the event. To provide better search capabilities. Like login. - */ - @JsonProperty("tags") - public Optional> getTags() { - return tags; - } - - /** - * @return time when this request is generated, use extention method to set it. - */ - @JsonProperty("timestamp") - public Optional getTimestamp() { - return timestamp; - } - - @JsonProperty("actionType") - public Optional getActionType() { - return actionType; - } - - @JsonProperty("resourceType") - public Optional getResourceType() { - return resourceType; - } - - @JsonProperty("httpInfo") - public Optional getHttpInfo() { - return httpInfo; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditResponseEventRequest && equalTo((V1AuditResponseEventRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditResponseEventRequest other) { - return data.equals(other.data) - && apiName.equals(other.apiName) - && workspaceId.equals(other.workspaceId) - && vaultId.equals(other.vaultId) - && tags.equals(other.tags) - && timestamp.equals(other.timestamp) - && actionType.equals(other.actionType) - && resourceType.equals(other.resourceType) - && httpInfo.equals(other.httpInfo); - } - - @Override - public int hashCode() { - return Objects.hash( - this.data, - this.apiName, - this.workspaceId, - this.vaultId, - this.tags, - this.timestamp, - this.actionType, - this.resourceType, - this.httpInfo); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional data = Optional.empty(); - - private Optional apiName = Optional.empty(); - - private Optional workspaceId = Optional.empty(); - - private Optional vaultId = Optional.empty(); - - private Optional> tags = Optional.empty(); - - private Optional timestamp = Optional.empty(); - - private Optional actionType = Optional.empty(); - - private Optional resourceType = Optional.empty(); - - private Optional httpInfo = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditResponseEventRequest other) { - data(other.getData()); - apiName(other.getApiName()); - workspaceId(other.getWorkspaceId()); - vaultId(other.getVaultId()); - tags(other.getTags()); - timestamp(other.getTimestamp()); - actionType(other.getActionType()); - resourceType(other.getResourceType()); - httpInfo(other.getHttpInfo()); - return this; - } - - @JsonSetter(value = "data", nulls = Nulls.SKIP) - public Builder data(Optional data) { - this.data = data; - return this; - } - - public Builder data(AuditEventData data) { - this.data = Optional.ofNullable(data); - return this; - } - - /** - *

                                  API name.

                                  - */ - @JsonSetter(value = "apiName", nulls = Nulls.SKIP) - public Builder apiName(Optional apiName) { - this.apiName = apiName; - return this; - } - - public Builder apiName(String apiName) { - this.apiName = Optional.ofNullable(apiName); - return this; - } - - /** - *

                                  The workspaceID (if any) of the request.

                                  - */ - @JsonSetter(value = "workspaceID", nulls = Nulls.SKIP) - public Builder workspaceId(Optional workspaceId) { - this.workspaceId = workspaceId; - return this; - } - - public Builder workspaceId(String workspaceId) { - this.workspaceId = Optional.ofNullable(workspaceId); - return this; - } - - /** - *

                                  The vaultID (if any) of the request.

                                  - */ - @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) - public Builder vaultId(Optional vaultId) { - this.vaultId = vaultId; - return this; - } - - public Builder vaultId(String vaultId) { - this.vaultId = Optional.ofNullable(vaultId); - return this; - } - - /** - *

                                  Tags associated with the event. To provide better search capabilities. Like login.

                                  - */ - @JsonSetter(value = "tags", nulls = Nulls.SKIP) - public Builder tags(Optional> tags) { - this.tags = tags; - return this; - } - - public Builder tags(List tags) { - this.tags = Optional.ofNullable(tags); - return this; - } - - /** - *

                                  time when this request is generated, use extention method to set it.

                                  - */ - @JsonSetter(value = "timestamp", nulls = Nulls.SKIP) - public Builder timestamp(Optional timestamp) { - this.timestamp = timestamp; - return this; - } - - public Builder timestamp(String timestamp) { - this.timestamp = Optional.ofNullable(timestamp); - return this; - } - - @JsonSetter(value = "actionType", nulls = Nulls.SKIP) - public Builder actionType(Optional actionType) { - this.actionType = actionType; - return this; - } - - public Builder actionType(RequestActionType actionType) { - this.actionType = Optional.ofNullable(actionType); - return this; - } - - @JsonSetter(value = "resourceType", nulls = Nulls.SKIP) - public Builder resourceType(Optional resourceType) { - this.resourceType = resourceType; - return this; - } - - public Builder resourceType(AuditEventAuditResourceType resourceType) { - this.resourceType = Optional.ofNullable(resourceType); - return this; - } - - @JsonSetter(value = "httpInfo", nulls = Nulls.SKIP) - public Builder httpInfo(Optional httpInfo) { - this.httpInfo = httpInfo; - return this; - } - - public Builder httpInfo(AuditEventHttpInfo httpInfo) { - this.httpInfo = Optional.ofNullable(httpInfo); - return this; - } - - public V1AuditResponseEventRequest build() { - return new V1AuditResponseEventRequest( - data, - apiName, - workspaceId, - vaultId, - tags, - timestamp, - actionType, - resourceType, - httpInfo, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java deleted file mode 100644 index 3f0455cc..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java +++ /dev/null @@ -1,377 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BatchRecord.Builder.class) -public final class V1BatchRecord { - private final Optional> fields; - - private final Optional tableName; - - private final Optional method; - - private final Optional batchId; - - private final Optional redaction; - - private final Optional tokenization; - - private final Optional id; - - private final Optional downloadUrl; - - private final Optional upsert; - - private final Optional> tokens; - - private final Map additionalProperties; - - private V1BatchRecord( - Optional> fields, - Optional tableName, - Optional method, - Optional batchId, - Optional redaction, - Optional tokenization, - Optional id, - Optional downloadUrl, - Optional upsert, - Optional> tokens, - Map additionalProperties) { - this.fields = fields; - this.tableName = tableName; - this.method = method; - this.batchId = batchId; - this.redaction = redaction; - this.tokenization = tokenization; - this.id = id; - this.downloadUrl = downloadUrl; - this.upsert = upsert; - this.tokens = tokens; - this.additionalProperties = additionalProperties; - } - - /** - * @return Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT. - */ - @JsonProperty("fields") - public Optional> getFields() { - return fields; - } - - /** - * @return Name of the table to perform the operation on. - */ - @JsonProperty("tableName") - public Optional getTableName() { - return tableName; - } - - @JsonProperty("method") - public Optional getMethod() { - return method; - } - - /** - * @return ID to group operations by. Operations in the same group are executed sequentially. - */ - @JsonProperty("batchID") - public Optional getBatchId() { - return batchId; - } - - @JsonProperty("redaction") - public Optional getRedaction() { - return redaction; - } - - /** - * @return If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified. - */ - @JsonProperty("tokenization") - public Optional getTokenization() { - return tokenization; - } - - /** - * @return skyflow_id for the record. Only valid when method is GET, DELETE, or PUT. - */ - @JsonProperty("ID") - public Optional getId() { - return id; - } - - /** - * @return If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean. - */ - @JsonProperty("downloadURL") - public Optional getDownloadUrl() { - return downloadUrl; - } - - /** - * @return Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST. - */ - @JsonProperty("upsert") - public Optional getUpsert() { - return upsert; - } - - /** - * @return Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}. - */ - @JsonProperty("tokens") - public Optional> getTokens() { - return tokens; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1BatchRecord && equalTo((V1BatchRecord) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1BatchRecord other) { - return fields.equals(other.fields) - && tableName.equals(other.tableName) - && method.equals(other.method) - && batchId.equals(other.batchId) - && redaction.equals(other.redaction) - && tokenization.equals(other.tokenization) - && id.equals(other.id) - && downloadUrl.equals(other.downloadUrl) - && upsert.equals(other.upsert) - && tokens.equals(other.tokens); - } - - @Override - public int hashCode() { - return Objects.hash( - this.fields, - this.tableName, - this.method, - this.batchId, - this.redaction, - this.tokenization, - this.id, - this.downloadUrl, - this.upsert, - this.tokens); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> fields = Optional.empty(); - - private Optional tableName = Optional.empty(); - - private Optional method = Optional.empty(); - - private Optional batchId = Optional.empty(); - - private Optional redaction = Optional.empty(); - - private Optional tokenization = Optional.empty(); - - private Optional id = Optional.empty(); - - private Optional downloadUrl = Optional.empty(); - - private Optional upsert = Optional.empty(); - - private Optional> tokens = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1BatchRecord other) { - fields(other.getFields()); - tableName(other.getTableName()); - method(other.getMethod()); - batchId(other.getBatchId()); - redaction(other.getRedaction()); - tokenization(other.getTokenization()); - id(other.getId()); - downloadUrl(other.getDownloadUrl()); - upsert(other.getUpsert()); - tokens(other.getTokens()); - return this; - } - - /** - *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  - */ - @JsonSetter(value = "fields", nulls = Nulls.SKIP) - public Builder fields(Optional> fields) { - this.fields = fields; - return this; - } - - public Builder fields(Map fields) { - this.fields = Optional.ofNullable(fields); - return this; - } - - /** - *

                                  Name of the table to perform the operation on.

                                  - */ - @JsonSetter(value = "tableName", nulls = Nulls.SKIP) - public Builder tableName(Optional tableName) { - this.tableName = tableName; - return this; - } - - public Builder tableName(String tableName) { - this.tableName = Optional.ofNullable(tableName); - return this; - } - - @JsonSetter(value = "method", nulls = Nulls.SKIP) - public Builder method(Optional method) { - this.method = method; - return this; - } - - public Builder method(BatchRecordMethod method) { - this.method = Optional.ofNullable(method); - return this; - } - - /** - *

                                  ID to group operations by. Operations in the same group are executed sequentially.

                                  - */ - @JsonSetter(value = "batchID", nulls = Nulls.SKIP) - public Builder batchId(Optional batchId) { - this.batchId = batchId; - return this; - } - - public Builder batchId(String batchId) { - this.batchId = Optional.ofNullable(batchId); - return this; - } - - @JsonSetter(value = "redaction", nulls = Nulls.SKIP) - public Builder redaction(Optional redaction) { - this.redaction = redaction; - return this; - } - - public Builder redaction(RedactionEnumRedaction redaction) { - this.redaction = Optional.ofNullable(redaction); - return this; - } - - /** - *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  - */ - @JsonSetter(value = "tokenization", nulls = Nulls.SKIP) - public Builder tokenization(Optional tokenization) { - this.tokenization = tokenization; - return this; - } - - public Builder tokenization(Boolean tokenization) { - this.tokenization = Optional.ofNullable(tokenization); - return this; - } - - /** - *

                                  skyflow_id for the record. Only valid when method is GET, DELETE, or PUT.

                                  - */ - @JsonSetter(value = "ID", nulls = Nulls.SKIP) - public Builder id(Optional id) { - this.id = id; - return this; - } - - public Builder id(String id) { - this.id = Optional.ofNullable(id); - return this; - } - - /** - *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  - */ - @JsonSetter(value = "downloadURL", nulls = Nulls.SKIP) - public Builder downloadUrl(Optional downloadUrl) { - this.downloadUrl = downloadUrl; - return this; - } - - public Builder downloadUrl(Boolean downloadUrl) { - this.downloadUrl = Optional.ofNullable(downloadUrl); - return this; - } - - /** - *

                                  Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST.

                                  - */ - @JsonSetter(value = "upsert", nulls = Nulls.SKIP) - public Builder upsert(Optional upsert) { - this.upsert = upsert; - return this; - } - - public Builder upsert(String upsert) { - this.upsert = Optional.ofNullable(upsert); - return this; - } - - /** - *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  - */ - @JsonSetter(value = "tokens", nulls = Nulls.SKIP) - public Builder tokens(Optional> tokens) { - this.tokens = tokens; - return this; - } - - public Builder tokens(Map tokens) { - this.tokens = Optional.ofNullable(tokens); - return this; - } - - public V1BatchRecord build() { - return new V1BatchRecord( - fields, - tableName, - method, - batchId, - redaction, - tokenization, - id, - downloadUrl, - upsert, - tokens, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java deleted file mode 100644 index 88c1c125..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BinListResponse.Builder.class) -public final class V1BinListResponse { - private final Optional> cardsData; - - private final Map additionalProperties; - - private V1BinListResponse(Optional> cardsData, Map additionalProperties) { - this.cardsData = cardsData; - this.additionalProperties = additionalProperties; - } - - /** - * @return Card metadata associated with the specified BIN. - */ - @JsonProperty("cards_data") - public Optional> getCardsData() { - return cardsData; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1BinListResponse && equalTo((V1BinListResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1BinListResponse other) { - return cardsData.equals(other.cardsData); - } - - @Override - public int hashCode() { - return Objects.hash(this.cardsData); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> cardsData = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1BinListResponse other) { - cardsData(other.getCardsData()); - return this; - } - - /** - *

                                  Card metadata associated with the specified BIN.

                                  - */ - @JsonSetter(value = "cards_data", nulls = Nulls.SKIP) - public Builder cardsData(Optional> cardsData) { - this.cardsData = cardsData; - return this; - } - - public Builder cardsData(List cardsData) { - this.cardsData = Optional.ofNullable(cardsData); - return this; - } - - public V1BinListResponse build() { - return new V1BinListResponse(cardsData, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java deleted file mode 100644 index 27878fab..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BulkGetRecordResponse.Builder.class) -public final class V1BulkGetRecordResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1BulkGetRecordResponse(Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return The specified records. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1BulkGetRecordResponse && equalTo((V1BulkGetRecordResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1BulkGetRecordResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1BulkGetRecordResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  The specified records.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1BulkGetRecordResponse build() { - return new V1BulkGetRecordResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java deleted file mode 100644 index bafd7a09..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum V1Byot { - DISABLE("DISABLE"), - - ENABLE("ENABLE"), - - ENABLE_STRICT("ENABLE_STRICT"); - - private final String value; - - V1Byot(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Card.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Card.java deleted file mode 100644 index ba4f7349..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Card.java +++ /dev/null @@ -1,357 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1Card.Builder.class) -public final class V1Card { - private final Optional bin; - - private final Optional issuerName; - - private final Optional countryCode; - - private final Optional currency; - - private final Optional cardType; - - private final Optional cardCategory; - - private final Optional cardScheme; - - private final Optional cardLastFourDigits; - - private final Optional cardExpiry; - - private final Map additionalProperties; - - private V1Card( - Optional bin, - Optional issuerName, - Optional countryCode, - Optional currency, - Optional cardType, - Optional cardCategory, - Optional cardScheme, - Optional cardLastFourDigits, - Optional cardExpiry, - Map additionalProperties) { - this.bin = bin; - this.issuerName = issuerName; - this.countryCode = countryCode; - this.currency = currency; - this.cardType = cardType; - this.cardCategory = cardCategory; - this.cardScheme = cardScheme; - this.cardLastFourDigits = cardLastFourDigits; - this.cardExpiry = cardExpiry; - this.additionalProperties = additionalProperties; - } - - /** - * @return BIN of the card. - */ - @JsonProperty("BIN") - public Optional getBin() { - return bin; - } - - /** - * @return Name of the card issuer bank. - */ - @JsonProperty("issuer_name") - public Optional getIssuerName() { - return issuerName; - } - - /** - * @return Country code of the card. - */ - @JsonProperty("country_code") - public Optional getCountryCode() { - return countryCode; - } - - /** - * @return Currency of the card. - */ - @JsonProperty("currency") - public Optional getCurrency() { - return currency; - } - - /** - * @return Type of the card. - */ - @JsonProperty("card_type") - public Optional getCardType() { - return cardType; - } - - /** - * @return Category of the card. - */ - @JsonProperty("card_category") - public Optional getCardCategory() { - return cardCategory; - } - - /** - * @return Scheme of the card. - */ - @JsonProperty("card_scheme") - public Optional getCardScheme() { - return cardScheme; - } - - /** - * @return Last four digits of the card number. - */ - @JsonProperty("card_last_four_digits") - public Optional getCardLastFourDigits() { - return cardLastFourDigits; - } - - /** - * @return Expiry date of the card. - */ - @JsonProperty("card_expiry") - public Optional getCardExpiry() { - return cardExpiry; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1Card && equalTo((V1Card) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1Card other) { - return bin.equals(other.bin) - && issuerName.equals(other.issuerName) - && countryCode.equals(other.countryCode) - && currency.equals(other.currency) - && cardType.equals(other.cardType) - && cardCategory.equals(other.cardCategory) - && cardScheme.equals(other.cardScheme) - && cardLastFourDigits.equals(other.cardLastFourDigits) - && cardExpiry.equals(other.cardExpiry); - } - - @Override - public int hashCode() { - return Objects.hash( - this.bin, - this.issuerName, - this.countryCode, - this.currency, - this.cardType, - this.cardCategory, - this.cardScheme, - this.cardLastFourDigits, - this.cardExpiry); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional bin = Optional.empty(); - - private Optional issuerName = Optional.empty(); - - private Optional countryCode = Optional.empty(); - - private Optional currency = Optional.empty(); - - private Optional cardType = Optional.empty(); - - private Optional cardCategory = Optional.empty(); - - private Optional cardScheme = Optional.empty(); - - private Optional cardLastFourDigits = Optional.empty(); - - private Optional cardExpiry = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1Card other) { - bin(other.getBin()); - issuerName(other.getIssuerName()); - countryCode(other.getCountryCode()); - currency(other.getCurrency()); - cardType(other.getCardType()); - cardCategory(other.getCardCategory()); - cardScheme(other.getCardScheme()); - cardLastFourDigits(other.getCardLastFourDigits()); - cardExpiry(other.getCardExpiry()); - return this; - } - - /** - *

                                  BIN of the card.

                                  - */ - @JsonSetter(value = "BIN", nulls = Nulls.SKIP) - public Builder bin(Optional bin) { - this.bin = bin; - return this; - } - - public Builder bin(String bin) { - this.bin = Optional.ofNullable(bin); - return this; - } - - /** - *

                                  Name of the card issuer bank.

                                  - */ - @JsonSetter(value = "issuer_name", nulls = Nulls.SKIP) - public Builder issuerName(Optional issuerName) { - this.issuerName = issuerName; - return this; - } - - public Builder issuerName(String issuerName) { - this.issuerName = Optional.ofNullable(issuerName); - return this; - } - - /** - *

                                  Country code of the card.

                                  - */ - @JsonSetter(value = "country_code", nulls = Nulls.SKIP) - public Builder countryCode(Optional countryCode) { - this.countryCode = countryCode; - return this; - } - - public Builder countryCode(String countryCode) { - this.countryCode = Optional.ofNullable(countryCode); - return this; - } - - /** - *

                                  Currency of the card.

                                  - */ - @JsonSetter(value = "currency", nulls = Nulls.SKIP) - public Builder currency(Optional currency) { - this.currency = currency; - return this; - } - - public Builder currency(String currency) { - this.currency = Optional.ofNullable(currency); - return this; - } - - /** - *

                                  Type of the card.

                                  - */ - @JsonSetter(value = "card_type", nulls = Nulls.SKIP) - public Builder cardType(Optional cardType) { - this.cardType = cardType; - return this; - } - - public Builder cardType(String cardType) { - this.cardType = Optional.ofNullable(cardType); - return this; - } - - /** - *

                                  Category of the card.

                                  - */ - @JsonSetter(value = "card_category", nulls = Nulls.SKIP) - public Builder cardCategory(Optional cardCategory) { - this.cardCategory = cardCategory; - return this; - } - - public Builder cardCategory(String cardCategory) { - this.cardCategory = Optional.ofNullable(cardCategory); - return this; - } - - /** - *

                                  Scheme of the card.

                                  - */ - @JsonSetter(value = "card_scheme", nulls = Nulls.SKIP) - public Builder cardScheme(Optional cardScheme) { - this.cardScheme = cardScheme; - return this; - } - - public Builder cardScheme(String cardScheme) { - this.cardScheme = Optional.ofNullable(cardScheme); - return this; - } - - /** - *

                                  Last four digits of the card number.

                                  - */ - @JsonSetter(value = "card_last_four_digits", nulls = Nulls.SKIP) - public Builder cardLastFourDigits(Optional cardLastFourDigits) { - this.cardLastFourDigits = cardLastFourDigits; - return this; - } - - public Builder cardLastFourDigits(String cardLastFourDigits) { - this.cardLastFourDigits = Optional.ofNullable(cardLastFourDigits); - return this; - } - - /** - *

                                  Expiry date of the card.

                                  - */ - @JsonSetter(value = "card_expiry", nulls = Nulls.SKIP) - public Builder cardExpiry(Optional cardExpiry) { - this.cardExpiry = cardExpiry; - return this; - } - - public Builder cardExpiry(String cardExpiry) { - this.cardExpiry = Optional.ofNullable(cardExpiry); - return this; - } - - public V1Card build() { - return new V1Card( - bin, - issuerName, - countryCode, - currency, - cardType, - cardCategory, - cardScheme, - cardLastFourDigits, - cardExpiry, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java deleted file mode 100644 index 4d9b24eb..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DeleteFileResponse.Builder.class) -public final class V1DeleteFileResponse { - private final Optional skyflowId; - - private final Optional deleted; - - private final Map additionalProperties; - - private V1DeleteFileResponse( - Optional skyflowId, Optional deleted, Map additionalProperties) { - this.skyflowId = skyflowId; - this.deleted = deleted; - this.additionalProperties = additionalProperties; - } - - /** - * @return ID of the record. - */ - @JsonProperty("skyflow_id") - public Optional getSkyflowId() { - return skyflowId; - } - - /** - * @return If true, the file was deleted. - */ - @JsonProperty("deleted") - public Optional getDeleted() { - return deleted; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1DeleteFileResponse && equalTo((V1DeleteFileResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1DeleteFileResponse other) { - return skyflowId.equals(other.skyflowId) && deleted.equals(other.deleted); - } - - @Override - public int hashCode() { - return Objects.hash(this.skyflowId, this.deleted); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional skyflowId = Optional.empty(); - - private Optional deleted = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1DeleteFileResponse other) { - skyflowId(other.getSkyflowId()); - deleted(other.getDeleted()); - return this; - } - - /** - *

                                  ID of the record.

                                  - */ - @JsonSetter(value = "skyflow_id", nulls = Nulls.SKIP) - public Builder skyflowId(Optional skyflowId) { - this.skyflowId = skyflowId; - return this; - } - - public Builder skyflowId(String skyflowId) { - this.skyflowId = Optional.ofNullable(skyflowId); - return this; - } - - /** - *

                                  If true, the file was deleted.

                                  - */ - @JsonSetter(value = "deleted", nulls = Nulls.SKIP) - public Builder deleted(Optional deleted) { - this.deleted = deleted; - return this; - } - - public Builder deleted(Boolean deleted) { - this.deleted = Optional.ofNullable(deleted); - return this; - } - - public V1DeleteFileResponse build() { - return new V1DeleteFileResponse(skyflowId, deleted, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java deleted file mode 100644 index b6fb9cb6..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DetokenizeRecordRequest.Builder.class) -public final class V1DetokenizeRecordRequest { - private final Optional token; - - private final Optional redaction; - - private final Map additionalProperties; - - private V1DetokenizeRecordRequest( - Optional token, - Optional redaction, - Map additionalProperties) { - this.token = token; - this.redaction = redaction; - this.additionalProperties = additionalProperties; - } - - /** - * @return Token that identifies the record to detokenize. - */ - @JsonProperty("token") - public Optional getToken() { - return token; - } - - @JsonProperty("redaction") - public Optional getRedaction() { - return redaction; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1DetokenizeRecordRequest && equalTo((V1DetokenizeRecordRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1DetokenizeRecordRequest other) { - return token.equals(other.token) && redaction.equals(other.redaction); - } - - @Override - public int hashCode() { - return Objects.hash(this.token, this.redaction); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional token = Optional.empty(); - - private Optional redaction = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1DetokenizeRecordRequest other) { - token(other.getToken()); - redaction(other.getRedaction()); - return this; - } - - /** - *

                                  Token that identifies the record to detokenize.

                                  - */ - @JsonSetter(value = "token", nulls = Nulls.SKIP) - public Builder token(Optional token) { - this.token = token; - return this; - } - - public Builder token(String token) { - this.token = Optional.ofNullable(token); - return this; - } - - @JsonSetter(value = "redaction", nulls = Nulls.SKIP) - public Builder redaction(Optional redaction) { - this.redaction = redaction; - return this; - } - - public Builder redaction(RedactionEnumRedaction redaction) { - this.redaction = Optional.ofNullable(redaction); - return this; - } - - public V1DetokenizeRecordRequest build() { - return new V1DetokenizeRecordRequest(token, redaction, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java deleted file mode 100644 index 53660cbe..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DetokenizeResponse.Builder.class) -public final class V1DetokenizeResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1DetokenizeResponse( - Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return Records corresponding to the specified tokens. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1DetokenizeResponse && equalTo((V1DetokenizeResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1DetokenizeResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1DetokenizeResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  Records corresponding to the specified tokens.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1DetokenizeResponse build() { - return new V1DetokenizeResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java deleted file mode 100644 index 02658ef2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum V1FileAvScanStatus { - SCAN_NONE("SCAN_NONE"), - - SCAN_CLEAN("SCAN_CLEAN"), - - SCAN_INFECTED("SCAN_INFECTED"), - - SCAN_DELETED("SCAN_DELETED"), - - SCAN_ERROR("SCAN_ERROR"), - - SCAN_PENDING("SCAN_PENDING"), - - SCAN_UNSCANNABLE("SCAN_UNSCANNABLE"), - - SCAN_FILE_NOT_FOUND("SCAN_FILE_NOT_FOUND"), - - SCAN_INVALID("SCAN_INVALID"); - - private final String value; - - V1FileAvScanStatus(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java deleted file mode 100644 index 43a86ae0..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1GetAuthTokenResponse.Builder.class) -public final class V1GetAuthTokenResponse { - private final Optional accessToken; - - private final Optional tokenType; - - private final Map additionalProperties; - - private V1GetAuthTokenResponse( - Optional accessToken, Optional tokenType, Map additionalProperties) { - this.accessToken = accessToken; - this.tokenType = tokenType; - this.additionalProperties = additionalProperties; - } - - /** - * @return AccessToken. - */ - @JsonProperty("accessToken") - public Optional getAccessToken() { - return accessToken; - } - - /** - * @return TokenType : Bearer. - */ - @JsonProperty("tokenType") - public Optional getTokenType() { - return tokenType; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1GetAuthTokenResponse && equalTo((V1GetAuthTokenResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1GetAuthTokenResponse other) { - return accessToken.equals(other.accessToken) && tokenType.equals(other.tokenType); - } - - @Override - public int hashCode() { - return Objects.hash(this.accessToken, this.tokenType); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional accessToken = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1GetAuthTokenResponse other) { - accessToken(other.getAccessToken()); - tokenType(other.getTokenType()); - return this; - } - - /** - *

                                  AccessToken.

                                  - */ - @JsonSetter(value = "accessToken", nulls = Nulls.SKIP) - public Builder accessToken(Optional accessToken) { - this.accessToken = accessToken; - return this; - } - - public Builder accessToken(String accessToken) { - this.accessToken = Optional.ofNullable(accessToken); - return this; - } - - /** - *

                                  TokenType : Bearer.

                                  - */ - @JsonSetter(value = "tokenType", nulls = Nulls.SKIP) - public Builder tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - public Builder tokenType(String tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - public V1GetAuthTokenResponse build() { - return new V1GetAuthTokenResponse(accessToken, tokenType, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java deleted file mode 100644 index 3138c766..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1GetFileScanStatusResponse.Builder.class) -public final class V1GetFileScanStatusResponse { - private final Optional avScanStatus; - - private final Map additionalProperties; - - private V1GetFileScanStatusResponse( - Optional avScanStatus, Map additionalProperties) { - this.avScanStatus = avScanStatus; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("av_scan_status") - public Optional getAvScanStatus() { - return avScanStatus; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1GetFileScanStatusResponse && equalTo((V1GetFileScanStatusResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1GetFileScanStatusResponse other) { - return avScanStatus.equals(other.avScanStatus); - } - - @Override - public int hashCode() { - return Objects.hash(this.avScanStatus); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional avScanStatus = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1GetFileScanStatusResponse other) { - avScanStatus(other.getAvScanStatus()); - return this; - } - - @JsonSetter(value = "av_scan_status", nulls = Nulls.SKIP) - public Builder avScanStatus(Optional avScanStatus) { - this.avScanStatus = avScanStatus; - return this; - } - - public Builder avScanStatus(V1FileAvScanStatus avScanStatus) { - this.avScanStatus = Optional.ofNullable(avScanStatus); - return this; - } - - public V1GetFileScanStatusResponse build() { - return new V1GetFileScanStatusResponse(avScanStatus, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java deleted file mode 100644 index a44b0f62..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1GetQueryResponse.Builder.class) -public final class V1GetQueryResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1GetQueryResponse(Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return Records returned by the query. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1GetQueryResponse && equalTo((V1GetQueryResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1GetQueryResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1GetQueryResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  Records returned by the query.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1GetQueryResponse build() { - return new V1GetQueryResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java deleted file mode 100644 index f8a00001..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1InsertRecordResponse.Builder.class) -public final class V1InsertRecordResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1InsertRecordResponse( - Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return Identifiers for the inserted records. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1InsertRecordResponse && equalTo((V1InsertRecordResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1InsertRecordResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1InsertRecordResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  Identifiers for the inserted records.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1InsertRecordResponse build() { - return new V1InsertRecordResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java deleted file mode 100644 index 48e96379..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum V1MemberType { - NONE("NONE"), - - USER("USER"), - - SERVICE_ACCOUNT("SERVICE_ACCOUNT"); - - private final String value; - - V1MemberType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java deleted file mode 100644 index 43fe264a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1TokenizeRecordRequest.Builder.class) -public final class V1TokenizeRecordRequest { - private final Optional value; - - private final Optional columnGroup; - - private final Map additionalProperties; - - private V1TokenizeRecordRequest( - Optional value, Optional columnGroup, Map additionalProperties) { - this.value = value; - this.columnGroup = columnGroup; - this.additionalProperties = additionalProperties; - } - - /** - * @return Existing value to return a token for. - */ - @JsonProperty("value") - public Optional getValue() { - return value; - } - - /** - * @return Name of the column group that the value belongs to. - */ - @JsonProperty("columnGroup") - public Optional getColumnGroup() { - return columnGroup; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1TokenizeRecordRequest && equalTo((V1TokenizeRecordRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1TokenizeRecordRequest other) { - return value.equals(other.value) && columnGroup.equals(other.columnGroup); - } - - @Override - public int hashCode() { - return Objects.hash(this.value, this.columnGroup); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional value = Optional.empty(); - - private Optional columnGroup = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1TokenizeRecordRequest other) { - value(other.getValue()); - columnGroup(other.getColumnGroup()); - return this; - } - - /** - *

                                  Existing value to return a token for.

                                  - */ - @JsonSetter(value = "value", nulls = Nulls.SKIP) - public Builder value(Optional value) { - this.value = value; - return this; - } - - public Builder value(String value) { - this.value = Optional.ofNullable(value); - return this; - } - - /** - *

                                  Name of the column group that the value belongs to.

                                  - */ - @JsonSetter(value = "columnGroup", nulls = Nulls.SKIP) - public Builder columnGroup(Optional columnGroup) { - this.columnGroup = columnGroup; - return this; - } - - public Builder columnGroup(String columnGroup) { - this.columnGroup = Optional.ofNullable(columnGroup); - return this; - } - - public V1TokenizeRecordRequest build() { - return new V1TokenizeRecordRequest(value, columnGroup, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java deleted file mode 100644 index 66721fa1..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1TokenizeRecordResponse.Builder.class) -public final class V1TokenizeRecordResponse { - private final Optional token; - - private final Map additionalProperties; - - private V1TokenizeRecordResponse(Optional token, Map additionalProperties) { - this.token = token; - this.additionalProperties = additionalProperties; - } - - /** - * @return Token corresponding to a value. - */ - @JsonProperty("token") - public Optional getToken() { - return token; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1TokenizeRecordResponse && equalTo((V1TokenizeRecordResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1TokenizeRecordResponse other) { - return token.equals(other.token); - } - - @Override - public int hashCode() { - return Objects.hash(this.token); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional token = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1TokenizeRecordResponse other) { - token(other.getToken()); - return this; - } - - /** - *

                                  Token corresponding to a value.

                                  - */ - @JsonSetter(value = "token", nulls = Nulls.SKIP) - public Builder token(Optional token) { - this.token = token; - return this; - } - - public Builder token(String token) { - this.token = Optional.ofNullable(token); - return this; - } - - public V1TokenizeRecordResponse build() { - return new V1TokenizeRecordResponse(token, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java deleted file mode 100644 index 05e64bc0..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1TokenizeResponse.Builder.class) -public final class V1TokenizeResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1TokenizeResponse( - Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return Tokens corresponding to the specified values. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1TokenizeResponse && equalTo((V1TokenizeResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1TokenizeResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1TokenizeResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  Tokens corresponding to the specified values.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1TokenizeResponse build() { - return new V1TokenizeResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java deleted file mode 100644 index 6fc09854..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java +++ /dev/null @@ -1,158 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1VaultFieldMapping.Builder.class) -public final class V1VaultFieldMapping { - private final Optional cardNumber; - - private final Optional cardLastFourDigits; - - private final Optional cardExpiry; - - private final Map additionalProperties; - - private V1VaultFieldMapping( - Optional cardNumber, - Optional cardLastFourDigits, - Optional cardExpiry, - Map additionalProperties) { - this.cardNumber = cardNumber; - this.cardLastFourDigits = cardLastFourDigits; - this.cardExpiry = cardExpiry; - this.additionalProperties = additionalProperties; - } - - /** - * @return Name of the column that stores the card number. - */ - @JsonProperty("card_number") - public Optional getCardNumber() { - return cardNumber; - } - - /** - * @return Name of the column that stores the card number suffix. - */ - @JsonProperty("card_last_four_digits") - public Optional getCardLastFourDigits() { - return cardLastFourDigits; - } - - /** - * @return Name of the column that stores the expiry date. - */ - @JsonProperty("card_expiry") - public Optional getCardExpiry() { - return cardExpiry; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1VaultFieldMapping && equalTo((V1VaultFieldMapping) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1VaultFieldMapping other) { - return cardNumber.equals(other.cardNumber) - && cardLastFourDigits.equals(other.cardLastFourDigits) - && cardExpiry.equals(other.cardExpiry); - } - - @Override - public int hashCode() { - return Objects.hash(this.cardNumber, this.cardLastFourDigits, this.cardExpiry); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional cardNumber = Optional.empty(); - - private Optional cardLastFourDigits = Optional.empty(); - - private Optional cardExpiry = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1VaultFieldMapping other) { - cardNumber(other.getCardNumber()); - cardLastFourDigits(other.getCardLastFourDigits()); - cardExpiry(other.getCardExpiry()); - return this; - } - - /** - *

                                  Name of the column that stores the card number.

                                  - */ - @JsonSetter(value = "card_number", nulls = Nulls.SKIP) - public Builder cardNumber(Optional cardNumber) { - this.cardNumber = cardNumber; - return this; - } - - public Builder cardNumber(String cardNumber) { - this.cardNumber = Optional.ofNullable(cardNumber); - return this; - } - - /** - *

                                  Name of the column that stores the card number suffix.

                                  - */ - @JsonSetter(value = "card_last_four_digits", nulls = Nulls.SKIP) - public Builder cardLastFourDigits(Optional cardLastFourDigits) { - this.cardLastFourDigits = cardLastFourDigits; - return this; - } - - public Builder cardLastFourDigits(String cardLastFourDigits) { - this.cardLastFourDigits = Optional.ofNullable(cardLastFourDigits); - return this; - } - - /** - *

                                  Name of the column that stores the expiry date.

                                  - */ - @JsonSetter(value = "card_expiry", nulls = Nulls.SKIP) - public Builder cardExpiry(Optional cardExpiry) { - this.cardExpiry = cardExpiry; - return this; - } - - public Builder cardExpiry(String cardExpiry) { - this.cardExpiry = Optional.ofNullable(cardExpiry); - return this; - } - - public V1VaultFieldMapping build() { - return new V1VaultFieldMapping(cardNumber, cardLastFourDigits, cardExpiry, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java deleted file mode 100644 index 1542ab0f..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1VaultSchemaConfig.Builder.class) -public final class V1VaultSchemaConfig { - private final Optional id; - - private final Optional tableName; - - private final Optional mapping; - - private final Map additionalProperties; - - private V1VaultSchemaConfig( - Optional id, - Optional tableName, - Optional mapping, - Map additionalProperties) { - this.id = id; - this.tableName = tableName; - this.mapping = mapping; - this.additionalProperties = additionalProperties; - } - - /** - * @return ID of the vault that stores card details. - */ - @JsonProperty("id") - public Optional getId() { - return id; - } - - /** - * @return Name of the table that stores card details. - */ - @JsonProperty("table_name") - public Optional getTableName() { - return tableName; - } - - @JsonProperty("mapping") - public Optional getMapping() { - return mapping; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1VaultSchemaConfig && equalTo((V1VaultSchemaConfig) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1VaultSchemaConfig other) { - return id.equals(other.id) && tableName.equals(other.tableName) && mapping.equals(other.mapping); - } - - @Override - public int hashCode() { - return Objects.hash(this.id, this.tableName, this.mapping); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional id = Optional.empty(); - - private Optional tableName = Optional.empty(); - - private Optional mapping = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1VaultSchemaConfig other) { - id(other.getId()); - tableName(other.getTableName()); - mapping(other.getMapping()); - return this; - } - - /** - *

                                  ID of the vault that stores card details.

                                  - */ - @JsonSetter(value = "id", nulls = Nulls.SKIP) - public Builder id(Optional id) { - this.id = id; - return this; - } - - public Builder id(String id) { - this.id = Optional.ofNullable(id); - return this; - } - - /** - *

                                  Name of the table that stores card details.

                                  - */ - @JsonSetter(value = "table_name", nulls = Nulls.SKIP) - public Builder tableName(Optional tableName) { - this.tableName = tableName; - return this; - } - - public Builder tableName(String tableName) { - this.tableName = Optional.ofNullable(tableName); - return this; - } - - @JsonSetter(value = "mapping", nulls = Nulls.SKIP) - public Builder mapping(Optional mapping) { - this.mapping = mapping; - return this; - } - - public Builder mapping(V1VaultFieldMapping mapping) { - this.mapping = Optional.ofNullable(mapping); - return this; - } - - public V1VaultSchemaConfig build() { - return new V1VaultSchemaConfig(id, tableName, mapping, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java deleted file mode 100644 index 314b5942..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = WordCharacterCount.Builder.class) -public final class WordCharacterCount { - private final Optional wordCount; - - private final Optional characterCount; - - private final Map additionalProperties; - - private WordCharacterCount( - Optional wordCount, Optional characterCount, Map additionalProperties) { - this.wordCount = wordCount; - this.characterCount = characterCount; - this.additionalProperties = additionalProperties; - } - - /** - * @return Number of words in the processed text. - */ - @JsonProperty("wordCount") - public Optional getWordCount() { - return wordCount; - } - - /** - * @return Number of characters in the processed text. - */ - @JsonProperty("characterCount") - public Optional getCharacterCount() { - return characterCount; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof WordCharacterCount && equalTo((WordCharacterCount) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(WordCharacterCount other) { - return wordCount.equals(other.wordCount) && characterCount.equals(other.characterCount); - } - - @Override - public int hashCode() { - return Objects.hash(this.wordCount, this.characterCount); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Builder builder() { - return new Builder(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder { - private Optional wordCount = Optional.empty(); - - private Optional characterCount = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(WordCharacterCount other) { - wordCount(other.getWordCount()); - characterCount(other.getCharacterCount()); - return this; - } - - /** - *

                                  Number of words in the processed text.

                                  - */ - @JsonSetter(value = "wordCount", nulls = Nulls.SKIP) - public Builder wordCount(Optional wordCount) { - this.wordCount = wordCount; - return this; - } - - public Builder wordCount(Integer wordCount) { - this.wordCount = Optional.ofNullable(wordCount); - return this; - } - - /** - *

                                  Number of characters in the processed text.

                                  - */ - @JsonSetter(value = "characterCount", nulls = Nulls.SKIP) - public Builder characterCount(Optional characterCount) { - this.characterCount = characterCount; - return this; - } - - public Builder characterCount(Integer characterCount) { - this.characterCount = Optional.ofNullable(characterCount); - return this; - } - - public WordCharacterCount build() { - return new WordCharacterCount(wordCount, characterCount, additionalProperties); - } - } -} From 91085f13aac9f71628aacd71e090a8e44008e28c Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 17:39:09 +0530 Subject: [PATCH 12/13] SK-3175 updated skyvault generated code --- flowvault/README.md | 2 +- skyvault/api-report/skyflow-java.baseline.jar | Bin 1373082 -> 1214677 bytes .../main/java/com/skyflow/VaultClient.java | 82 ++-- .../resources/files/AsyncFilesClient.java | 9 +- .../resources/files/AsyncRawFilesClient.java | 14 +- .../rest/resources/files/FilesClient.java | 9 +- .../rest/resources/files/RawFilesClient.java | 14 +- .../files/requests/UploadFileRequestV2.java | 44 +-- .../rest/types/RedactionEnumRedaction.java | 28 ++ .../skyflow/generated/rest/types/V1Byot.java | 26 ++ .../types/V1DetokenizeRecordResponse.java | 182 +++++++++ .../vault/controller/VaultController.java | 142 ++++--- .../tokens/DetokenizeRecordResponse.java | 30 +- .../com/skyflow/RequestFidelityTests.java | 354 +++++++++--------- .../java/com/skyflow/VaultClientTests.java | 41 +- .../controller/VaultControllerTests.java | 227 ++++++----- .../skyflow/vault/tokens/DetokenizeTests.java | 27 +- 17 files changed, 745 insertions(+), 486 deletions(-) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java diff --git a/flowvault/README.md b/flowvault/README.md index 589e7107..378de9a0 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1896,7 +1896,7 @@ if (response.getValidation() == GuardrailsValidation.FAILED) { All Detect methods throw `SkyflowException` as described in [Error Handling](#error-handling). Client-side validation fails before any network call. -See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java) [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). +See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [DeidentifyFileSample.java](samples/src/main/java/com/example/detect/DeidentifyFileSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java), [ReidentifyFileSample.java](samples/src/main/java/com/example/detect/ReidentifyFileSample.java), [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). # Custom Request Headers diff --git a/skyvault/api-report/skyflow-java.baseline.jar b/skyvault/api-report/skyflow-java.baseline.jar index da729c8793f74d796093dbc51159c28932ad6b0b..dc2ace2b0c194a0cf1a0cf8d0b503b619f8a5997 100644 GIT binary patch delta 516426 zcmZshb9Ch2-le-^+qP}n?AS@iw$&BewryJ-+qUhbV@&#Y?>lqn&aCfRb*lcWQ?<_i z>}T(jcBHfrD+TjI8W;rS8w3QzHz@yD7;d1iSIKRl2fujg?@WIez3*Iqm-O!S607YXXeM2X6TN@HpeJf{UIzuac zN5@KKOQpFV2)xbJ1*{U4VSYIj6tpFX1Ly>b<_l7^Fq8{n(U2F7U{ZPJW&YW3l8Pn? zGcz~!{G;|)tW;t7_*UE(Ct2rNyzQ+gNAy>GKp1@ye&6~c!|IFJRhRIWGSNLE*Vb8i zbr*Ct0oP8p@07O3n3tU8>rJ}1pt|!iJVSN}8&GX5_uB}zIG9jgzQX;|-B`i5%^szV- z02a)%QJMD{k>QrJFtc1D+d^uym9AM8tz)wp-BPIgHTX~|8<)g>W|#(jY8C0rv#fAa z>)=2mZYAb!bL(S&>0~F!~peT?vxQ>>iO{+sSW?FNm_p0O+Kk z$^9sblvp|T1pLXyBW^rocqD)V$bfwb;8XA#hnm0~1-Ql>j03yyOC!!%p_1LUa!V#MJfKol!*Na(Nt87t2?w7KpC)EwuFNL*gGS-t)TCemXx!CQIPZ(>WB6nKV<+xMDMk{bBI6p9 z0>`ONu1D@M*MirxE&dOfZ44XHX+NKcoG^r5q{WFd=r+}b2@P6)R>0I~Re)W#KGvmA zfIx?19V(Qjv50boFBPFmlSP_RE3Z}{n-YrHkpq5-b^RZElpq*RD;cCadn zV<%#NjqV^ADt4{82H;$Di$dm`$3kokW0p>8>gME_mp?7lYORVNQ!%%r@FELxC{}0= z@S5@YkJ|WZICe@lNTy26B3&K-jb&oP>M-wR`4vkbpB;=UW9c90PZSd-_a2E5HH4eb z4%avzvZ(e^8)TdK)u%xk2F==C2|r@@r7insQ!bU4S+e;{b^!?4(P8fJYg+Eo1Nt}` zK-mn`Mb7cd_5>de8>;r=zZs=uxg5z@V`(XmlMpbcio_h2q*B8RvI`WW3d8bK8~pIf zR0!kcU=x|lClmM*Uvl(%r_b)>8Lq5RH;#|;6T;#*%_KzO@tq0scVVt@+=XAyJAbh2J;l&dYh+p5L4vnv!U%|B1hSnV{d9{@h!MnQ)^2^E=I~A-~$F*)}3# zm?Lh|h#AmVIxAt5f>lth{pWKoHczE_>^$PPWy@#xI$yt|;0CvW;<&KNhCPO}jM<6p zo~a_3!rL{qC#9ip+m*^V1^If+2Pjmgj1R-R&dHrjzRQOO>TLnNXF$YFen`xHA9?At zY_^gF#q==}|5l84`qOtsqGt?;yfel;c=Iw)QGEbf!I7$m4e%#elRmc;OZ^ygU%fY>z=gfG{L_pe=P|K6NB~g@M;qYxo}tz)I)!U(plzBLSYSVLhdsK(HJ_g^_`Rk;PeZ6c{BnfR(=uUN^bSB7h8XB`@(txM4dJLyxiftBCvX?LBCVr+ zmy{Z8*2Up+J@nrya--3~zkIthj5Gawey=wrA+PrO7*QkfjH}JhlhDlh%SlM#)+L2_gjQ zMGmG$_|;F)g;&gh5a9_BwIJy82o@JJeK@rRm&*C6jr9V%QPeI}QtK&P2`b=s^xXj9 zw{hQ5AoZ=@n&U1m$6okV>i1N^tCYu(l$Tj)%8d5b%8blAkafLmY?lL)n^AOxYG=AN zH7+ciJCSb-Kh0s~my#gmo0pfEMKFGG7$yy1*s#C*GcO0#SQ*0ZZ*p#-q9C4?vv<`Pd-V92u#p*2fl1SHWUcZ_p< z_qpC?c(2qiN#h6-X{jGRA0={Eqjd<&D1$+m^{We)t&bU=S1&KwfX^4~9&0mw76JsJ z`~ZS93^As`A}j0jLl#4=Nyp6eu!;IQzzD5YlPmOkTryNzt`WIPB)whv&to+Ctu`)Q zEH`~o004bALzvPPMlG8gvZ0Y9j7Qs1MAWuxo}&M}B@z26>4IsE#S%A}C>ujN?G!KK#Wady=Mj*Jgk&OQ?%F z+Q)aDU|r_H=N>JvB)6#Q0y((-Mi7b{BPNn3`r?swqaA-hz zKr|;NHZvPm8rIsrY*t-rWZE!kL6DPSZpC!oZy{XPj(2j&e9mg0y;(W~+{PMBC8DL1 zIL~aV{mx>OLA$Tp;ja~@3fS*@edDV$~_RW&vlzZJ@eNcw37?Fn{UZ6$cgtI7P4?8*LNK#_XVF_~}`5usH~Db~qPAFd{o zUifK=4MqvwG}fO1d%hC+rcx^g%K32y$^ zmQG1QRsG!B+MEJYmH=&!gKe4VPl`;?tUN^Nc~-i3d}^Z;%FDSjWuad76cnm$Egrkd z@wpQ)tac>t*OrcG`Q(8<)7KDsa$S$*3xrc%VdyO6s@|TfS6HuGS}>?*b_2>P2fE>SrqvQa4hsE!=G4tj*LPm$z*Z zA)bj{@zsfvkkPyX9R(8bciPKY+v2^tH@Q9NY?`>>i??|mqHuN0KSu70kWi-7Bi-y(K?k8d6g0GmsZ~J z|B5Fq>!$$3*Vtf0_)qbC{6{xl!ieQynnZCoyY zQ$sobBI_2jjJ5L?vz0V^ym6heH$P_$q9}42sz~6gBTS{k)_i40Q(NO$J)STJTg{A& zV3yhq9zYW#p~CvbGil5&Hw`>@wI~nwD&8+^3{&)3XK3>%%G9pTvNS}fAV*k~ybU7r z^Z4wrZGr(=tBe|b#P?OfX)n(YUPZgtIOt(+N3pj+IIN6VLLJi`a>lfwd{AXO$UctanisN{W)?{p)XH@>!!C3o7QiI7Im^4X1GA@sWtJz? zWYn_RZ|)a=Kg8fs7hZOpIhj-wKEBFHmo{DV6xQ85km>9_Mk4tdm$@(jyTRDcg&@{} z3-BLhP%))f^vn<;kMHqUy2x2f33Qe6EfHdw>ReGfYGG#kaY4c?qr6elDzstQb%5#V z)n^BrmsUr!HU|p!JZ~h_?7Xx$`8%uh;&es4%G%sRQc|nH+0GgTqH?F!<|UyTY;A2P zieib<2Ihzv@4Et>-@Xgtl=6af$pr|zJph(*y&_>@UAeDuMp7dX^fDGMl_k_Ne>vP~ zph$9iMHJu3ey}XVvJIy>Y$%RU7RuD27m`(P3=qc5`I_sm&lnN1!zEm1^TT34;(}Y_ z*AT+OrFZ;G3_(AGvR2`&>f*g)22Vt1qTp7ozLT-@fxZP9b9dcjj2CQJh}Bq)10d1P zas9waC1r35$YN(atg?ufDT~#43AI=N(glSlN4jd#f#NA@XRzH!`nPb<@8;TqX@5+y zvL?g!d5lMTX zy%18aSpyOm?9I`SY$;Ggfqaw)>0%27LOV?mNdv#GBeNs6cQT#Zfqtc6G2b*&R77EU zo*QT^qTo;ff`{LO+pcXul-&+w!f_Wrk46i z3Yz}Z&nBqIMJX)e>Ow|xbBId!)}r8_JwLgA=7e>S96w_7aa8o+(n71y29_z77&2vW zt3yoND3BVH5&`nenQ0i9>Fo=V>^f+s)kIC6fKI+0rW{D$tJGzb_10mAKQS>}CUy$f z@gr;*iDP(C%|w4U(F)vA%(3Z`I?aPD7*l)5 zGyT)SWSBKdL}BT5gnlTPlwpuPoi-APqM4@1BV(csB6Rp`7UFrpEy@O*{J_SZftw27D#;Ktx}^q;W?~dJe`4Lz*Qn zfBBKiCDbMLL_oduLAlCnK)$a|sP#j`eU^8aVeg+wVT80bXe&gU&qf%bJ$Pw|0N#p- zU2C`)ku0&KDxhG*`IyQrF07em;;{PMR3nbi50;Ux?|*;z>6$4etS^&J`js{PXU>$Y zp9D`4e=P_NF63-wDQ@hPtdE6^77qsv0g#U@7Q416M=7m`AX-EuMk6{#wtC>3%63+} z)Pn8Ogu?F$MpCn`%+NPU!%Vq5_yoxbe*_^F+Ip&to3Ph^&mLW|&jmIu`w2;f<4SYt zY0FLw$IR9>Y(m3*6~NC8NfqE!3I7En4y^Aw^^gIB>sQcy{M2Is4|6w5)}m&xvYEBI zs&v_Q>Mt~cnbV#Z@VT5WwLCSN0i^HWawEV;-NJQ+P$kEqEM~A>6^ukQ+y4QQ(2Fpt zzd(Ze-$0TRz?M98285b~fD8s`RNGQR7DxFY<5v$UCrUB1Lai(f0*QdIU`+7~2_vG& zRi9q8iTjS$OLu8gaSu4g-&Wc>4TtxTqs)3}DE7V({w&DaOw}Q#3nxeN9zI{^e*EQl z#qN3~_wjty%>Nx`TLFeJ098a;WTuxvolVX0Vf004;f=3(7}mxdu6iFpW5dm9>K(b( zTE5Px){^_#Q|!LdKsC3n%M6>&+yHYDbcuo?brNcPQJYlG>A}k0cz9ftt8#}g;i{!I z<~lVv9mWRAi1>gPY@V8o8)Vn!*%TSKR&Id*z${|C3VRqqV6tZ_vU>IU96I!QIvel|BsKWeoA&PCo4D0=z1urEml(BhTW@d5| zdC5e_Dj2I-5`_-1WqKTY(KYeD!wT@b+nYBKG1&@ox5wdZSWu18iaLbaGROQq7H zAnPksOj)JT>xv@)9MW8wMqQzbMW-IvspC3MXqGAC(L+W`h#hNHH-?C!i*3W1n9YTx zvm1i4k%Y)CHNwxN#g;+&)wdcOi=mf@eGIs=ZqvSpB<|2@7j|bO7Oc$`iE37J!{*NU z>#}j3Rn2l{RDo(okvqTPV!d)sZM-|vxp9#*Q@I*WXzZl{38!pum=9>UQhpqdQjZAF zksuFOz_tT)TpWF(-Bmm2r&fl_Q5a`St-@?X+%wJ_k1<^qdj)nfuJA911;DFB-fB`d zriK{A{zcd%gdg{{{HL)tmWg?Cwb~omqs39 z`~7xBwZeD+_R$4R(fbbQtAiMiJ&g2>G%pT^LJl_0yS6JE@lvxW)!E1}{7b54PUjV> zLct&T_yuzF_Wn5HKMvC>1}vWO01`RDygrY6^U+)OfG>TABCpSywRp?xkh!^KbU#3 z&8F^ca+u>ItO#Ny#n@xKB-!+}i*7Jbu;dB-=FIZT*Z7?Bkugb5UKRuKP|O;)4R)nr zfE^AG2~3DyVlqNo`W(oJqJ~pLSi=yX$q7&0;TC!67kI(XvizN=c-&hwbP1ysv`MjJ z4Wmc^z6cXom1W}XNk>b51vPv zuP2&Al$%q|@e|Pd<9EV9bn7L;pJ$J;p~!PEx%FxzY_WaHk~SdLtPWN$O~BUG;0yhNmIjYT9B-FffpdBvj@13y@2ReYS1$^R1I^5%TE?7iW)-pSqS!feb*XN-p%YaF zLmgZ01OD&Gk{JRnO8Ua1ivJHD#n%9V095R(Z1ulVwZGXKiJq9bjlR`?ID$&$F{wTQ z6yCl3TKcU&7n7nJ7$7<-pkIa{QB`<}iOevCOICUv3bmpY+_t+3&e+g%48wx2Waj^bHV zYLzYS278NeAYthQ3k^cW!!h#$sIyh)`?O&ZiMkg=YYoI?`A}sjqy@;?d|k_a)$Ykt z)sPn_!Ow+7`glU`%jHJZw01U7{n=QetvBIG4S{LQ+2ArM2n0D9pErvKIJ3|=EWcB$LMby1r`G?zVCxrw4G-8*m zk?xF;M!ZQ$l6O!R4`=*x#?DZv^_CRWuuDP_Mkp}s_p)dzh|04AqHJAHr%k%H)-O67w8M(mpD>XbcXII)%`aXUN*32 z`ENmC>2Kx1@Q_Qogq7w~&%{8h(_`{S8> zy>|t?E14!j5-oWto{aIy_14F~&m;rj^X?4)TNM$$D1<&JA}Xz!aSGkCXIi^wjrr=9 zrPlgx)a6ayq21D4hrc)A(!!C{(bYG7eXqRZC-;EL<>gw^7^bEv%-FRFCf!i7%RPCU z>Me|t*2*Ky+U$gK;(1qBHkNL59_$5FUhf~wpp|Vk*jOJA%rOS>SiS$Q9a&A5uPHZq90JZbj@W+!Y>4tVarpcak zv7Cg(lRnBjNA)%@>Xo5SZaJUwXquB4;-4pt@=>1vjDAtjWMwZOcucPHe^|E3*)=_v z{e$8g0rr4+OT~6r7)KDM*rz|d=#;mx6l7so&zjB@V+F0@-F8bAIgWCugCc7o!AK0J z^JdVYR1iR8Uk(K_B5V`GP=Z|{I2ZDil_-w6iDrYEbDo7AD9xlu>MzU6@YZU)7`C|7 zIRf3E){~qQ-MPeu4>HqqX|Iksn#xY4lbmSQLASM5aR;ft_J%ZD|9DZ7y~l6tmo!p* zoXN~VUi}FsC#t8M;~DN*?hM|-&WGa^fN2864#1*Q`m`9ijo|IFX#umJR8P7%0rIaa z8>z54ts2TK_AF}3M|aU#o4pTr`E|tB+(KWH7{C-@!YHkxXw98|9UHv`GTV(s>X} z2AJ_|XUvJF(&MWHi7J}C^dlSO#sY9A~D!RC)qk3};(whkOLE}={EN+~?vcj%*9?x3}dovboM z;)Be;eJX0RTE^~ll(ttLyA5n9T%!&w0Yo5Cz99Y&i-zJgZQt;ky5jN&4D!8^S-zTb z2p-lw&-V>#2Ua;t4-e%uQ{Zo?8Nq^B!fVdIL@OCyb5x5UK&&cl zcpJ%rMhctjtW|Y#bHpt13V>0LO(uE&^}9WowM9uKw=D68N?m5$&ie0SzEu_#MOC6( z?p3y4Am&FXbc^pwD!yHGOu}fc-YJGj)eOpGOt?LDxQ{ja*m`kaM7tHU{8Jpmo$iZh z(F}U8yQ;f{{sCI?s2<&Ux3l<7B;!P=FQEO!PX#hf%bdUcoll0ihC!87Ozu$I$Xd1m zZsbSwAzD+&?0inRuym zCj!B*e-P%|=xE5Q%}nFZ|GDz|K0Txr1f_5GraE$XZ~3l}c+PP=90*0DFfbP-Dw|;! z!pz2p!km;T|7c1t92rynN07Q)r?e=XHC@7N>YWb*ubKwAO?hg$8e7B-pYyBh(SGi; zKM9AS?cFY93z+OL+_EhfRlkKtD03?b^SFh=8dhAKmf7s0FO(cj|NJ|TMYp;Xn*Tpt z&p$i;i;(d^@d8H`Jey}0ykn5$ZgPYf`B4X%ZnJCpLQv^%*a&lnBI5r z4fK4+nu^*Nb>-d{(Wj?;{R^h-19lu{ zbeGn}wZ@9x{hNCKMv?UYM3HN&+f{5;o&yUj0N7gncB`=i7;&*LWaOfB|#9@78K%eOvshIOmAzp;Tvmbg~KrOGNTAh}&@F+D>F1X@i3p~JFH|EeiO3yg~ z2&3Y1h_XFD8gFRVV2Z`f!QLibbSC$RKdJvFr<%-(&o!=o6)9s8{b+bDSd1YgY_nGt zj1H5xkIHQY6AFtlFj8?a z-NSdZV}eUS z9S0ROnNReOC3qLmJGdc}sr3e6A8#Z^N+w}sbRt)N9EH}+WdO{ZDDJy+gt}fC3ULr5 z5{Ho}afd_x)`ak4_w?Sc8JLhmKQk~)IDbiWa@*ugqHg^VVSZd1H{JdoyN{pZtj4Gl z4wB00(pLr3cbbfh%-nYj>{;D>^)=XAx(RWYC(=PGWx?tDbj2?wSo~0cl66lGYv)m- zMo1;s16h?fTu{-nLD=|e9}Ikp07B4&6Yr}$Nx4^InCUYLv8xe=&W2+Rupnp_X#JQ& zTGl(lw3+g9u5O5%s=Q$G#$>Yt@>AmZ<|3Dzg4wknO5ST`QpQd8yRH4*GS=MY-*iY; zA~`1G2JkX+(5F!~WmWD0_NaY6I4W<5#5kqIehUzy|u&+wennfsvutCR0K;5V($v8BQt>Y0TAbS-xAqBCBmb(7EJhl7*ilX5i%60-0S=z`s0QKs`YhcT zh>N%MGk+TBa2g8fL`YP(6o82MH`o%9v0Su}~WY_$PG>P;Kmj z{Ia{QaQ|s}zZ#w|%lm~epa5elV<+Q(6O53vxs{Qz!@tWNbxXT-Rn(8ms->`{Tg&v8 z+6lB`Sp819c1T(C-XcP|*#aA!p%F4T$Y`SK>ZQ8IIAZho6re($vGiG?+=hb%^umj2 z%-w#cApM^~_%LsQJM?d$LEYE>J2;gU3w-PS?U>Q3vw($}$IQD-$Ek%s_#cnudce#6 z?0X>uWjV5EzMG&IaY>9U^)Z~B^#pe|IGI0Col1|zq6KGVLg#g`|6ln;)Sx!)B0AlXDfjtQh zsTgyKX+0Pduc?4^lNO*0>d3hay!zLYsIE2VkvRx8p z=vGp8KB^Q>bk=k*5N9(cIhIkt4)PGBq{%kMCgqSB>la*ZV!IM&>ETCx1X8+OQp07h zIDjG-ySs?f-ZKMHfYmZ%XX8o~%nUVI21ps?3@heBoHsEeinRX;yhEa30_#T-ay|?i z#8JHq#3wTmG7j3rV(@s*SGH@o{%qhbY{6E1vbPS+>PwD29w-L4lr#!!<(9;*Ak$t? zJeN7_j}@iN80;sYhDs6GrtDywa%FMSCmc~#uHHiwD)S?2I8-_EY<-oO!akox@)%!i!S{LRW*RG>83tZBU7N(Bh4T_8r;+kcGCBw(H*HN zT>R|3KgAtL;P@&!AgOux7u{Rt7l=yM)?i}Pmd``1Yq#GGRvIfjNM6a8k(sRMvS)Reg|wYH zyo)W8m$+;!Lp!)dNLJI_!f6z4nTz3MetGn_r_s2p%c5rW_`d!~-T)49H%oyi5jR&j z-?7a`wXeLlXEi#ycDm#5L3EHP408uaIAFDeF&^iYyP9 z9(hT=HynIpn!Aoq9RT?@0SH8{D~af;ZC+{&-XZi<)Q+k47F*EQj_`Ntr|s5zdZ58y z4mfVGxKEsrw_HKjV1ds?LyLN1_bX4Q&`(4+kekU$G2@;QlU57yc(M^XLpxhP->9O3 zA$B+S&W?L6AR5TOUEJIf^6+w>ypeKc*_mCBvE(qUsCE269tO;&%eW81vu5FSMoFS2 zujCOnZ7FsE&<(=Dt?YYuXaKAT@#0-*`_E^1b9nqMN__Egc-A6!;!nuqME%(#ZWw;1^Jqe&`H;=I*{+aSbHi3(K+5Q?P({SK+I$0qvT}zM(+2|wS=IX}7c)(hF zdQVeA`Hn>~H(NU$QJLiZDI{#mRWxRtwOiqWsKlP~;JR5re)_Hfy;=FH!hb4l}81HX$V;37thSMudsg--glM@H1B`F)9gmE3qm}h3$v@S_~T$ z-vYA4%^QEdqWcHEAmP&M^-#Mdf?XD9pyrBwFf){WAZ6-V9t}?6S>^q)2j4WidgA}f zS^X*=-rymGtRN$HsS=X*dPK2t!Ad2fGbQM?^|X zy23q?1glKDCBMoP(=hfxCZ<#@XRg!V6e0p44(>@pl9^!!3v5Trh?;7JK>2K^%&RM2fRs5R`hS7%( zr)yI9ktU#3HVQNK^wvqclB>SR^Sp2V+VRiIADH{<>-1jpJv>b7f)EVgLEy>jnO!fv zFVD0u`9D7%$bH7P?L`n+5ttQ%J%Xe;ZReoan$&Qvz%5l;dXE(MY4t#6Tt7yeB=txW!pOI})3og_hwPqi*FAK)Z9-ma(Oc|rVSg=B< z3&}Ck{&e+F*Vv&_^lOB7|Y+~B2Q!07Gs@Z&RNlobiqHl>&iy!Q9pxwlJn zUwLZvCN~kZ7C})b>{*ko&Ild@c3**9(RhL^LsPMcVlLeg#L4BbpQii8Ir^qOrX`@_ zRfU@x0`;jJHH4jZGJNmI_y);gXpIrl0znKddDIQfb?U#k3-l>(I6 z_R57OyWMXtLbEJvvjmj^oo|k8@ z*WlqE>P<3YN$;QdXo4*;iR4xyhFNf(p}u9b7@m3I8J((;G2i3U0V~-|QtmGxhzeCXxgT=7yP7o)L&w2{1v#(iVUf$_6`@nUg%>fncqh z9u_@AP=K<4$+uND0es4Olc#EdhAC7i z8pFbL&nw8ze!`9vLsw)%sEKM3rJew*GcrF_5`IzeA-0dH8DH9surg3;%3#n`fb_E{A$`QEhck`1?!`(mPy-1`0l=~G4j{SEesLu;R8$T@o1^9n2^8H)g zXv&Eo(6pp!m4$(-F-edz@v)zBW@|l5UpM4X z71ua^>I#ClOB3ALQiZV`(dWq4Hj|n@pB6@af0Fo(35);Lg;;h|7qs#CsNV;aEm05? z^8MBTJz^nY?6>Ox6H1#N>`&XNWV|QC7yUL~E@7ztJ0wWq_%jnlbm(A5EDqqiPk8Mz z1iOT?XUDWtor?0Ua|BS4FXDzBDI?T>5%kAQJwo^!TU82#sd(yZbJ;=;J0>dm zEhlQLoj}FwrJB{&`u13nX&i%6)5TNJvO=Qg!nM~W-&W1NbN>o9Bc52#5yyq z!eMA@m-rN?Pvl*@uQkJ5rkK*xGV0YxSZh@z6RPSP>YIDob>=oq+4x9^kkCRi!aQgY zwUJ#(oDc>7NA^~|FlyoQU4+@7h@&nGx`?o-O@%p!RAPsceYp0xlCov8IH*d{%%B0Y zEqbL?DDtkG5;oW)TN$8rU_HL{UyHju@;c(?eb@shJ|I=lT)4IM(+e($ncdx&k@2Fp&lr z#rA3wZhm6C&S&>^rBU?x{+b@|3Z8)`x?_lTRE^N2iJQJjSepPrQwt;Tjnb}uIFDv? z)+qTv*b5-AkUoOdlLdPe)0s%efGiPJJ_b^xs$DDs&+kez$T)^|!9CSUFqxX$I@VcGyh^IR75<#0l{)S_Q7-zUWLT$b{6Z8I$4-)Hh;HGMTnkaN`lRPV@| zNY%3d!UrIo();X?i`{u>iqK?xCcta1NV7xa3j~GNonYk-;uO|Qyu#hK~^Qc1fbcEQ3gYuPP z@^~IjYn{Z`h@m*N&>mCP8AIr{%(bKqiIke+8+wl!#`z7gTdV~TUz5_F9;qe)iGB-% z(foh~(_3(V%Ng98+mVEErwPpQbm$Z;)2#|dbZA80cW8Nz==jF+h|NT8g?^+beb4JN zlxeVso(p&`>)1lsRrYWzps$5)(sBJ+&11(@Q+ArSJ9gbwrVe>kF17FXTDBY8QJwdQ z+Ev87>qcXrJ)8oS*o{~^qMsuGIdYv7g4EK{Zm-BIHvaMhP29QZcfXR=`td9JUrz}a zlshf@6})BsSMa8)^JO%@C4;*n5PdZk2>+SC{VR8CRMS#JRzvxalfZz;Cjw#U&Yo?C-{T?!oAg&Y-uwS*GDNM~R~M=lia(M*f~qcgF&!|G z0$aRNn2$16j@GuiGQ20>?zXA{-;VoS1)qN8_f!-4X!-)Oj666^Hgq!CXW|d zl1kOZG+oAZbz)VmwAuGlSPE#XM~t}QkxF>W)7y9{?ApB@B-^V8U?#LfNY5i|=wS9u z>Y8l&i&U+6tu4fE)(dP_=;K@SDq)<)LB32as36%Y!L<4`3u`k;e3O8z=a39VR14%AX^Fv#|alfhmwo+Coil~$)I z*!^Z$rlHiGoXDIOn}`N*QyS3X5P@n?mYUkpohVQ<8eAmxy|_skkL9e`h1euZywz1@ zE}8>+zli6Cn-LhAAn4^N+fE5{ozdOx%wVSoivmFH&M4vxWZ2^RKmd!3Bx-HU`OtkV z)7G@l6AI#pNBbdDdCZX4G@F$I%bdQ2r!`Vcul_2JSPdn3v6uR7j%s?HC9ni-MJ`>~ z9G@?Vl4{|Y6?1ezC5%OTVYdRL>BTL#vv*TokK^oqL(+}OoS(w zJ_V4LIq~DNDOqy3UMmzH?&~@wq=ukX5tG5pY_dbQu7sVR@pgP6r?%MpBE~h>rx_Qi zJM?i;glY1TkxAMk-PM|tBC|6|ufM?C7!M+D{AImoNQaP`jB56FTG(Ns#_s`V1cbE)Nh{jj?9n%9sOyOn$+TS$N~ zpA3kc`%zOTXS6N-WZ&VbsChgLZRuWK*4msCmHc!-<|dC>LaTNm3I?$hH+{@=0jVpE zgyKWrS-Xp}PPaFFwBuag1f-2e>&f0BN%Dw=9c3l*i4_^;Gj`^jZmi8A-E?QCootFE zak|0hpDQ!LmKp|(?656NJW1^kdFZdkS3uI-33hHG0o_JMGtQzWm*1eog6ATur9m^3 z!Tfhgt_E6h_wFx+>lnFED(%Yc*q+u*`VQtQB_vLF%IP00ir1|@)8&U;I@MC-C|;z~ zYO?nzUc}R_@rnDY&B1tWsf#mL!aj6UPIE=N$a?vLWQtqC`dBlvocwsXH@<+pt9+KC zbh}?XV2PS9pE(ae6K}FtnjZL3Rsx|SOSxiPOEVZJn&OTm`+7qk5)?I2{_>JVV0-g; zenQsZZ%)#c;tA@`ab0u)(~)fbcClS>hYa?R$Ubw1m%S&9p4oGTo2+utn6H_5jk43R*{FCw%uJh#P&bUlQbJ#o;hN$y?9gA8QE=AU9KYA+c zp(>bmmVh6Nb~DT~S;UEOz*)y0M?*Z}i+}pr!pg=TXJ1?ASi^>Wl0N|~@s5y5k3+~Q zbc%2@D_akq3(Wdt*NLvz;F_@tjYG@<0nuYA_S2SwR-(+8940mMp!$ zbBwO6&$fPr72By;728fKwr$(Ssp!PEZQHh!iYm5UvEMvT_wC!=?;Ycu{bipodyF&o zf2}otbFS&R7X1tPjWr@Bw?0<(FPk|4qe>uWvUUbaS|l`ecfM^CkdoZ=ZGx8Zv_QNhoL)nXq zyUd;d!AtsU)-F7lx4&t%UAr%Xl%FR47UX}Q*nDyTTa5oz^#5yG6ZzM)=F|8&sXruV zxYpB`6g2=JI3Prmku#aV*kGG#JFr0Wtta;fBCghDp)T!-SLxyD`xgd5ZXp4rQcf7J z7MsM@ungAZUk>DwO|mVkp_M6^VaaF4 z7DXNE?k7T^j8nnCnjEtW zTVc3d;zy!(w~Hwr=9`JN(YJr}I3TVl0LB4UQfHQ2jV;Al9oE;xJCW75jqg%oo~DFS zK#I2>sKuoMJ84NRNXJE;*eTxQ>eeWFGmIn?MkI6m#&6VEs3XNi$&nI)2op$DQ?Qr|sDT65b`-2~pAZnmI;Zl0Q2Ch!VMo%rDL46Y>pV z!<)Gj%uv|3Knj({7#NP;CWE&r0T6M%NR!11b^}510vNy{-zjqQPDe*#IEbpCIu;Ol z#woSJPeILaMAYk5Tp~3R7b@0_MPV!R zSXPVL@U`(K)@BH7;wl$s2qYC2JM(*VR^kxan#G)>tTnAACXw7EEIfg&)C-*7;D*W@f*eX(UBXX$MPoNDW_^=2q;>)w{#33J9bdB&KKMgAj;tgX)1{j8=ZCU-*$UsE#`R# z7d?4!U2k7ruVuWb*h~O9X29dA6#_MXmzx#c0`i&b7vn^r;f%p<%OkZ2!n_dBfj{lG zzgDk)xQFqM{xJ$6IDB--B4BwLx(}v}p=m*{{%)tfhC$&vkGB^A4uEu1o2D!_SCfp} z3f>&caT{ky%^u~)$^NcAJq@$xDnOa)*Q(F?+2=?cOX27=-GK?qbfqWF6o0GhFir28 z{wfmQWv*V}(4I|Yo&z|7_1c!`uM_zAguvEjVT7G4Epkr{{V$}QJ3-%sW6}Bm~^ts{)jZp0^%=HZ(kE!v#6mtk~RX9rmO|z9_(^>d29TpoaGF`*6EL|z9p*% zSNxnq6Qe%mg4 zw^soalmTLI`*^BiHdG?!FsJ$mL(kKG(dY83!F;o?Utv+U2Y8ksL16kzZ{c*V9*vW} zAw2KtZFvgM-+Ru-u748Lr=r61Q=aqG+<6-nV&{37I-n$1MC4EqE$R_yOg>NjcWp^-&pkAB8XscXw_G|e2oda0f zPUl)Wjd0wQ0XUxoKGXVKKHS>(0GcHR;ch+q9ZFf|2hv9B(r`|aQYDEy%Al?r)??%H zV`Iw9aRn}!5co1{Q+swt-*}wx$Y}PDsH7*3VEGien#;ZpD&=i-&+G*gjgrwn?t2nj zPHW);&EGwPoOwm`SaV7e3C&1$mCBASF4>I_2g#>+0cuBDUl3Q9ufoNB6f!NSthna* zXX1Ycx+@&kXmNgnZ7k~`WyH*!CGCosGLQ3zoi<0gIf?jl!iOId&4Ev~R;_}Ux^LHl zM~1(xmC`_iRx7YRa>y!MF)U9EK3cV+B@YZrEa(0B+vF0M$}P(G+13N(uhn2bhqYoJtg3j0YRKv)Pl$-V|4ow1w1Iij_t)#IuMb#?VGJShgrl3PqvidOPgxx8(uz~AB}TQkQfL2x~oV7lVk0&e}HPoAuMs z`#L(bXW%HF6jZ+&F5jVOc#W|fp|icpS41Kb=h(ogSm43GkS|m;v9WtbM zVrCTgusvwBNMuN5P{0a3oP}?3N889sfT~X=;(u`zXI*{A9N$t zSk#u>b?}%uIs%wy+g-k$hfk&Qza6r7LtF{I(nNyC!L%tC%+T7G7^~e}tUT9Q=uN3P zOS!Sg(I4Wi-~HL}lySQmhF9X(Vz#OD)}&vS_4t@=Ge~mzGBY9Dp z#q{-6+6(q&Cd>BZ=qgXh`;h#Sh>n1%H z9HE(-Y3W5^E#S5>Aezfs;QK*^SF7a~dHS1Jln4vetTx(u>|G73?tBC-SIP~+^FeuY zr|V7pv{s?1-IIH^?!(1c-Sz`jrFNrw_T0*``n_7zsgoo1C;g3vTq@bvqkO)G&^Xw`HovD@y z#epmSOK}vgbHkAZ`nuaOKKjF$z4&UFR)i!8f_PRj_>}2t?2Bwkmz)XLCVfoNNor*S zwq=NS3I{X~;mv7IPpS3I>bhp#R{{*I$Q1nYMSzaoL|tbsna@O7x+zZZb&mh1v&lag z2ZgExer4_O2=f$}KfSuhqXzXY;wv>0bpxzkc#MBO{641mn6;1k!2si*xv;r#v8xh) z4fN=32hBNgr1A`CKH5o~(0H*SnKEMzSX4~X0ci9aj!|6!2fx*o7Nn6(MF&l`EalO8 zR)Co59X7gI?TEn2_%DD&p+FO!K)Z5W>6OCr#1t&gI{El&rG>12k>)ueSrH6sc;_Ql zmi$#gSoAKXpETI_(9(s@=180T;%my#s#0~KP$HrPg1B7k_~SZ6ik$I{1{#K?KW$)3 zeXf^Fvtck`<@28$^lz8OX5;SJ#wi(j0YEmv%F}a+)iY~(4~o0Jn#uHmCJR;4!2(`X zH0%D{c4iA!Lsefas8g3r6~67ha@fWu)^9e&%879olH$`OGvzyxe%6uEhC$Ur37IqD zuio{^tV?s5)GEx~Wr>U0t7BHN^6!j%a$2V%>-lioZKh{+bo{Qs!s(@QsWvC_?|{u* z&h~=T@HC^5L;JdMEyj}K_~(_eFa9*#t|~c6>zrd%j?sAI_o{nMhg}FPuxn0EXQJ~( zbQY$W1?Pw)Y*sojhD|w~6UH#C;C9|qu2fGd>spR1{f6WFDK_V8?9)b69ASgu1KZhm5TQ!Ak~M^uy0J|* zWa9?y)YHLXGfeP^bX&Og2ig@(e(CUJ3M& z#4H#dd#82VCd1{ZE+5-C+Oey{DNU;+pJmBEGgR&!DUIeE5v8qFJld4A$PMg6q5j!5 zY~1!?=^I0MphYc9%l%gHD$dtaoy_nOBf?bR)&T9@!F=Oe?^sN^z*qPzyp|5Po6cb` z0yD*TrA#?F!ck;*X=B^!p7cXR=I<8ngAcBe|lczU#VJ$>XQ0MU9!_|UOC zECCJ~-yNIRJ!n_WgCY+WM8W!CDiZ*Fb@RRHUu22=XCd!x*!{Sa zHF2w5FU(|OSH)S0ZS*{Ppz!vex=L_V`|RLM*?29T!@l#XI*=#~UaO;l(#?3MIx<{&WYi`7LYVQU$JJBaC$=O6*t5bw=(Qv3O6Yeyg~By9?VNGce{VM zMKH1U-G9_u<^ZIpIFL=~5v6aQ66Kft5NWiDj`0q~9Nz~EK=I<~_Cq)wn7Zaz?QuXg}r2l{+JJnX*P(`pl zWPTZ^J9`lcpxdE=$SCP+?OP(#Bqj-IS;CeQ!lWCg*~XtGtuO29UJqi@A0D-T_-81E zjd0>;zvc7zGB4Lp%B(5{AdXHTnq zNv2Dgn5}=%29=QiJ@-XolIwovP}`bPOD#bKN}6sBLg%h=T%f5RN$_e1Wwe*2uzUv9PSY z_Kdt7o!oi5XyX|PXtGm!iriv_`FcwZ;C2iHi)H$o#Sg)anCPzg5|grRQQcfts*nB* z;o7Yiw0L&Ac*F%*gn?EeAOI%c;7*8bO;-hMwwzt84U;2ecV@nEjhW0++-9$SuzHjDR3)1zgdg233XtIbGqlrH(8j9cm&I9#iH9Dx zU4SWE@xzd;_+;qMV@j{evAc|8MfYFEc*n!Vc+KV&_OVVfv_6k(s zmL8m?me*6vL+uu`p|_O*K6^-pNW5~tUc#R49iNX>l-F0JzT)LGYtwKC#n2Iter%T6 zbW*Xe#3-LU8UsSC;glX5Afkv`w;pY?$366bzwAIc{tV#di2bw>}tTDDxeNv!Am#ZuH}AAD+BOh=ZAXjgEc+2h5_?SI?rvQ?bwYzsfRO6^syZe z-=3MB`Bk{l-v-H1 zTC_A98419d*+6Pg;|!w=c2;;v416%ZB7!$p{7qtl#4Dm1@=cYP-yK*lL!2EmQvD%V zuvZ|lS1TGz?&ybDP38KtpFXxNd6^ijS$qehZP`itH?p?QtqeR-u&~e(7bXgd%G5>d z7vW;vt^Ds8>GK~+NL@ogf@L%h8nDY2+ZiTCc5U&OLnBEMfA*n!Q zdSQNwf+m}%<|?hGyt0#4LQ*2fio-llElRG?fm4X)3Aj`eN|Mfce7|Q9l z|7>_TNB3$ z)rH7nU`jY7Walg>m<{NHx{m9+9`op*35;pK6I-=<-;1@b9U7;|#`)WXA;vo$Oz>@P zysUa<*MGW!0I$$n-xq&{5LM-fiGWG~*5IiZpvFFe@SlXwo(dc2ZrhL`THPbV2v>Pz)n0xYnE^vv|KWvjq4jvqUA`i$mSk%naDJ
-n#Chk|(BA+sq7?kq@I}mj%AxmBK>=zQOSPHsMuggc%2n`w@7BB& zao9nqR{}j-Kdr77B4Mm_+v`I@v!)Kh0`#pRjG040kU-1B%Vg3jp%I7BkGscRSDMm}agXA7pkbzQZ|-vc<; zUM5BLnx|0jJnd%gTfwSc+|+-7E!p6+e zs5OHpDT`tWz0vEjT53VPM$O%3(2A_CM*TaBBM8D=!(I3|{?s34g+Oorw35O$MhlLl z5}6{9@I)3+Rj$3RQ-Ps7Xo1m*evHyK)@jm?^GmMa=HndAO2sEH+&Fm&PWY@hkb|~u zS(aCB_C6D)+dPB=p*cJPRt`JLj=uKLGU@zkvPyQ%6R6#8QK@C92@9tu+T<&4zG+CG5Ajn5#t$bw1U?pDp*Ch8sHSgW1s^0Id3NWBldTC({PLSzN#} z44wgC*NBzL)3o9+kCF?jd-Q#2ZZQYEbn*wgXubeF#I`Egvr(0mg44Ag??1Ncn_v|_KafxZ;x>p7PW72;0|44l%QC(Q=EML|5!LnVAT3E568 z8&X9jE6n!h&Ja`b^o3@SzD#$27t-?SDja_e`nVDQtC0Q-R_8$dr+Mh#wU%TC4OBEh zrTn<;XQXHahNGNoH ze9kHq3#C;X)&O6S1_eX~LO7#(qIgz17=w{jFuwH40XmoC0qjVgb zr#qji+ID~=-FX^ibfz@N0D3N8GBqV2VLtS6327|b3w^tl)3P(ejvafVL7BTAVcXL> zNn@flZHA-qHiqCwNmPT|36%xyDiV6%?y?(_rC6^W)LZxfu`)u@Pl4~m^nbc(iLNSs z+AocV@N9S-==oV9hh1ryhmrHg%_~WtnXfwaYcM}MbR!98a#;P4zb(hm@i_HQHN-wT1Vlz{oSwuQv}N!D(81EmJ)ps zfq_q6OdG>r1B(xCG$BlTnWWYnS!|gzU|Vu+D4~5?zV!w(@u5TjPf+3n>FgSd@r*r zSj&G3tW7^aSVq#mNk~1+3t|bFP7E(!8&fW$;<7qW<}KGuOYsVyoN5#G9m1t?0oAOZ zAnup#;41*8M@F&CX<@U z>aF)5@nkaKIvXc!LrM@4^O(6k+VoQ}_}kuN!Vx9`I$BI@@J_2xvo>+F=O!yT48_h1 zO@nxpJE7=)qE#ma0fKFj4Jf`LqHX7XdxaXPqQ|JP6T?Ts>}=0f6T{c&k+iqI{-O@W z(CzgSX}p9iqPvBAAjG4XFvytYhJL*Jo z(O0a1$}x0O?*MKg2=DOrtYnCl^&duVbpV3o`|ImE_eW!b(EU9nf_7A)&SCR@)IJrR z3H8tHcgn0HhiLiK7Pz=hfsZNSXwnyvTREN3BA&9JqC|G!J;Z$K1Mv<+h`JRK&q7me zeIgdV*``ix2emz;>v^Yq=dtOxYf_`{m{%kKbC@6c@+%Vp;Bf?gKRB?HWh>Y+FQ~Xy zf0!Mjan(|BF_r;^xuhtL2cnJ!VhUNe`JDV^UBLN~GqdG#QS&XKLk3m$V zMOqx1Vf?Z_wH}F!SbMKM8$`@ykOUHVYSC_R$%f6|~OTFYY;i*f>SBmS387G%GWP2-P0x9xt%eDr@Ei$tAKz&xLtimYVZttLcHM6wAs2r3{^cD(A- zIa0CfFig#e>ji6tw~hFTB9K-QnD1fQ*onXkl11!DaBFUzaq+?N}$`qfm+oI=69{Ifa&!qgG!NsBNLunTLz7s$^ z)(iV6h*lRUd9|X2hJ~c2`#0s6c_R3KIY&Ozr&*J?L{YJlb1Xoi;wcLj{|XZXK?P&~ zS7y+^ADaKGjtTyi#4Q5gB(IDYH~{tkOyY*J9Vo=IM+QYkoViyfXKq^WS03J4(BAvP zsVt7Ww7ds6!Sp^6^zq5&1Ce&fpCOsB`E9j~r>FBcgYI=9y{G6#qcChVo=0FcoW2O5 z)CH(%=!NCC!)?0u&6}Y>i{!*QkEp&aq}V&X+R)$&2%Ob>?Z+lvqwRDNwAABu@P;ky zi(zkg92#$*n>-`%+xu!v^YyUhC@&D^Q z{0H>-dE=9O%n*aeOU@xeg$K1ZNsh4q#Rkas%JvDMWr)SnnhRC0@wmGRgKmQ`Y@7aZ>bxNHlnowYK@ zO0C!azSK2bBFZ(NXrG;Wl>F=AV;MZ4?K1aW&Qlm(lNERrH3hOkn2uapoi8{;HgxupmhsFD3&=NY$9bi6P~5{1fM^ z68&ilM#Wt?e70fCH!C)RrnWOJevwlJbg%`z2V3Jz9_+1y+z~Efh1m+aVnM5%9 zEXK?{5;pQQY6!yO6Ln|^W(HOHyEz)KNx1*n#`KI4GuQaIeB~DKwXIY?e zoFINb5+O*n(55^|W#)vw7FS8QYtAko-gOre?e-UTSL_om=Mi6lG5=%Zv{%55V(tPJ z>~R;X;$Ya$5(pr|=c3AO_oN42q0#e+uJIf-BV`SRM4-ZC^-4gmQkg<^ifesD=%&QZ zprqc;c#;M(MvQY5ZfRsB&0O<6$4Ub0V;%`Fpn24hAk#1p$ve|l$_?5ujK-Nu1ys=&4{W9kG=-}w(h1%NL%n8$Gq>;UdoD#ZO8LG&Px z%e<2%t7o<@Unpp`PiAGXV{1h2s#CUxmu(_BbJ~YFosGRJbN!IIgX`Ex_V%}-C+g&1 z%&49l#>>aITFm4SVrDL1V+@^Hu_kLke86I5EZ%ckC^3!u;G|g~=2Ss%dY5I^Kk-Q&J1DMRAJ#he)SB z_S0#7>Tfb$m)4l^q1!(NzoFwY)2*{+EUQmai8Bd&@)(kcq? ztXrZR*M<77#!d_W&^kRA$UJCVht#eb>N(yVy_~m%8n4obJMjmIFJ-VA?WuKRX9nGB zN~ojhG{nXS5D>)(Mi0jYRz-^J>$|?U7|ebHt=?r1^nsWOcMIgI$glzDUhT>x`&PvS zz6uyamTi;6eT$oa_&`Kt^F*b`-Mpit+tGG*s?83^r$exx9Ty?M{MzcC@y&yGgKVtj zdwViiepn=>2dU$r_t+Lkp_|>HIYoNIE4VuQqG(;IG@}gi&y6yShDsW^$jE3NtZ$M$ ztfJH7@2v8V-(*sk8*puZ=P22nVBZXdAuIs8WG!-;;tE^Em_2iQzRI|Y8m|$Pm+h(! z$&r1lu$&AsB8Q0QkW6T$BE@blAFM;1Vp0tv-A(>+`ITco!9>k%rY_80*=n{YIkbo4e+_FVKG9Fx^YAbEH?wxeDsi_}9c$U6(L z$F}r3ti79N)sZjc8?{Hb^!iqQ>yXtHRZ4uZ<9e}$c zeZ>-p;j?Srf;#7eO6)SzazOK9i1-fh$r^Hi^Wl(X&Mw+Oe&+U*n;pZnnanYQL848! zuw{keZW*Lm3csVe&&mQED!+QVkgIQZhCIQk$z!Og##^Vn~Kj&n7Z0yy`a(Udf5(z|QOidD%`Vr3@ z*4EkEyIIYWF@vf8opW0jCzYH$|1(A2u%eQ`MoK3z2Q% zWmZ`w?dv7<)){`M%9CDs7Y_M=t_}wsJNY{cx%m*>J6zl)mHZRttP%zGlfJZ)Y?pjj z`8!Uzd0F-oEnKsl@G{|qYEr+nJj#r4&BmkElDo~&cl0g@7R%Z0p60+Th>`cztEIJG zM?<*KV>_j=7TSC3+T>(Z9qO#%L+DqCT&>78@4$t3e>2ID_Q{rdS;;Mch8~(Dy@`&2 zU&BJ}7RF)9_qXow0KU8@mnj5N_O<>VP}@JpkeK$7augD)mj>=21$t{{=5S(sf8^pvNqHyAfg*+2FWfYagC(p>@xPtb`Ytya4F>3MLYB9To z5q;$z#<)3xP?nvenbuJNA}2oH*q1x-9by+c6@)LUsb^Y0?h}NY;5NIjiu7MZ)|}V8 z;!$|xIhW->#OBGYQu2TNnw}?(Bi<#810g4gO-K#;Q5Q8SM~d6x#=fxD8EknGEstl+ zT#8WZ7y82CJG|e|ul8vFYgV~0d4zlv{mTR63Bpf+JGcN6Ju>n=U`J=Ct)PpaFg78{ z-c=!|`pav*A7Ggzd=8G{sfr2oFP&u2)gVy4Mzur_ zgkAK*dxTw;zb>qQU8twd@rphjlXyc*8LQk8)!fZ)DT-k}UcuKgf8BQZ>!S7fo1x~x z^T|qf!z;YHT*ysyPr4AL9)&Ajz6r>#Xo9Wad2h-fg6(1AI#BVM$Mjo8k8l;cl72by zcMU@E;Kkrk%g-`HjG;y_KTqxWm~ zu}w_(2K;7(C@M$BvuHh>x?W*fnFO=i|;=QFh6xkh{8QU zvrMkIUW71K!dO?aJ@{ffWZ|mH%rUec(lT+i7EhY04$F{a>&&_G}?xk4lDbFn`OXaK|qI9wWkVM$=lde>; zC2pb4suf)FG8JshBBZNB_dlCJQiB;@^!Pbj(~KX4rSx+6nco?G*eNsAlNK+= ziS7OfEsJROD1j|^Z4V0%$hN-;Gy8U6yt)+FtR%^0=t{ds+b+d^RwdCWHEmX}@U7ng zn!*@v_c$(s(p|cB#^mPz58Pjy!pNgLNE;EjV5K_pHIdKqsaRznj|)9e;KcK#FCXIdPr_#F#QJ z9mB-uol&efQ@s7cDWA)vYn}~ZC-K)m6|U=s2=PosDZ&Aa{X|NwKPRC&Fk;pONl)g7 z!&?u|*12bxXZd?^{Y)oPT95Zm#_cumsYU8%94zQegp~4cbsAt` zKIUA=VnLSyG<(~tdd}B)z!KKLj{cmenpP0l>iS~6(jdhgu(ftJQrVmqMqRCo4}5CT zzvj|qhongv3}yFqbeHb=ef6t4xf=5_?Sw4dd)>N-%~nz0zCXS^VMLXQn^kUMLM9}c zedtvjOBj~;VubkjTo0GhTkCUp9ofYO z&P5~Pl#iPgI>`2MFZ0IXwx-LO=e7pHsZDFH|}Xn>R1VCp2EN zk6C&-R$pCz*=;|Gc>laW#`z#zH=0Lv&C<=Iz$3B*@hMG@QEW!i5fs~QYPDZgY_XA9 z?*%)w+sQ?DUbmO$|Iv*ol()$~6N3Jn?jB!b2Z%Rwn+ej(Pkz=bQfU1djkrrf!^9UB z-P%NtED5$gSGu8crYUmrjs3pDuzJqj8T}=5s8{8iBThg$7FV+8I&*iT`Il}HW?!)) zK(x&xnCs^jqDX$uqFo60C6;EsD7hGiUIL2{4sM5x3!ZY`1zc`NSh3BXQS^*I*r8ng z0DvI%`w5uMgTQKL3bfcRMjIfmDo`XdI}af=(r0BGuis32BUoo+R{4@PqIPS4@m-Yj z+AX`W#Ee#wBirTsK+SaFRYW*Nq32SM5MK>IzUAW>ES`s9RHlB~!(bHvo8gP7~13Lr#r5i;!V=gg)y^MpA2WQWdm4a4Q2iD%{9 zr7laMTQC<&uRxFvSYX|hgLb>e(Ny%u=yf^E8HQb&IjIUe{XKyFL?@Z7CGVbElN~wO zfMx*W3x4kJjU;n~qHu;>H+|{*`Kf!~N9k@o#A)mjI%g0%$E&0Zs^+RvRq~YrwEo%g zWeIgh-{;oZ=MG5RRIKW7hccK|5qX+|+2_72@-|a=0`F1{np%Y6TK{plP34U8*d|PY zENx~5k;#`=-wu=c10oYVae1H4?EVoyv!+#}4dfD1!kI(?dBp|`bzR9}d~!4MSH z44TBM;Wu4{rYpg_gzF&yQI0o&J{1|)89Sp~5cFTXekEA95)@v)r<$Koj#~~z z;bw0hw6)%2%4;rxcBD@+X}DOU zg1bSk>*$Y!>&ul4HeoxW*o*Yu9sT&1489=*v+hv*t_L3jtBAgmOVe~)hwhPFuJWPg z0_?iQ==MPu?8KAcBls+{$T_&_-TK z2~e~8*TOgM-=8bq2rSZ@*hn4BN6X0z0z1Ti#-wlrvDgH4V)@Z1NRS&8b?0^$W?IDM zrXCOb9z~zrR#ZS?A0^aYi?0kX{I%-Mt?~73ng9TrGGL0L6GApqNfd?eR~n{6-=fui zTJ)ADAD`sxET;+^<=pAt+)fKv@1wPll%reK`sGQpZnNsRznl)=Um+=$V>b4=nMji` zX*@apNM*(c6fFHYN|(WvjmgBt;ymPGBTy#o-4+ z>^T-M74hWbWTGKWNFB3G&{5ou3;XPfl1ko32`}s}r!QZv3O`*#yRHpzJhM4=2a;}t zLgDLClQa6yg3DUD6A(a2H<1Ji=*f7F3l1!6zw1v(o=2nAGlNRC2Gl=2$*GpLoF{lgsQkc$P(=hVa_6{s@lb?4Ir4W6s6k6xwgirYmSSj&wyYD*mW%yx|1l99 zjP|SozjVdgNR&`5!{$c#?49aChs`SWfP>)F<^J+5W zyEPYXxzK2*S`cESY5iSNEn%iXL4%&!Ox>ojh$nm(&}(bgpObw&WtqZp8l{8zd$bW^ z{upP6sC9bRc6a$X zF%+qkYk%noH*kdj7+uqr!vU+!xgnWZuF*vDAjf+f!}JQMrC3Zd>8>&40f)i3%orpz z`;_e$X1^nk#QyB{so`Zx*-|J@zS4QUCjBaT`cUM4tv%#b55SxAzPEpe%s$z|c<|b+ zd4OVU`t*|8#b9}b?~UP_SH~DK_aBU^VZBa%P2J`Vx81;W?-mPwU>v)bi87agn%GG) z3}0(e26r&4qW8t_CvV#B{hK%PtnDbJ6fX+10#@%8(~ zAbJzkXQY_f^%gGV4G1eD6TCqW@sMrz-<|x5_+QB%UqkGgtgU`&5xU+BP1% z21UsHA;Si*VsU!50HyyUhndLv0BKg5dKQ&P!H?qm*TAp}%*{tyQPl)D-GCiM4#gR(|z82)@jg3 zI;2v-w~&ITBd?ZU5Cq&9y&Ky%B0q3x2kt)-EoMa{wGlBFZb0OLmtf>ekII+Bt=0qY zpcZ5H>^p?`Tp_z(Uq_y>oT|^3UJXwU#e>vb(Bqbs77EoP7{W=Uxj!I1{}KE=b95!P z_$jSO{hJBrFAvV&)AsnnK)U}wrt3c&vH#?x?uo-RL0Dz{EFfsq>5?pSXMjTHRPMbJ zj%l*osnE>vx*gm5DtdQ=m_D;&8n7@UnsnK33Um*tsR;4pFfw;UPNq}KpPUrH>(WW~ z{q?kY6XaWevIO7ID$dYhRUspisyUHT=I};k zU0Eu=NVgp8>+}Lk=KwA6k#ce-gBfo2R-P}^)h}KDNJCXkMMN#K&at&-B3u>)FNVx{ z>_~`Rcuc37Gp$OyiYv{cgiAO=t!xTX7~pAMI7@c;@-=iJk3Ln39R^|Yj7N{Xm<5LMu*Bp7 z@}?|e=?4IxYoweqTXMT6W{bU_A=`H7#Fn;s7peaz=Bj?7DR%(y7!KnxM`7-cG)f?r zf!GMGdWmehoKR9KdC+cwCEQGgL<$FvqVLw-aCZ{Q3MtOMqDq`sLIK+@1T8`#h;3Z{ ztL&IN>MopwlR`@lhBH;KGb(#pQccc#!x5KdiXRO~-aXr)S(e4PAs}L()FiEuyI69qt?Cf!W2vw1V$VbnL#?OrbPv&V9Qe63I8g*wAO&VJa z(}8)ALSrJ&SqyBBYed-oR_QEK+SWa3z4eWfep*W%_)?Q8A}Z76N#tE`qikjpB;1uO zgQ_b~#eeGW`oJfq4Fni515o>(K%)r*lGG&!w|jZTGHTW%9;5uQejA{IST} zO|)@Y?JT@vX%Mk+W$(_gx=7N_L3Z=m=)P7A>c>f3mTu^*4|>*RcYF5}j%K4Y5F!8} zo|_LF=1O*-yr3j!Id0&{bI9*GO@-oqUbDptVoWPIpH-2l5OM6Gtg5%7aiGQZaI%#D z<@{RfXJ$6TQpET5QS1O7n;5V7Hp|r=NGb^SvnV7A6x%u5Ss{6FR4%h4AbM`OC%98f z*!M{1T_Sqo9b0&y)x`_X+fkIX+$DfJ8Ukmx;hioLj|J7KyJ~KUCYJ%{E7Jp!2|l3* zB5$hLQKv7#+XI9BFhq;sG}_9M#caJ068ZD-8*f@HuS-WXA~@b761&e4=dXyF-|5&J z12^gJ9)cYmb)mOH2TNa?Vf}|xNNYsd7Ih|k<)(+x><9$Ol*uoClhV&jw{HW$)>F6V zufV>&gNa>kyF+mt(*c5Hz41WL5d_+GE>gy2zD7bkquZp>%m$K1II!oSrQU*a9ez!i zi0MW3FF9ZA%3brutxJNdAcHoWfcLXK_JvaO=AmTnfWUzF^AWRn<^v~((2vW$82kxf zWF|lpSca$CheSsfEUX#GHAn@Rs^+|GXSjraIr0khSz>kz?P%W{)Pbvc;ke^qk~<2P zuY2(~o~xu4cb%6pPX2<$cZ+0}uWr6|C?@ncDuQ!c5D?Q=QZb}`ONV9&?rI;1D$JPOkE5?vcb#~6=z#N_Y@G&IDthppDzylVyoDfU#lg& z!1^|C&MSFNwzuT3saL!?1n(UoXKu)U=N$OH;Vnt3U3gvZ4w?=7mgOpW%IEzrT=okM z$=D~f<@dR_2JU}-@}HvnrvlBKJa7v7w=NA0kd^wBo6#x`DU6iu=?INuUD5>Dh@|+p zgg`z0Wv9oDO}W;Ys#R{y>3Dty$2GJ~4N-jx?+`9r1W{i$W~62ay|F&Z3s!uzx>Y#2 zt6a9E7ia{7*26?1IUmDxY7ZfB^~_+C65aZytD!Xm8|HBq^`u>yI;_A`JHO{>ppj_`GDqz;-;C4*=>PHOki-$ zwyS;aT3dPgyCskZ4GQS^|McchrTu@@SAdGG#iyy`Z-2)>G}uhlRYhDeBwi9|i~$^Q zMvh0IL`^>Iy?-SAk3f571O&*{KFOMRN%&u1!jpA6K0zC~SFll7L{}AU4hgcvj)Q!~ z<5ZnMBuN1tbJwEcmx<%73yZh6>Capptlnmc0i>mvnb|;7U~gQ#h5K|fK#lg$%Sh&T z-+tG3+^Q?@{>=@Ptm^?bJ@CAdN&yCz=+vg;Xy)7EL-t20TktLmY{W;^F4I&>@>zdX zcnJ@ATw%#`tj_k>_~#Y9E>4(;0v8qOWrPO0e00p;!E6a z*hox?0@kOk|3+s{mszbDyK3G@os8=HLI;qhUz|h%Cj~~joMw&m|MB&X;dM6N)^B62 z*tTukHX7ST59rNyQD2cK?2-e-cEBUi_gfdcx*VU+zLz#On%(Fnr)qRLkWM7G1efo6gu@0xXA@X zF|9L%FWh+g2~XX)PL=dF@65m0%*BO$r$LJy)*5uZ_u;}rK%6O@_SKg+#hYSL*s2Zn z@s8mmYgR;YYG$+E@-Sw^2U2r- zD3@ZxzLC`?AF5f0;om=j*D`gO{0iz zDQ&JNYSYf=UCyQ4hD(Vr5~!I2?jhWAo)uSQxBR+k z2WZVVL?AqibXEBk(13jqa3#g^8qhO3+8hwKa@&a6*oKY!RCPhR<}}98XmGeqbMGHm zk;3stre;Lpkr9?s5Zr0(WT$klT4o`h8g-3#R2Z}9Y-CZK?H}n49(@orprfLiuBw+Z zPJV+DfAg)hkrJa$!q-ZcTl`gdHo7oGv3b`{V3-@d8x)nt2Za~w9%&*Z#aK|$C@kJV9@lrSo>>O%PMY^~48J~k z)40Ss&{=)Uu!KH(@_PZhi3#`$y|?u2M7d<*@NW3?qHQ^dU9%Aq6A2&d;gtT%aALZ> zUk>AEu5CEwT(l-wn+ngrz{`i8zao4+=wvr|H^63c|L5hFj~rm7IIY7RI=RE+_nV;~ zV(;g)bV&ce@Z+K_YMMJh44s=}E^b={1|-5AbH2dBv4|$$e-H!S)I_HpAQ8s-AEuvw zA2uMY*8h0ee2WqO_hEzAAKRvm?u-g4C|Y*R%eU}lvTJ#FsbLJvwcI$XdP_%A)1fjy zAfUGgEM``5jzl45hrVJO|6EwJKhBPjN1Ib#WzWx8b)l%{$e#BmD)##w=43zr-mys( z6)F9LEC@bRkVZ_IC2~^zUeEQ`qSL5=v$@`@A0F~i#lAc_jd@MbBBVS=6>}XRdBUiF zF;k6YGM+0Ua}y7VJcsWkf!7$Rbw8a)!$xLj@XzI|``*f;%O-{|sKVFunG+inaY<+iu?vw8xr^X-B?U~Mg@n-73U@Pih1Kn>#WUt+rZ$iov~R3 zVTwxpops5OYH^PJ^iX6jxQ>ie`BBU6AT(WyKdiB~o;5FlSckOvU_bp(@W8i1tw1Nh zUU7iMq57k`xyLnKj*|>OMczLdxK3(;3uyimiT(KihmMf2vL(eiPCvvTY%-M-cLJ!e zVKn(fi7eJ%LL(Nt=X0sVA|YG`4lxMbkctr894Qu2gd&MsA8NlIMPtD+5#9auGO%n9 zZ4jw4lROr3oWJ#n2+fS}{Grhof#9gX;62BXH>txhE+_2ji)d;=czrrj9 zqL16A6^D=3+Qu3A9f9f5n^DSiUo72fX$;H5dirV#3-myqYuTlSO>-Xh%Ckzrk==L+ zbjMhm@2yQtjgnUYqo5u`%&h7cy)EuKjf*X?wB&FC3SsD?sTNUs9xblic& z6NUFz2^be)YVr_IoMMNP;~N!t zHkt#$F69I{t}3mBBgNpR4Z2pGX)W(Uhe#4==g$K$Y(f}Gj@-ENVa9PA6;VWqdGulj znqfa>$Zh5_)Q^7by+_7GkT52nLqN#$#7CAJV6Jsg9e^5o`OVB)if!a{$tzLQ)io{A z5tAvi0g-h0mOvU#j9+P-sC%U)NYsTDN`7HkXpZC01g*FoaU$y7Sn^zhInX|FnmXMS zv(n~%L6A9MUo&UR1H}{Zz~(TPjMS!1qYT(2pYbAyYQUA(ODm7j%pf}gx+)sEigX`O zR6P+B&LZP^fq>S`^~u>@m3fEeKK05HHCcs|4ioaz(zsq2 zk+wk5GkK=+$xn*b@vzy@VG+XAwu@lZNRqH!ltHhl9F5S*#QsL)=5S1j<+2^0Q9UCqdoS+koHvp8!5XRFLe zGZ>6DZuwl3=Gv&j$eU(!JC+c^5ldBBRvVvxM75Hyf$x8iZ5SdvGbt^<3T35J{#s}o z)SDxtj%ycsUSI0uQl@Eqa|uvwQ3ez9SDUBFzy$^vVQOCwkA!iD1lVFKf6-Jrb{{+p zXQbghRm*9n6#R}q<1Wnk5R=(vlT)r_6J-%8r0IG<7SyvNm6;Y|Vhgh|9-Jp-+tJS= z$4-1TPp!{MT!j2Eb>GWIJetmtTkwR=5mm~z`-94+Ma(*8M84i%rd}JiM?%@+B(}T% z_Y%kG?Zsy|bySLO)0m_;EawQtZzb2QU1G}P;{ zQbehKMIV;xw04jz(YM2}+j?ok>dgmm-UA>clf)f0M^-aSxVO?37QvIO_Ga<95DvZ{ zRD96)s31`rdM#F1AHdg;#*;BP?z9CxYOCW~=IdqUO+s4M6E%HGdlun&(eUGTZF($y_ zljBOX^E}fBo1+bPNsQmv1qGXjt`ZSD})pV3eGfbhrho7s#`T=FGMO zbs9fOc6nh*f*HD>g83iul}h<-DA}a*rZ~&p;U&&OqrmtO-)DzIqAYWkl@p#Kllv{_^FuUoe}SPsgMh52$Z8eXa@pnlZS(oYMQIT-LPZlX}%gp z>}Z>)ac`Reen!3oi8Nv`oTYqjhgs_^Dj~Q|^+N{79?K-dQsHKa5lR@L?60>^yyEF1 z-SXFPBTMS*Q9-mNtP6z$ZV4j%Y9G7Qmht;2b6Y_D)MF1^ESKdMYcT+Uz0MXX(!os; zB5rc8wx)ZQucG{PzxS$qY`aSgft1~cy3@RC(`24hDJ9QQS9qB~^p>xeWc%^V>jJhF z*8K09;>iHbQ&J@C_~0!(RY^e3qW#R=oRMTcib2=Gc`{**Zi8!v`ii7>kOz1t`5oF= z$T!PmNZ6R5KgB1sKX(oNcI-ll zWDa>`hHlFG==8fNtQYwjtF(%&^W{BIj4OE7|u6 zGc}-jNKpiSLtN)=0zWPE`m@D9C4-OntXw+|x zhyr8aAWm-8)Mt?sg~I)HZ#NgH_(JjuN@xyM6|?dt^`A*#oQpK|kuby|w{_&|+H(AR zXfu{PcDCquLhW&=kq!DkM7HN^Q{_&RfBFEWka4yvqv`d}JXdVU$k_~KSr;o#)v(5$ zUx@d}su;y93f}0s)pX>!`nU#{2JmoNKE8N+R%B#ce^V9)qV5J3^tg}Xe9cqO4Kl%8 z)4jcG59@k@xQ4>5i?g>zps{4(qVk2y+RpV#(hhg+2_$rS>e_mGL>b-r`{~Tx6=B*b zf<7Kmi2w2N{4LV@XFLE(yE=I|t67+vn7P|HIlBG3$0*SPdCC8VoS774${1HbnX+gd zQZQ(EC>xreYEdMJsU&h$%d)P4K_<{vRL#!_evh%j#ztP&D`=PS9|c z;L0bnwR6zGVQqVVx!MfdGtEnM#ut=w25_2%S$G`)JUg(s9;`aF?m?v5P1MPbjE}tb z@E4^HU&=TfTg)M-RC$1h>(*k8hXZTt_#KgWTa|A~8my6)3zRl)t(OHGu74Ig2NV<< z(E}Y`2vEA_j@gEFqqqu9(tlkrpfzD3q&=pm+en^YL(zjB1<_29BS}aC1 zBh#(|2uAt6wEGb;Ypl(zc@%R~QiCEC8^2$$N>WI`Y^%>!?E7z;mkUFaDvq%>6m;SP zB5SF^KDoKL7wCzqNx};Py8k4~Z+~gKmT^r`074p``^1^l;M;WqxPx(svL@sfn!XB! zb!yry^J;SZ0QcMnHJz3xgN4=8JzNvyXBI&=jC7RvN`_BRmwy>mqGri04R&qd0v-JOSbeOJX`@qj*U?_cABOXqjOsK{OPML43mwpqY)@0_WeT zvfsuc*TY-dU%VmL{E^MY4oqhVmVarMc=;m`0_U06neB+Y@C;NE+3LJu zs&d2PRm|!*k803)lBn%W9q9O666e^_t7GkdK410j|uyLZ-fXASRm{t>J-8{sh zSY_5GZ`Q9~lvo!>1^oJ=h6iiP>Dr)&rYa9Dl!!LQb2aybR--WMG+$BRE=-2Eru-f`ON5tHA&kN|)GSDoh#e8~Gzt7QQu3PxBZ`OY zXWEs8tR8FZE2I#4duZwroaifXyRH#sB?NFWg++@Q4+5T zj>!r4ZmJFhRTz(O9_-$JLCiLnd~1*MFWOC^%94Q{I1VO6euYFo|7qWwbkU(Y0Ig9R z5&u&t|Bm1P=p_9A)yaQ*AWF0i{;`1AnL$eN3_+C?+sJGbH!Grv;%BO$)67zl?$P5Y z6cAU`VUs6N##5kM6Ti#~ar~jmAWh(4e+PS4&Dl=HG%-_Wdkk(~U)pw?X@9y3|MUCl zdoS3g7-zC zc-xic<}vABtCZ?NKI0Jf$hx(-kkc*RZ=d1(Ls}>!iGN-E<=y?Y353RQ?Bw&rnb!0sYjnqe zXd~Mr$0bIvAXkJ+fyHd=)F+oSKdYSejWwa1lQD8_DY@`o6i!Y=>9Y7mtbkgpPUgHK zv0Xda7L)~0wR7vS$5{^(1yg>GsdUYD{KmCsE~Bx*61)IZ8NoFp8&iZQRHAM)cm{8! zh#7lE0}X(7ffbJO7U_FR5S(RaRYYhfMQlA{nakj!ig+4hw?l9*;|!R_Qq12n^;#rv z@MMUpz-QW89I@sPAo9PisIn+E*5wlJAxMaJ+``vm^;9^oz%Av+E^71`p~zeaJL1`gCjE_? zSSJgt%}fb4;Va^Y1w}WvB1QH}3}HP_%d$@v{KIlnKX|Ch9m=ka)ajL8B381Bw>?8f z%Dc1qzNYwup2**8WNt6w>+A4~{gK!A+uKu^Qzz8}O>twhf+nF})k$R@3Jc|+DUSPD zO9Jf4dFQD?W|`F1S3Nkq%`ZY(Yk0COTn1QMnhUea8gcR-q4XxvrYxXPVtQ;A)e7^C zRD;S>=)_J@5@PS5Xmwzkj~i0= zv>QVL!QMwbv*Uy(u_9uRSRaYTa9@5CW)+SE1hneF=U<03u|MyZ$7z$Zx6}`5JY0b( zf0By`CRLSELBriKcGBHBtt*C+67;0dc8Ines81MBU4ld-02AUJ7<~bI#_Db{@1z;J zh>bB1-yljF+D#S-7ubLP{ni_&$^#Ne9U?4HOrN?2){m2Vo)k_rNPr29*k(3~)eXvh zD48UBvD+-*za78%BYW9Mck3E>`ED9n4%dr=i#*V~4I#Jn)RUxY8|oi|Mda&329Vc8 zA`1$J4ai>-wSuWZX8jYHKEs6fJ0oD7k1OF0jX?uI5+C4fva)ddkM=R=hE#Whv=8w= zoF1Ti-al=t)ol1cEucESBu+pY3iw_=${t-aqo$ss*lCd327C#4luCdcNy_><(Kr4kLh@{V2{9`_ZkVz3Q;NpK)pL^YDI45zi}7(vf}vZ>5o5z)bh^>zTRi zLgU|Rfdx>tfEB1(;FJaw^~V=qX?ao5bYB{ym(SV|IFOh_qWy{lm%}rP;F* zjI9%6`7n@Xnw+8(NU}%9gqoWdyuyVxfR2>uInt}D7MaXYO~*~q{IDZLbkjH@vwb+J zwknIyD#Diod=0-Q0|nJYW^sl^ynyP7eIz8=qY{Wuq*%Oh%PU3JM!ScwX?jxrsaTF7 zjR4duppjik&qFbLE%S_4q#*#wS)gt+vQKSIJ%4B`H;G@V-Z0kGj;A(Cw-N(oT0$Vt z{)-bfc7gbEButC#z9t1Ay|D*ke$u3)hnetIl8AG1AM)j>g9-(F`8yhFEaCqa3JA-# z1C`(5%!G#tLH_P3b<4Eq{S`ou&idNnvTeJB>7Aw2(n4iPWDoc1g}n{Nu~zVd+$Y}2 zO_SBAmGIdcqyqF&_m&~r(nZ|F>2f(3>!{-a=4LLjqSV>8hJMeo~_d3zz zPZq2Jk3KG@u=JVgZjF-wc1^uvlV4I@K+@h1X+rxb>99So9GoUDEf2F<%txLNrWAZ? z0=gUjdc>-)8c04aI8tYu>Q}szvrXI*rHkDuOera!8`%7G(e(=XpI^d^pRQ?LEd8gC z5Eu4GxmiU$t*=%yRat%*kV_b`$B1TfMl7e)uD7(+lIN5g?0~hC4 zpm9dZS3)}Pla=pJi-JDVUk}=(9T2+zMCrOLgl%m@J`kbc6+OECf=xWMlQ1f%+PtUO z*?${BeKFh{kjJ)4`j~9O0yPIz&k1%b32@QOlPk=XYe)^OJWG|2a`ZeDGAx`?+4?3y z{FS))mEl3^aG7dqqvzEelv+WcD1I(l?V0JsPY)u{rmCNzfbG^s><;S1lgNjHmt?iq znKARe7#vS^8!1rIuP(ysz(21Gr~MqC_ZSbm=tJNE%ic%-P=}0{tP7TY;JeRW(Rk2G z`8Y`5GQgl!^F&jenKW5Y$Pa{qF@2Kk5H2g=8|B5Glu+rk;Zpy|m-_)3G=wy*IfIF1 zPn64GQ>#KIs6$F=#M%w7+8^NVdnErz{R(6d%(sSV>x;`Lz*g{{p9$JOe~5NMwCQ~Y zkt{vn1B1?;Za%~IH_)s9Nks{8ORPQs0f-9u|LgE1}%4BogW z^qo&TUi=`cll)b`_5IZdUT;XIFO5k>jo3%-N`-zo+@`T1o!VXp5fb(lY~VTf3pL>n zuZ!tF{ZsDzu>u7<3*k*uTw99>nD1lx$e-(Ls~-Llx^xp|?oN=fs~F0Ix#x^t3E@4PE(B_1q=?3<;jmB zIipwlH;79F6^zl@xoM`;g_Ja+Lw(iRG#!yoMz@0ahFjWg39|5o`U3dF${;+euN z=BJS+x3;=_x>+qX^{%XhP!e24e!YTSS?C7lIP9H8KbF?T5D$HIZgrT%1T>R_Cf_1J zdJ;SS8}3SUuE`mD*trFAjn(fjEuOS-e2aDw@@|NLsk6<)9rJGbQOHq*dfNJ#Ca95Tbk=K85I%-Y#IOk}h*u(I@!(_t3K1KM!@OLqwPlF&YUwW_%j$&@o`L{5S3an(lj7k0tidXkJZ&fIHf1cf)3eVO43lTfY)rl1(7 z0#cJo>r_a(5fCiBU~%XL85b^lHcWN-HDS$C$F#PsnJinf$8=ulJSOM(2+b4Fj>KiQ z-64A0t1CIL%0wVZQUB>-^yb_*PelV0#+&<=bC2<&cXip^>3NFn2hoOKFF){HpGG&g zo-z%vk}ndYmv-s$8Ey>Bfb_fT3i|XNqx#P7Z^e}scSE%KG8;mT7(%fs?~y4o$;Oe# z8?u8WzzL{)l_8wU-6gkm_m?z{;R6wNhhH@*HmKmn(#LbD0t)Efit? ziUuW+AN!T7+>&Zizy-7^`T*Klv`K<%3V#vvxd#GaHPZvf?!b7>51l1@Hf#fF^xVG8 zjYs>2bq%-F$@IFX75p(*&1?8&Sx=I8q9O^u1rv4K{=2>G0KL7_EgG=qnUB#nstu?@ z3F{=+7nSU%0AKUJv}I;uwMZN&9yidotjEf>_7bzGic+zA&fL@GR0Yo6q!fHdQ*`D2 zMk@a2(PQygqFg%P5?lji(Kc{-kuzl(cTDRm9tqy}StV62$$JO6OHuif9g@T|-{2$d zCd^??JU!H+TZY(UnFoO&PgQm({hKA02vU(LzeZOoL@DQ-qs#k;8E84HdCi>+{3h<0 ztPl!=IU7m~Tea_rUKK#dVu)tjMrmBdXYe3ZVv1r`n;?em9s%dp5Lef({#G!Uj`x$yC&f^2& z?~0FO7pRd3(lovQfH8s=uz$HM=`1ARu<2|B7-%3(`+pI$A!AwK!)y1XmwVYUX@XA&B#1v?i<@*9?ZQG6B z-1uT2&%OxqCee=IGEp6K#ZreEqLr4+WaN$!>FjW}G`>%|aOA6s>+{)}T5GG|1>a6LE*%j( zpHuBd7)`szmv$B27|m#06v7!c05MZ?ebHt-mCX8ZX%1PsrscX{PgC>67Nyw|ne1z} zI!m?1Am>j$l#!t@*^C(t1A7gK@LL($zBgLGV_Ri$Mc#xmG^1nF+e=0V<;U=A+QA(1 zfhXRYtKlTZAB?~rdmk!Fllc}xld(?aE054lORuk;%B>9k3p4_c1bW;PaxV-u!Q7_d zvuC+DT9Is@k0TJTCW`pQlJ_JGQBX=KWqh$!bE}{Cn+OZ(b_hDyP1foW>`%PhsV;Li z^b?RWIL5RGzsvi`yHTLTT?ZSEn}^ydGVfIarEwdIRStkq)Y-3pp1{g)*QIlj#!1P; zCjr{FfdzC^{FJSIP8q-6l!&x&QcTzYM9dq!oyMtAzjWg?EM_~MaPo}40XcY6dwF{$ zWPvbpb0{N~HrRvC?3)MoC^|>+Xtwu)NDPUMvi|EJp5k&X)`hi~%#6m8?D7qwzr5Xe zM3^)HVhO0DR@V=}eJSNuVMZ@d0+DTJ$@8_un@YFyyQW3B0E>sSUKtdWYtOSld0S*% zx_7k5#Xk9_9uidyZEJh!m=Si4T*?JE$Zc^%bmwi5)mrKk=iSyshC5C_XQtzn@%#sy;OZZj=&zg?jo6X5_J)D74D=5TO5r&44y+_6y19m^mQ&rJq!``Hh9Tm%qIZ%L7aOf#EW}BDyFl4e-L{em8 zSYS&#fjv7Ee<65B=myv}O->14^r{_4wFIT@2j+Ar*mq*shf7v=zc~F*jWc(cK7#^I z8oO%|pEu!Rn9I*d*NA0m>I4A-+9$7{7Ha05nN*BOJU)kM6hQbIGmC9^q_n1dS39cR zb5u#hJJOV#SOdR8)xj{LiIGh8$Y}0jAQFnB+#F?7v_g1BGn(7BnOB_qfcNM?rm(kz z=otZ_WeZ=8{;HV|@?B2`NX>-*r<(nJLjw^F5kLh;ZWgZYn$G4X?iL!}&KCdYUh!`p z>z8~3YC@)TU_uDEVjUt4aLI@jvZO_E?!y!})8cN{x3K%%h;Y_Wz)Go0xum1!kR#}u3}$6OoilEi znaoPBXLy&qnAvD4mjraL_9rF2s!wkZd>oECJ<-EUhAv^X$xJKa>#$IxdnfSLWaQ6$ ze@H8^FE5#Du%NSbNOsN2ed_<3)>yk1K9jNH0`}k?-gUg_5buycFWvW+fwy-CV#TU< zdOm9A`i0Me>mqYUVs(Q^a70|1G!zRM{Mjoj3QHBM7*{5hEWj_>(l3N(`-MX%>6*bF zRsouQKO)2L?!y)OcK<94r_@w9(n9FHkpS{0zI(=HkMXkQj9Xe#AvCt*qPbU^d!;K< zIB8xaeUY~kwBgM>A~}#NvstE4QV-K*vMWB>{h(i}N{O(zj^fkQBGWo?&mM`j?IU27 zxF#Xqssig^I{|V^7kzo`Aj7wKqHJ}yOH4hH|4x^%ZS9_CFkp^<&?^!_Z73e|)GPH) zpZUuqsS~Pehbm+)2D)QTs33!B1yP+KBo-&8PZ}^LePClQfD_7~hcE&R)2V?%z8&Wx zn)N{P0fX8c09^8&=>r#k&%;gU`BXIupltOSVr3nUM*$bnl?6sahw>6~3u2)Z-@qb& z5N-QHv)+J%{gGckI%Yx4wnm;_xLj3C>u>Hbu|4#4#`lD!m<)Qyen)38>*x~PJtu;o zomQRh6%ZqP#Dc5P3gSKNg7>?o6q=Z54Mz~3eWu%tkLM14$T~uEnx)K_JA!8iTp^kY zX|!`7y#RSdnBYTk$m(OdByF0cY%uP0@+pL>C`T-@1d~LcJH<#3c>{t%RELt%&xye5 zqHu4kodiV9f$n!*{f_}pihqpE55iJD((J9s`1+!^4~c<6VG@a!h3JV4NBXWPtt`6ZJW;fp<9ZD>J^zo6$sV0r@o95G$gB zL6U_NRI6XSJ-Z5T?iupWu7x=tzht}!;Ke23)+JtnfA#Pii524{NDqnrkGm7*6D;iC z6xQFn#D5{_{{P!B{_O^(N?-^nnboOi(wNgiEN~Ff+kj_OqjAv9Z)zf0(#2*A2{q^5 z+EST)`A}kmP zVrBimd7~E|oyaKqbZI?qizZqH&x&@{P19CS$ zFVy{ByR{M8yWq`TSdevO4dL?;_l#rJkkFGFC`Vge0z53NS7RyLNzvuzp-LfYKsD2~ z-jxC)s4*ThzY76Ircx za5>90mO(e!<7}vqisY)yMG$g)mZy4n%O;)t0ovZRPpKRa7TXY-aG0cjrPdS(wG0ck zU>(UXZDY^QOOr|ZrAbXGI~Z4jUx9?0ZKZKBLKJ4}tLVj`%djzTWO$;)3sh!-jF4z>DkJ-n1HW`ZU^**SpO0`vo~L-XE{fc%oh0LzaSD|l zLjY%)p5H77v<>v22{7T8DUh&aK#QU{ztMR3kW#Xg2)%t)a*k_W3%{H9vuH4*AIht}2qc&R0cx%)F!NwvyAZOLdb`7)9w6L!cT@St!()r4)9 zgPW8sKKnMyOh&~%rA5aY`KMumX|x8uP%=(o#sS$qK)TRES4;(y-LJ>l>^{u0$fD*r z_V_k*YMl)}vX*#vIwj+NK9OhT&q__9ioaDxsOZ%>AgG-y%6$#RJr|eDZ5i@JLHEXj zowp~*q{T4nZ1pNNWt9NM`IS!vY__eVX$3=CD25XL7eJwwSjHj~)QxMoK#X@O8Aj*e z0O4ZsqfzVpCt5h_GV#%-T?BTS&e?Pu%fNMm`en)s{egv|{hw=;55^(<+r@UZeGTp{FhiC0-!L*)rLKt!l_9M!de4Bg$b8TlofgeWp-vBowo z$8bVoH7xWp9zk0M;SX^$*ZIeuD8#A;`HZ-EGQX9(F?vO3tkQ3Id-CIO;Gj>^ypv_x z6fSF2IG38JHcKDl`YOH`@~wn?7hC!Z>cfM99fnZ#Rt8zWzN7v3vpFbzpj`Q1Nw9w_ zs&%IRG86tNE^s*D$W?IS$TZU#XMO^M0)vpDH3}7z*HeqmTR7y*`ND>7MK!z68+El9 z%H&aS`))%BPMBo+j7#%Ue2 z7AFb$f+^}wgEOHUn$p-NV5QTl=4}Fm*K?C(vOpMBY@d|eE1rg5(ZwhY&{K%0wm7B= zQEyU^z7SHMkIk;bbkCku+!8DyK_UJTGB^Hg0PlmB zYcVG28yOdazo?{!W4c<}g&Jxyn#o2Q;XpKei#92#*!;< zx4pw=OVq#@k3E`Itph{{`S5xeUvV!*$!uBT9rrFw_oGn$VY}=>NNLgvV=BY=k6r5p z@6_CDZI{3;t#Nlt#why_l2I<;INkRuuV78S6%DW7urQyQh&5g89exvxrl;@hM^LvD zDV6iU(dE=}dN!NmtXGRl91xXduFI}4!f-if(tFGFD|Of3L?#f)AzQW><5-FF zlxDIb&-cmApJh74iIDV9APq8o8{;0 zl6Bac^KMj#r|1Nt9iP$&n||?TB|!U51&Rw`{%6e49L9~ z8YCZ(29<~v-ohdK$9Si*a=v>|Lng16tx8V8`&?4 z$xjOF+8A4C)X|T$Msgw|m-8dDAF-kAhB2?LVaqOeONDIQ9+!tCXi)79vma;xfmIn8 z+SSyhS1_DJpW4?;4Y4JE_rxoSwBF-U>n2tw0kszVS zvG(WV_j3=R;_KzeM}L@$6k_C`qsy@#ytufT`<;67wj8LmIH^=El#?UGM=x<~2*Jln zoU^)cGF0hqigcjVM z8_v7$xpN`N#U1-UbUoc94f($=WgdR$sOieJ=rBMKbu|jqD;-kxzOjV9xjNRjDvH7? zeAOoc`2aPt_QinEsw?MKf_SPA=B5BiT9LUSvlhNXxO`*hC%kcBJS^pa%vz4~#)8~N z(b%dpsbE>5@o}i|Sy=fSEgy8~W<5>5~3{7jH_^Hx#fc9DbxYtf}4#pwmdDM3mf z5zL({Z}K(i`5z1Olqm}2--H?F|45i6t499c1RYws?F@hbSTFpc>FH>&7`q0`B(;eF zKM*mG+L|=2AKqlfMuA(hpWJ=}=10S-4k_}0eq(A?JTYLsMxu|~*_NZt z^ISqQ&bH|rj%)A2M z3IU4*1iNwQRWlyFxuAkZ<2iHV@*+MDqbBIga(EtWV>cl^>({P>1-yJ^izgp)}JD z3RZoMXUS2xvYUC&x#K_HZ1nu|_H?}S>0*={2&R#*7OX6d`35e%|EN#l?_k1bu@gg4 zLPsatTMo$8BM)$o$yxbQjg}Tg z;37(+E}>{OcKI!hBs%y5y`sq+BHvkRxt&7EVFW9+w?}duGza`MT9_TIJ)H%~q+l8O zkgMjri+#9u?n*tB9#o~3zUN0sP69aD1ahWFlQF&tZe&PCD9`cg-Moup29}PIL^{NM zVI1KqZT|QcVCW*^)?v8p1u1 zU)zTwaBH>5o3^ zLlQ3z;Xa)(jc}CRl8!Xz(~C=zy01vS6Qap>eRv!^YGj7&Bq%ITxtoD@x}pBfNibfp zgXp*63tUreTv~6AByvhgh*-8D&w03_e4P1FX)*hBSu%1xA-5WOnAxvQz58}{s?b_r zMCsu93Y3f?!Ta9H8rz>f&o*25Kt_Z-H*sY-?iPJq?&h>H+n`yU5!WeRUXxPAUlP3* zYqkB43E#;lRu-hzQ>Sa%HO!YIjN~`8hQ{C|l@>PXoe@H`N|XW&WrZ@D&HO4Z)LimU zWi_4f(;4Wh+rX{lg=mD+t7LzEN_PypImnMj_a(fVw+g zgfk7vYQy*@$Xk_FrwC)p=>acd`Kp3Oe>9b`17NcYU7(Lj z(pL@K6cBQrkZkbP15pjk#UZEMYqn+6kdud0un4VK!OKw_QEZ0<=oTX~G%8WuZYogq zj7p^Jdx?uU9B+&9BCeC(5~z2?Hs6RQ-HP`xW4sB-Im}`;_ww?0)WNM% zy(~vgdgHW4PJu$PaA$^$ky_d@%TMM_K4(nENf*pg8#*yuKn-w4`5RMKTL_PIxk4_? zqFg=9hi2176pwV563DwL&uA59fsEf+XD94&x>C^#U*ZDX+TLL_eqXix35wz`M{fNS z7Ztu50F!ww{Y-a#q{fs##H=o6pxS}gxZzf@6jSAu(}!rGUa~wpdZd(Cn5yJmuu6NY znUkc#p(9tx3-sUh0rWiJNbr7NKmGHm^D005?yIGT?eefo$=V3aNn0>h9L!YaVs-Aj zOyktf_uch!HDTFz04+y7c4G?SxWM)t!8Oe-(XE$V`7=y#)H6prt=%ycAL);(suyhy zWvzzhdRgKu+$;@m?5z7nlX}@$MxPLw3sfWw7%!n2aiBr2t0+~hw{F_jE9}wE6yHklwl$JwCC|96yNLbJt{nb1vDhZF+In$H zoCT%Z75sjtcFyNL_op!Z8Cvl# z_&3w0G0H>{1)6f-{^M=vFLL9rZzw+m9T8~n;o$hcg=qe<5iu#CNkLKQtkcO@mtViD2zcBmiGT^BT6<4WYtY-Sk9iD?(uu& z_a&a*`SbPy6KJwZD}l0vvVbZLF=)KK#Q}Vaz0}-zpQdpQ_qFUp2pfIxgKcSTbNbQt z#b&{K48c;UPJh(O8mEI_!xrl@;O2DU?)w%ckch8>zy0pe7o-NhK+4B zwr$(CZJQI@wrx9U8aB3Vn@yASnSQTZ*ZsSnKjsC@oaY?-*n6+_S*c#jvJ09w#c2E^ zR`3?Ct_2T@d1k9aC2&HV^ItP*n+fq<_fX-txcP^;ZrOXfY#|Q$Az`q<&9Zs5PnYQ$#C7Rx zJctrzFkG=)!#1DflUTot`W#bmlEjho*)4MX_jXe?V^ou&%NU*AB4OI_nRIrIj&{qs z)uzwQ9xH~-JhEqLEZAjQW7~>2;lc%;%f!W$6$&@jRb*5&R(zU!!(%~<)@M~NB|zA7 zI2lC)`>&)U9dMg*r_FvJVL zvM5DF6Qv^Ut9a0$FLK>BG)F*U1At7j74zj&3zREpiZ;8-^Y>wvMl!Hhyw92ntV{{kFp=gy}9>6!OfZ0uLe5ZcmwGUzq@WRf4&=NRLAwc2hvb}!Wel6L!HUS0+@n2Omf z+3M8%3oQS-kamMeH+d&4g;E^56JcPTG^k!me}yz*oMibB0M~_jlQcD)(LVZ5+>o;> z_!Ql!Xv?Ne&K5iwfYpVtkR3f}4*{PXw($<q}P1o?q!_L_&0vf@zcA2XKWivNzAX>8MpMECKpZ^^U5kc$D7{ruAw3g#9gP zhthd|qllMW=?m>nt)m3i3#C;s7J!(inTeaLnUb5C zv)6y_?&Qo|jev>Pe97P{CoTIn6S$yATC9nXqxgSUGsqfN3!>UB@q@lxm%%yNk7teEK zcb#TCab%-=>ZNyj(9SnF=@MROGtvOZG=U^V+RWrCL%;_I7XGH9$KqC9V0VdspA%7t zSrx>O{s9!=zr64nWvq)!VYQWJ!vU1^X(O2j9f>>FJMym!p&-?U?m&W*n&s*(JK;p8 zWYK+pGJ1A7DR>|*KPtnCL`Y`DtH$h`aMzqXh#yUsnWT4+z{zKvR56}ua)&YbR_(H& z=gZu;YtP3KsqY#W4j7mp1;v~Z4%3Yws<6Er!kb`liRxCbA6B1e9=kzJBO z@sl3rcuj-JEI5{{8t^Qlk1Gvc5jwCWl^)K4x=%z$}tNu(F}d0?Zqmy z`H{WKHlK1L-p(h3C6>pg8w{9dchG8^Ep?z?kuo^-+d|*uqR(0{%;RyklUWcUu?szZ zQ0E$i0H*hy1m&JI&B905`wa74^H!*e_%2PKnX7xiaUo*x3(0-fp^@jiiPc< z))KW{O$halVtj4NpKARX(WOxv*S~GN z9HjSqdJ99rPh^G(|GC{3cc$Bk+m6Eew%GCd$UjSJ8xp(n(Xo?%YE4c#^GZOiu%rBU zS=vqxU-d+ub75~-z7qr7j5^%g>Kb$#Y{T>QQ-7-E@743Q#L@oFL@%5mH&INdE9x~o zucNt9kuFF9b!J;J_RJ{aQQ`P?R)DDo`Qy}^#$w^IOb6dj{aC{(Hczhwkej#Fg7Rd+ zVc8Z26&sMa2%WNMGo)`!_=F+CLxJTVnRvqAFZUKxyufiY#McE7tToISvC>we8D$FA zVK$vKrVr4+jRfhfjMR8NM4uLr{y-iWey^2#G@J;>uFHUAbbjPJhK?AcA#zFy&;cn( z%1WRm(=36p4Ifyq1yvDdBuhAP|EWdAXh{|(`W!HtLq)C3LdLPi8K%x@7iaKKYvXz)$aG`PfIMa z>G5-CB*P1kuMngnb>Kj6U=}*YS&4O}Xf>Lg? znF~|RDrY2ke9=3ocq;+nRH7@7589Xcam2?@CrkxOBjzjSC?@GmO8>+Y$gZ7#s7!(^ zQ0TG16P@ngEJMH(E>Qyh|JG@d{trrCsfwNgsuB`k`-b~Qmt?IkR1iVLd{9#mp)f9J zpfyw}lC({Pf{YJU^oCwj_wenpLQ)dcoTcZp1onx36fqX6P4?yGBp)z4`*PD^N5Bt) zF|Z}-%b@C7<=OT|u-$}Lxke{oN^kH4ed{Q%{`Xg(&4p;6Zyq1}`k@Hyl+2pUHQez* zL={9Kj3ON!ZJgf|%`&E2e*zJ3$nZ)+<#iS-&JVC!$lYZ^$&JSTT;Jcg8H`uhT1ey@ zf6V*VWzaEB_E>c~!a;AUBCpH_%7-bgIonRpCdwYU$NGu1!*y5H+h5%SniN*;HsBOZ`wDco%rj*5f9f~D&Bz!)q4}<~RG&qog9jeotT=x4uqwk|VE@nx zt2zbD8c(S`mQ81n<6mex)pd2osTN|R*2=t*Y z!yftUB(E*6;pPy}@6M)oa;%fs6b!I!v0^hi=-rP(A{MjXfB? zB6LbIxNmallh`xN;LiNso5kyq<%s;6YP16YF2)TebXGC%g_IE>e_EIog7mf|2UVMRshB@$Gy6r0&c=nS=Y67HvhqVP+t382)d3i@yPre+kIx zrHwG?0H9$6O#5w)WKgQ!kCwVxhi>GLEgGrTPg*J4eiLD_!CX_I~Ads<-n+ zN}M<=lV#mc9{V38dz4*hHgj`PFIe&q!apA6Mvs^MR@RW~fXoo9C{IE#`-QnU1YrQi z4n}9|CF7>#lp3;E+lvtxx0CqbSMKS3Jdp#VuaP)rLGPBZm0U>Fl@xQKusHPR9U+L= z+Rsa1$jY*|&JM|id`}gi{jw+og%X3K+{&kB9q$B6NRh;LM~WRy-PeOS`1mhXVLq^JQ8c~~6#gtaA^3&r`-qLR1 zc#A>L{8ZrEZx;7$YK%h{e1D42Yro;cf&GDlvC7TdP&4XY2O%oQ{Q69HA{Y-H&mfo( zGk=Cc``la5C*VM*jPBZtIluK*bdZGFL=Cxa56FdBVl3Wc64~hnSSAhb!38gVT~tCu zE4~g~hf{P?tOn6m5m3@c6lTX>#GCUBb&qN?DsoWqM%3nhfbs4E_HYLC>UbJfwqije z&8&GOOAp}NVzC&GM2dq*VIXX^@r<5J}d+SOtYuu+L2m>r;2zuF${G} z{ficPu6}^R_JVU#96<6_*Ux1NF5i$mWG()It*h86P9viETk|WcYF|ZD__M!=cj{H) zO{nnB*9`l#D3`)l;>Zcs61b}kFdyv3<-(d$uteueoa4cm#fAcA*6ZBYt0lbT^Qv`!fUfqBmR!n? zHNFAZg?;(oUD*H7lK)kaE1Q`(IGg_cy8pR|`VaS?Bo>s37>r~~l)AMDs3>?(Av>Y| zEoj;obcQ7&u71M|L-Qiz`acDJM~E#9{HNMtf8Bp|OXZ&>{H|^{EGCj8ibV7T&h~33 z8#{eDe$($CHw@pwPDk5;YRO`v3X%|jcHp+FJ(bapLFUBqH?reWvWGAdmdKu#+>qub z+N+^O=dd(#Q||Pc7_2xVMW6K+*^`?7+S4VmgTln0ILp4oM~8AY{)67jkMS@-Kg3;e2KEsP0iq)PHCtokcN}_;#ol8$)`EvH|n>);+k2xU596U>( zVx*|sm37ZA&`=z^X`wt-Oxv}^n4^$u#8y2HTSmE{6U780?sRoCtk1sJt(NHZayqDCr z8)U=))gtboHp`7O@+HoSv+e*~9>(=g{F!OZBRdM+ec@E1`bee=4QMz`=9Bj$8yrl| zW?M8*7_2!v$%9eO0Jgl?_#3KPNL6vVa#lq7q}PNajF)s(;Qb*_?;1dfn(dMn8@V27G2UvdabUh?QsG`{Pb6Iicg>2#0k~a))%I8qeqkD6yp7#BkR};lxk;u=GyC`036Q};uBk-r_59diTF1vN|U$#G+ zoa25>QsF?0`As+AX955{DRQ(pXTRO2rLn{chs?5k#B4%mg%M+Ih0@U0kgN2E278g+ zdy5olOF>6JY;>j_+Z>#W-`dhZ&@bu*YxW7Ub3*aKyY~D8E9Ka~U!6f6TC?v8uDsq(!>%ZtY?6OF%8&LviJ380fgV-(Cnt+m+ zzC2H8Fm3$|@RAzu16XJPmWJ7GU!gd9H}Q_j;)s5O3;A3-D^EbU{S z8C`?&=|nGAq)uZnU-p@7tj{(!GV!wWyL(u2y7}7z)3s31{I@2v)JG6Gi0!0GS#9`@ zDy(_0^um25CFlU_j`TLG>?hU7AH{+C=6-4&+Jhp2EE_wXFF{gLCG*M!g{EbJ`d`P| z<=g^a#xYrasb&r29$9_qW?OS}57iw)^u5`Z=V19o5jDN9<|`uen~+{ZMnFid#BY}O zeIt&2q>l$#cQnZBRb=wNEanxbey^x6{S>st*QV`*x;AEL3?&7Q)C(hzL z^HXHv#3*(X;It}%pFwEFV>L#h`ePEGit~6o=6&*A81IA9gIW)5hT<^&4!~i$!C^BV z5n?m0BhoE$n$)o(o~}O(kGdZe`$am|-4>e^Hqo)Kl~#al12^m+^eGF?_@Uj(Szviy z7a;LK{ec6pJi_@Hv5isjz|T(-7tk&yxRQlnO`i`TXpQVbBc~}~|E)CR5XF5YVOMJ3 zMQoi-@U&i5k^f8SMNuLjbCKCPOOzAgs__*O3L<~xkEkKKT;nSNRE^0W>XzMjsAXO{ za%s&-1;wtClxcMjA111GComRpe-)?dIqf9b-|Aw3^qZ$_rvrF;i^>gac>>)$h#fBs zQZADHN1s4Mjk!_eQmuoT2*`#g5j@x|j_-oL=yaDNS*?|sJ45R8@be2%JcpGtXFR{@ z8$0xj?VBv^lQ<0?C*g@4)wO)W**gzMC=1sz5Uw~DrxqE97iAMVOU+fiOU$h^WzNaG z^WJg*iBwMF;pK`*sWji7!zc`jc5bAagD5VX5X0Jk6>z(>Jk!WeMY!eom(6l~NyG6v zsG-O!SEEPrrrln`hZYyUK$`KR-bfjjsneYk;x5h5A$4u~Nr%E+qCx69=_MvS+Cz=P zt4;Wp!lS8*b6q{#e9)Zp14X7Gp?I&CHSJE27d;ipZw?~D44j?Du0|yAINti=F5``2 z5fE5^E603K@V8_dv%>O!0x$nO$p3c(0Flmwhlcu(W&HoA1K3;=?7&J(D3F?L*y!J7 z6fyUXJ>(M@5J>2`EjT&-K}zxMA&Ve2`8>}l&`8eFYc;P=)lcoo&CL!7e!r;)(GAWN zg>!<3##gH_@5u6Khx;=(optqTS>qD!Q??5+c+kfwQWg2j#V(YfzXOAsvur*n}7klpap5B~xXP{6D)`pj|YKSXT%H1eywx_MJzwa@O zDDO(Q8LL&{KA-C^@Z!DkhR6>oK2@%fl3?LCp_1_{AjEx5$Ik2=<5XZmBQrtmzvHDh#gxZHq{6U6D{3#+v90Wytt8L(! z)@)yU#ps&)aNGZnW84(03B6&7OR41&^d(6WaM0BAsUKDt<#}^iE=qjjvfO17RU|>h zi76GkC+#>`AkhRIPcE3hQX)!>C3#0mwfCDXYa!$_*w;EcjOn&om3u8uWj{BaX*uKD zlMjU*$(W>)5*!T~$)dnH0pj`wljoF>G4I2YE_7-8{CcMvAs&1c&f&~gs| z*7qmU9FVaO;tpU`mLZ&fD6ZO+F?76`POt-!U?e+kaLuHqle6441Uw>U*Kcajxw<<3C?5m^bJ>@Yq(wrtkiXmvFba4W?=qw;Ni2caz2mzzgHK)1NKdNQFz z<+S`lm?Idjs*s9V9*^4C((V>>Oj17p`WwGd?fVYF5cIgvrBpuN+mU0aWi3)v6Z;89 zFK>FeYq~_Jcj*LN@2Cl2eQaYm$hR)|rgXNmJ|hQcujJ%U?B@F}TKa-d389ivou(2o zAm@~?64+3iPr6u(s$al=l`vjn_trOQLB~6H8!)aZ7Gm?7wx>-tY3ccM_JJReb?C?` zBJczRBZ3WA_!O{%sp2hG#V;=^q%40V$U(A6u<94)7TIQ;ZX|36r%m^SsdSzNIgLKkY0F+fOg3iPj8d<19~uYH7{egm4tm->NbaSv1xpjn*BlFY1X zo}oZM1#~{px^)du8gm{fXvz9z%s8XZ&DA;DpM-zSxXGtbspwcr^ldhA`aP&>$o`mN zD6fbs*DHASo4i11+ADhGt3B0j3CfJ1NPH7^$gC1f3s^B0$*t3oj;;-Mvb};~lPp&3 z9OK&#_DBkhi1e1a&H3p76!`$uIT-`?Uwfs=YAhilo+F^G@6eWyi>CswE4Z6zTdqsS z4Kq?esTn1`qEmyD00NJD_k6>~{1tA2XwpBYeil2{rA0QUHRH!g;lJGCU*~CT5&34& z-uU}Xi&b;rhcPApaf{Dv4^lTLZ%^=sVHAOoMul5iVJf{G*Tk@GmuiQ)-Uvz~UHgRX zHMuh@cuUzH=)X0cu@oS*LoO@$Q(4C`oSS)?;zB;Vf8SyY1#4vcrvq0oM7V*oL-|>j6b=PoiA|yQ_n&@La>~oS{|qRD13f4^ zfp>qD|9$!Y=Zi9yfx&^>1C6BVi2|sYfYSd;^Ft7al!byXiEok9!A+uMMHH5^gq{kP zKnX%EPbm9~azjE%JtXzLLA18WVgzE`RuO?5x4hKQgg^wW+kdkBPB#B$`90j^13)^$ zmRPkDBn#Cq}AB^3bqO?+o>5Az$2t6h%W z=Gy3IFfFlvqdQclgnYb)J zzO&9twj|4!hta#jmgs7^Z$?QZtm*lfX-gJL5O(u;?%b+>!@{*Py+E>HecS^J)Gt^(xx0!ZhmjrC43|&O+-L(qid|*lL<%A*LB?fGpB7x7Vjp_evqe$PG&=C8DN_NrH zFKd5e>;Igg#NfKi;+qF#e;8C;y0L@8l1`+t>Y6>JhT+}IqLMHhX@Pz?;UveIF>%1D z5`C|j3}@9HA|p>e2DK30(8RGSFDk3<>Lk8(&9C4ivIl7II}#b3_pfwh4Y0wlIEfH0 ze35d-WwY+_`qBw@dQG5w%E1=1j~f=MD5UA_>=SV!19~OaY>n$bWmZ-G42935tJTZw zo)Wq}3Jbb|>lZuBiQxyFtbT=3x_O#evE9*4CtF}ir{yx*h;yj8Y<#N&_f3PJNx#l^ zlQCc$w*lmtT!@>NC^QQgIbf73;10CPbE8+Phgwa9w?2`b@iRe97*2AV4N_y*Rle;R zR)061pE+%ePD7fgYo<3m${ObUp}c48_>SJH0?%=!R#4A`!U|KINc9HCn2h-h*y=`# zGa#Ut^FFgwLrN9APc>SS6tG&Mjb59=|NIm&s{|xzX|8~?`mzYwavDqEU;zisCBkcIUu63t-9o{+v!88 zqz15rG*P%>+wiiZ@Z?7YT~Cp-PEOnNIzLQ;c`7$_Cb7{54f8_c5?@cgf@XZhPAfMUO8#l{k0s zrL5i_XP{!4j~nIvu0|{mrU3&K0q!$!lARwN>kT)zilrr%K}T`aA$CrW@ROL?Gp^Ya z`GE!L7dBKe2fCCJiHWUT^VDk&JQx=$cvCoP^CjP{<&)w*G8vR~1|r)IG?lrqdN6>e zX1@x)N++suOw^WHln$~gU(rqGODBr3`5yyY3e`lqW(~3c?BHqf*)>1m=2+ow;zC}C zA~YE427SZ(JCTbwLzA5B+#k3aN|nSM+Cji5y$<2*>_=Z z4nb~%_PAFM=FDgiZwi_luG(KrqwxTv1Zks$mM?y|By>;>s7#j{zI}1S;?WJk0A?KH zVsU%1=yNd+tgw7xvSQz=mtL#eM z%gS?Q>bJ~c|FT@bR{7^YOX*xwq_$Py(ZBa^OZdNee#u~^Oi2Gql=yE6Q~E3{7#cuM z8tm`bhm73B|9u6wBLWv!NJEJuFaU{(^J~JiESKx$W5{)$WZm%qm?vc;1yooEQ&Lb_ zm6w>G+ATl-&NhhdKBaJ|WAY*Dp8oL+HvkWBa)2)(`6L--x^SVj%wSuyw1*VLPt_G<4TTu3#nNHOwS_z#u3cY`{mli33N2 zD9bc#wxhvW!|<5(gVz{o%Z+Tt=E6LeJ2CLNk*=*VQ?(4^ETC^Dei+E*wTnv(8pYXzTyZ7f%uxorgJ zD{=T1+5!c&?zR@(&o+NV0fK*o%G+JG^@<1ys7=jXwjcU@=x4ZQ*0y#&f1P1|p>U)K zA%8V}RRaegr8HQ{8_c#g*-u&i8sjQHl!SWDOgnp&xfSCf&nhg?5|?9NDy=Nih1}Yl?a+CXNdb{QlrlBH-5Pquz2uHb~zaahkkxw4x-?& zP>-CNHc*Le&h4%i)YV_z!c@C5u{cXN7q=qh{Bw}H2(Mmj6VOH9w89>HM|c zPLT}n1E7mth0~>@4iJNrT)|z#$0GxfFe8+*tW9>RI&pf$Np5RU``ipG{;1QC8PQ7q zz0jszC4tQ%x85MO8aD1-YmT%4CZph2Z_FH#HM-5of(^^c=3p%DW+>v#PxJWvHR#d2 zSc1HE{k4(ekV@eh277O%H{r2~ta4T?o@e$UPF>>_H|TI=H9o=kt~|jcR{g(>7YY((0)FDTcN*H6X}Bc3z^+DJgiz@GDU*u2~E z6z3~%I0}9AraDfz2F{Ja@N1Qaw;X2?;#Y=fucpHy{D|T2Kc-*n6|YTrcw)Z?2=8NW zcOkC*LGs@r>6)S#Xn`sShxSha1mR=sY3p&o-+sOQwp~uRB4)Tlzw^aHb_Y*?_uv~S z8F`VdPYdW!qJ|)4EX-#ASAB>)ugH^5-|C9R_*e8L-egtcVfxae908P}$diX8A?MjJg~ z_rHXnM)3(5-$B2f;S|_70`4p*HS!4Mz?|$Ge}J|N2ES%V-&6Ss`-VNdqF~;lH`PC0 zgTRB#thzCA7JhdU78ivHA1vJBe}gs-JCjeY;|hM&EOXZYhaM4yekUF-$sP!m#5}s? zL#fM(b%kx+QFBTBR*2AXKK#?F5P=_K(~GN%2uC6nsU2y;la_7{l@*r*f|@`sKS&46 zZionC$&kgm;^0|u1MqjcQ_^az><^soSp3^U1bBQi^#J+!z$n9ilxe7dRt-H5R3HJB z+^S2i>w_?jSi2R}It!Ev=6(*QMXX>pZC=nCd038Fu6^q=Y)g));MMJM1h#hxH~!=_ zcKaunqTuwM=T-du>$K^beHLL35`(*iJAa{Jt}TBML!psf;Md z-SeELF3VXOPcqVzLGKs?*i9Y%N}0mvI8vA1l*-+$YaN&SfXqMPnwXw>s5U#_VpCd< z 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ͳds+qI#SnpZr$p_zRl`86SV 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%0D@TB+*bB{o@>RNq& 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�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

Name of the column that contains the file.

*/ - FileStage columnName(@NotNull String columnName); - } - - public interface FileStage { - /** - *

Path of the file to upload. Each request only supports one file.

- */ - _FinalStage file(@NotNull String file); + _FinalStage columnName(@NotNull String columnName); } public interface _FinalStage { @@ -167,13 +147,11 @@ public interface _FinalStage { } @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TableNameStage, ColumnNameStage, FileStage, _FinalStage { + public static final class Builder implements TableNameStage, ColumnNameStage, _FinalStage { private String tableName; private String columnName; - private String file; - private Optional returnFileMetadata = Optional.empty(); private Optional skyflowId = Optional.empty(); @@ -188,7 +166,6 @@ public Builder from(UploadFileRequestV2 other) { tableName(other.getTableName()); columnName(other.getColumnName()); skyflowId(other.getSkyflowId()); - file(other.getFile()); returnFileMetadata(other.getReturnFileMetadata()); return this; } @@ -210,22 +187,11 @@ public ColumnNameStage tableName(@NotNull String tableName) { */ @java.lang.Override @JsonSetter("columnName") - public FileStage columnName(@NotNull String columnName) { + public _FinalStage columnName(@NotNull String columnName) { this.columnName = Objects.requireNonNull(columnName, "columnName must not be null"); return this; } - /** - *

Path of the file to upload. Each request only supports one file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @java.lang.Override - @JsonSetter("file") - public _FinalStage file(@NotNull String file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - /** *

If true, returns metadata about the uploaded file.

* @return Reference to {@code this} so that method calls can be chained together. @@ -269,7 +235,7 @@ public _FinalStage skyflowId(Optional skyflowId) { @java.lang.Override public UploadFileRequestV2 build() { return new UploadFileRequestV2( - tableName, columnName, skyflowId, file, returnFileMetadata, additionalProperties); + tableName, columnName, skyflowId, returnFileMetadata, additionalProperties); } @java.lang.Override diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java new file mode 100644 index 00000000..88022df8 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java @@ -0,0 +1,28 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum RedactionEnumRedaction { + DEFAULT("DEFAULT"), + + REDACTED("REDACTED"), + + MASKED("MASKED"), + + PLAIN_TEXT("PLAIN_TEXT"); + + private final String value; + + RedactionEnumRedaction(String value) { + this.value = value; + } + + @JsonValue + @Override + public String toString() { + return this.value; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java new file mode 100644 index 00000000..bafd7a09 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java @@ -0,0 +1,26 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum V1Byot { + DISABLE("DISABLE"), + + ENABLE("ENABLE"), + + ENABLE_STRICT("ENABLE_STRICT"); + + private final String value; + + V1Byot(String value) { + this.value = value; + } + + @JsonValue + @Override + public String toString() { + return this.value; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java new file mode 100644 index 00000000..dd3a9c1f --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java @@ -0,0 +1,182 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1DetokenizeRecordResponse.Builder.class) +public final class V1DetokenizeRecordResponse { + private final Optional token; + + private final Optional valueType; + + private final Optional value; + + private final Optional error; + + private final Map additionalProperties; + + private V1DetokenizeRecordResponse( + Optional token, + Optional valueType, + Optional value, + Optional error, + Map additionalProperties) { + this.token = token; + this.valueType = valueType; + this.value = value; + this.error = error; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token of the record. + */ + @JsonProperty("token") + public Optional getToken() { + return token; + } + + @JsonProperty("valueType") + public Optional getValueType() { + return valueType; + } + + /** + * @return Data corresponding to the token. + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Error if token isn't found. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1DetokenizeRecordResponse && equalTo((V1DetokenizeRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1DetokenizeRecordResponse other) { + return token.equals(other.token) + && valueType.equals(other.valueType) + && value.equals(other.value) + && error.equals(other.error); + } + + @Override + public int hashCode() { + return Objects.hash(this.token, this.valueType, this.value, this.error); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional token = Optional.empty(); + + private Optional valueType = Optional.empty(); + + private Optional value = Optional.empty(); + + private Optional error = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1DetokenizeRecordResponse other) { + token(other.getToken()); + valueType(other.getValueType()); + value(other.getValue()); + error(other.getError()); + return this; + } + + /** + *

Token of the record.

+ */ + @JsonSetter(value = "token", nulls = Nulls.SKIP) + public Builder token(Optional token) { + this.token = token; + return this; + } + + public Builder token(String token) { + this.token = Optional.ofNullable(token); + return this; + } + + @JsonSetter(value = "valueType", nulls = Nulls.SKIP) + public Builder valueType(Optional valueType) { + this.valueType = valueType; + return this; + } + + public Builder valueType(DetokenizeRecordResponseValueType valueType) { + this.valueType = Optional.ofNullable(valueType); + return this; + } + + /** + *

Data corresponding to the token.

+ */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(String value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

Error if token isn't found.

+ */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional error) { + this.error = error; + return this; + } + + public Builder error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + public V1DetokenizeRecordResponse build() { + return new V1DetokenizeRecordResponse(token, valueType, value, error, additionalProperties); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/vault/controller/VaultController.java b/skyvault/src/main/java/com/skyflow/vault/controller/VaultController.java index 94d081a3..b3f9623b 100644 --- a/skyvault/src/main/java/com/skyflow/vault/controller/VaultController.java +++ b/skyvault/src/main/java/com/skyflow/vault/controller/VaultController.java @@ -27,30 +27,28 @@ import com.skyflow.generated.rest.core.ApiClientException; import com.skyflow.generated.rest.core.ApiClientHttpResponse; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkDeleteRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.records.requests.UploadFileV2Request; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestOrderBy; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestRedaction; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1DetokenizeRecordResponse; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1RecordMetaProperties; -import com.skyflow.generated.rest.types.V1TokenizeRecordResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestOrderBy; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestRedaction; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.FieldRecords; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.GetQueryResponse; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.RecordMetaProperties; +import com.skyflow.generated.rest.types.TokenizeRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; +import com.skyflow.generated.rest.types.UploadFileResponseV2; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; import com.skyflow.utils.Constants; @@ -136,7 +134,7 @@ private static synchronized HashMap getFormattedBatchInsertRecor return insertRecord; } - private static synchronized HashMap getFormattedBulkInsertRecord(V1RecordMetaProperties record) { + private static synchronized HashMap getFormattedBulkInsertRecord(RecordMetaProperties record) { HashMap insertRecord = new HashMap<>(); if (record.getSkyflowId().isPresent()) { insertRecord.put("skyflowId", record.getSkyflowId().get()); @@ -149,7 +147,7 @@ private static synchronized HashMap getFormattedBulkInsertRecord return insertRecord; } - private static synchronized HashMap getFormattedGetRecord(V1FieldRecords record) { + private static synchronized HashMap getFormattedGetRecord(GetFieldRecords record) { HashMap getRecord = new HashMap<>(); Optional> fieldsOpt = record.getFields(); @@ -169,7 +167,7 @@ private static synchronized HashMap getFormattedGetRecord(V1Fiel return getRecord; } - private static synchronized HashMap getFormattedUpdateRecord(V1UpdateRecordResponse record) { + private static synchronized HashMap getFormattedUpdateRecord(UpdateRecordResponse record) { HashMap updateTokens = new HashMap<>(); record.getSkyflowId().ifPresent(skyflowId -> updateTokens.put("skyflowId", skyflowId)); @@ -179,7 +177,7 @@ private static synchronized HashMap getFormattedUpdateRecord(V1U return updateTokens; } - private static synchronized HashMap getFormattedQueryRecord(V1FieldRecords record) { + private static synchronized HashMap getFormattedQueryRecord(FieldRecords record) { HashMap queryRecord = new HashMap<>(); Optional> fieldsOpt = record.getFields(); if (fieldsOpt.isPresent()) { @@ -197,8 +195,8 @@ private static synchronized HashMap getFormattedQueryRecord(V1Fi @Override public InsertResponse insert(InsertRequest insertRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.INSERT_TRIGGERED.getLog()); - V1InsertRecordResponse bulkInsertResult = null; - ApiClientHttpResponse batchInsertResult = null; + InsertRecordResponse bulkInsertResult = null; + ApiClientHttpResponse batchInsertResult = null; ArrayList> insertedFields = new ArrayList<>(); ArrayList> errorFields = new ArrayList<>(); try { @@ -207,9 +205,9 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio Boolean continueOnError = insertRequest.getContinueOnError(); setBearerToken(); if (continueOnError) { - RecordServiceBatchOperationBody insertBody = super.getBatchInsertRequestBody(insertRequest); + BatchOperationRequest insertBody = super.getBatchInsertRequestBody(insertRequest); RequestOptions requestOptions = buildRequestOptions(); - batchInsertResult = super.getRecordsApi().withRawResponse().recordServiceBatchOperation(super.getVaultConfig().getVaultId(), insertBody, requestOptions); + batchInsertResult = super.getRecordsApi().withRawResponse().batchOperation(super.getVaultConfig().getVaultId(), insertBody, requestOptions); LogUtil.printInfoLog(InfoLogs.INSERT_REQUEST_RESOLVED.getLog()); Optional>> records = batchInsertResult.body().getResponses(); @@ -230,13 +228,13 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio } } } else { - RecordServiceInsertRecordBody insertBody = super.getBulkInsertRequestBody(insertRequest); - bulkInsertResult = super.getRecordsApi().recordServiceInsertRecord( + InsertRecordRequest insertBody = super.getBulkInsertRequestBody(insertRequest); + bulkInsertResult = super.getRecordsApi().insertRecords( super.getVaultConfig().getVaultId(), insertRequest.getTable(), insertBody); LogUtil.printInfoLog(InfoLogs.INSERT_REQUEST_RESOLVED.getLog()); - Optional> records = bulkInsertResult.getRecords(); + Optional> records = bulkInsertResult.getRecords(); if (records.isPresent()) { - for (V1RecordMetaProperties record : records.get()) { + for (RecordMetaProperties record : records.get()) { HashMap insertRecord = getFormattedBulkInsertRecord(record); insertedFields.add(insertRecord); } @@ -259,25 +257,25 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio public DetokenizeResponse detokenize(DetokenizeRequest detokenizeRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.DETOKENIZE_TRIGGERED.getLog()); - ApiClientHttpResponse result = null; + ApiClientHttpResponse result = null; ArrayList detokenizedFields = new ArrayList<>(); ArrayList errorRecords = new ArrayList<>(); try { LogUtil.printInfoLog(InfoLogs.VALIDATE_DETOKENIZE_REQUEST.getLog()); Validations.validateDetokenizeRequest(detokenizeRequest); setBearerToken(); - V1DetokenizePayload payload = super.getDetokenizePayload(detokenizeRequest); + DetokenizePayload payload = super.getDetokenizePayload(detokenizeRequest); RequestOptions requestOptions = buildRequestOptions(); - result = super.getTokensApi().withRawResponse().recordServiceDetokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); + result = super.getTokensApi().withRawResponse().detokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); LogUtil.printInfoLog(InfoLogs.DETOKENIZE_REQUEST_RESOLVED.getLog()); Map> responseHeaders = result.headers(); String requestId = extractRequestId(responseHeaders); - Optional> records = result.body().getRecords(); + Optional> records = result.body().getRecords(); if (records.isPresent()) { - List recordList = records.get(); + List recordList = records.get(); - for (V1DetokenizeRecordResponse record : recordList) { + for (com.skyflow.generated.rest.types.DetokenizeRecordResponse record : recordList) { if (record.getError().isPresent()) { DetokenizeRecordResponse recordResponse = new DetokenizeRecordResponse(record, requestId); errorRecords.add(recordResponse); @@ -309,7 +307,7 @@ public DetokenizeResponse detokenize(DetokenizeRequest detokenizeRequest) throws public GetResponse get(GetRequest getRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.GET_TRIGGERED.getLog()); - V1BulkGetRecordResponse result = null; + BulkGetRecordResponse result = null; ArrayList> data = new ArrayList<>(); ArrayList> errors = new ArrayList<>(); try { @@ -317,9 +315,9 @@ public GetResponse get(GetRequest getRequest) throws SkyflowException { Validations.validateGetRequest(getRequest); setBearerToken(); RedactionType redactionType = getRequest.getRedactionType(); - RecordServiceBulkGetRecordRequest recordServiceBulkGetRecordRequest = RecordServiceBulkGetRecordRequest.builder() + GetRecordsRequest getRecordsRequest = GetRecordsRequest.builder() .skyflowIds(getRequest.getIds()) - .redaction(redactionType != null ? RecordServiceBulkGetRecordRequestRedaction.valueOf(redactionType.toString()) : null) + .redaction(redactionType != null ? GetRecordsRequestRedaction.valueOf(redactionType.toString()) : null) .tokenization(getRequest.getReturnTokens()) .offset(getRequest.getOffset()) .limit(getRequest.getLimit()) @@ -327,20 +325,20 @@ public GetResponse get(GetRequest getRequest) throws SkyflowException { .columnName(getRequest.getColumnName()) .columnValues(getRequest.getColumnValues()) .fields(getRequest.getFields()) - .orderBy(RecordServiceBulkGetRecordRequestOrderBy.valueOf(getRequest.getOrderBy())) + .orderBy(GetRecordsRequestOrderBy.valueOf(getRequest.getOrderBy())) .build(); RequestOptions requestOptions = buildRequestOptions(); - result = super.getRecordsApi().recordServiceBulkGetRecord( + result = super.getRecordsApi().getRecords( super.getVaultConfig().getVaultId(), getRequest.getTable(), - recordServiceBulkGetRecordRequest, + getRecordsRequest, requestOptions ); LogUtil.printInfoLog(InfoLogs.GET_REQUEST_RESOLVED.getLog()); if (result.getRecords().isPresent()) { - List records = result.getRecords().get(); - for (V1FieldRecords record : records) { + List records = result.getRecords().get(); + for (GetFieldRecords record : records) { data.add(getFormattedGetRecord(record)); } } @@ -355,16 +353,16 @@ public GetResponse get(GetRequest getRequest) throws SkyflowException { public UpdateResponse update(UpdateRequest updateRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.UPDATE_TRIGGERED.getLog()); - V1UpdateRecordResponse result; + UpdateRecordResponse result; String skyflowId; HashMap tokensMap; try { LogUtil.printInfoLog(InfoLogs.VALIDATE_UPDATE_REQUEST.getLog()); Validations.validateUpdateRequest(updateRequest); setBearerToken(); - RecordServiceUpdateRecordBody updateBody = super.getUpdateRequestBody(updateRequest); + UpdateRecordRequest updateBody = super.getUpdateRequestBody(updateRequest); RequestOptions requestOptions = buildRequestOptions(); - result = super.getRecordsApi().recordServiceUpdateRecord( + result = super.getRecordsApi().updateRecord( super.getVaultConfig().getVaultId(), updateRequest.getTable(), extractUpdateSkyflowId(updateRequest.getData()), @@ -385,16 +383,16 @@ public UpdateResponse update(UpdateRequest updateRequest) throws SkyflowExceptio public DeleteResponse delete(DeleteRequest deleteRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.DELETE_TRIGGERED.getLog()); - V1BulkDeleteRecordResponse result; + BulkDeleteRecordResponse result; try { LogUtil.printInfoLog(InfoLogs.VALIDATING_DELETE_REQUEST.getLog()); Validations.validateDeleteRequest(deleteRequest); setBearerToken(); - RecordServiceBulkDeleteRecordBody deleteBody = RecordServiceBulkDeleteRecordBody.builder().skyflowIds(deleteRequest.getIds()) + BulkDeleteRecordRequest deleteBody = BulkDeleteRecordRequest.builder().skyflowIds(deleteRequest.getIds()) .build(); RequestOptions requestOptions = buildRequestOptions(); - result = super.getRecordsApi().recordServiceBulkDeleteRecord( + result = super.getRecordsApi().deleteRecords( super.getVaultConfig().getVaultId(), deleteRequest.getTable(), deleteBody, requestOptions); LogUtil.printInfoLog(InfoLogs.DELETE_REQUEST_RESOLVED.getLog()); } catch (ApiClientApiException e) { @@ -408,22 +406,22 @@ public DeleteResponse delete(DeleteRequest deleteRequest) throws SkyflowExceptio public QueryResponse query(QueryRequest queryRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.QUERY_TRIGGERED.getLog()); - V1GetQueryResponse result; + GetQueryResponse result; ArrayList> fields = new ArrayList<>(); try { LogUtil.printInfoLog(InfoLogs.VALIDATING_QUERY_REQUEST.getLog()); Validations.validateQueryRequest(queryRequest); setBearerToken(); RequestOptions requestOptions = buildRequestOptions(); - result = super.getQueryApi().queryServiceExecuteQuery( + result = super.getQueryApi().executeQuery( super.getVaultConfig().getVaultId(), - QueryServiceExecuteQueryBody.builder().query(queryRequest.getQuery()).build(), + GetQueryRequest.builder().query(queryRequest.getQuery()).build(), requestOptions ); LogUtil.printInfoLog(InfoLogs.QUERY_REQUEST_RESOLVED.getLog()); if (result.getRecords().isPresent()) { - List records = result.getRecords().get(); // Extract the List from Optional - for (V1FieldRecords record : records) { + List records = result.getRecords().get(); // Extract the List from Optional + for (FieldRecords record : records) { fields.add(getFormattedQueryRecord(record)); } } @@ -438,20 +436,20 @@ public QueryResponse query(QueryRequest queryRequest) throws SkyflowException { public TokenizeResponse tokenize(TokenizeRequest tokenizeRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.TOKENIZE_TRIGGERED.getLog()); - V1TokenizeResponse result = null; + com.skyflow.generated.rest.types.TokenizeResponse result = null; List list = new ArrayList<>(); try { LogUtil.printInfoLog(InfoLogs.VALIDATING_TOKENIZE_REQUEST.getLog()); Validations.validateTokenizeRequest(tokenizeRequest); setBearerToken(); - V1TokenizePayload payload = super.getTokenizePayload(tokenizeRequest); + TokenizePayload payload = super.getTokenizePayload(tokenizeRequest); RequestOptions requestOptions = buildRequestOptions(); - result = super.getTokensApi().recordServiceTokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); + result = super.getTokensApi().tokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); LogUtil.printInfoLog(InfoLogs.TOKENIZE_REQUEST_RESOLVED.getLog()); - if (result != null && result.getRecords().isPresent() && !result.getRecords().get().isEmpty()) { - for (V1TokenizeRecordResponse response : result.getRecords().get()) { - if (response.getToken().isPresent()) { - list.add(response.getToken().get()); + if (result != null && result.getRecords() != null && !result.getRecords().isEmpty()) { + for (TokenizeRecordResponse response : result.getRecords()) { + if (response.getToken() != null) { + list.add(response.getToken()); } } } @@ -474,7 +472,7 @@ public FileUploadResponse uploadFile(FileUploadRequest fileUploadRequest) throws setBearerToken(); File file = super.getFileForFileUpload(fileUploadRequest); - UploadFileV2Request uploadFileV2Request = UploadFileV2Request.builder() + UploadFileRequestV2 uploadFileRequest = UploadFileRequestV2.builder() .tableName(fileUploadRequest.getTable()) .columnName(fileUploadRequest.getColumnName()) .skyflowId(fileUploadRequest.getSkyflowId()) @@ -482,15 +480,15 @@ public FileUploadResponse uploadFile(FileUploadRequest fileUploadRequest) throws .build(); RequestOptions requestOptions = buildRequestOptions(); - UploadFileV2Response uploadFileV2Response = super.getRecordsApi().uploadFileV2( + UploadFileResponseV2 uploadFileResponse = super.getFilesApi().uploadFileV2( super.getVaultConfig().getVaultId(), file, - uploadFileV2Request, + uploadFileRequest, requestOptions ); fileUploadResponse = new FileUploadResponse( - uploadFileV2Response.getSkyflowId().orElse(null), + uploadFileResponse.getSkyflowId().orElse(null), null ); diff --git a/skyvault/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java index a16b17dd..276e8b87 100644 --- a/skyvault/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java @@ -4,27 +4,43 @@ import com.skyflow.generated.rest.types.V1DetokenizeRecordResponse; import com.skyflow.vault.data.BaseDetokenizeRecordResponse; +import java.util.Optional; + public class DetokenizeRecordResponse extends BaseDetokenizeRecordResponse { private final String type; private final String requestId; private final String value; + public DetokenizeRecordResponse(com.skyflow.generated.rest.types.DetokenizeRecordResponse record) { + this(record, null); + } + + public DetokenizeRecordResponse(com.skyflow.generated.rest.types.DetokenizeRecordResponse record, String requestId) { + this(record.getToken(), record.getError(), record.getValue(), record.getValueType().map(Object::toString), requestId); + } + + /** Kept for binary compatibility with callers built against the previous generated model. */ public DetokenizeRecordResponse(V1DetokenizeRecordResponse record) { this(record, null); } + /** Kept for binary compatibility with callers built against the previous generated model. */ public DetokenizeRecordResponse(V1DetokenizeRecordResponse record, String requestId) { - super(record.getToken().orElse(null), record.getError().orElse(null)); - this.value = record.getValue() - .filter(val -> val != null && !val.toString().isEmpty()) + this(record.getToken(), record.getError(), record.getValue(), record.getValueType().map(Object::toString), requestId); + } + + private DetokenizeRecordResponse(Optional token, Optional error, Optional value, + Optional valueType, String requestId) { + super(token.orElse(null), error.orElse(null)); + this.value = value + .filter(val -> val != null && !val.isEmpty()) .orElse(null); - this.type = record.getValueType() - .map(Enum::toString) + this.type = valueType .filter(val -> !"NONE".equals(val)) .orElse(null); - this.requestId = requestId; } + public String getValue() { return value; } @@ -36,4 +52,4 @@ public String getType() { public String getRequestId() { return requestId; } -} \ No newline at end of file +} diff --git a/skyvault/src/test/java/com/skyflow/RequestFidelityTests.java b/skyvault/src/test/java/com/skyflow/RequestFidelityTests.java index 7dd2cfd0..70f6784f 100644 --- a/skyvault/src/test/java/com/skyflow/RequestFidelityTests.java +++ b/skyvault/src/test/java/com/skyflow/RequestFidelityTests.java @@ -15,34 +15,9 @@ import com.skyflow.errors.SkyflowException; import com.skyflow.generated.rest.ApiClient; import com.skyflow.generated.rest.resources.query.QueryClient; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; import com.skyflow.generated.rest.resources.records.RawRecordsClient; import com.skyflow.generated.rest.resources.records.RecordsClient; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkDeleteRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.records.requests.UploadFileV2Request; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestOrderBy; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestRedaction; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.generated.rest.types.BatchRecordMethod; -import com.skyflow.generated.rest.types.RedactionEnumRedaction; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BatchRecord; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1Byot; -import com.skyflow.generated.rest.types.V1DetokenizeRecordRequest; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1TokenizeRecordRequest; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; import com.skyflow.utils.HttpUtility; import com.skyflow.utils.Utils; import com.skyflow.vault.connection.InvokeConnectionRequest; @@ -85,6 +60,33 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; +import com.skyflow.generated.rest.types.UploadFileResponseV2; +import com.skyflow.generated.rest.types.UpdateRecordResponse; +import com.skyflow.generated.rest.types.TokenizeRecordRequest; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.GetQueryResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.FieldRecords; +import com.skyflow.generated.rest.types.DetokenizeRecordRequestRedaction; +import com.skyflow.generated.rest.types.DetokenizeRecordRequest; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BatchRecord; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.records.types.UpdateRecordRequestByot; +import com.skyflow.generated.rest.resources.records.types.InsertRecordRequestByot; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestRedaction; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestOrderBy; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; +import com.skyflow.generated.rest.resources.files.FilesClient; /** * Request-fidelity tests for the v2 SDK. @@ -197,14 +199,14 @@ public void testInsertBulk_everyBuilderValueReachesGeneratedBody() { .continueOnError(false) .build(); - RecordServiceInsertRecordBody body = client.getBulkInsertRequestBody(request); + InsertRecordRequest body = client.getBulkInsertRequestBody(request); Assert.assertTrue("tokenization must carry returnTokens", body.getTokenization().isPresent()); Assert.assertTrue(body.getTokenization().get()); Assert.assertEquals("email", body.getUpsert().get()); - Assert.assertEquals(V1Byot.ENABLE_STRICT, body.getByot().get()); + Assert.assertEquals(InsertRecordRequestByot.ENABLE_STRICT, body.getByot().get()); - List records = body.getRecords().get(); + List records = body.getRecords(); Assert.assertEquals(2, records.size()); Map fields0 = records.get(0).getFields().get(); @@ -232,7 +234,7 @@ public void testInsertBulk_homogeneousReachesGeneratedBody() { .homogeneous(true) .build(); - RecordServiceInsertRecordBody body = client.getBulkInsertRequestBody(request); + InsertRecordRequest body = client.getBulkInsertRequestBody(request); Assert.assertTrue(body.getHomogeneous().isPresent()); Assert.assertTrue(body.getHomogeneous().get()); } @@ -245,9 +247,9 @@ public void testInsertBulk_defaultsReachGeneratedBody() { .values(rows(richRow())) .build(); - RecordServiceInsertRecordBody body = client.getBulkInsertRequestBody(request); + InsertRecordRequest body = client.getBulkInsertRequestBody(request); Assert.assertFalse("returnTokens defaults to false", body.getTokenization().get()); - Assert.assertEquals("tokenMode defaults to DISABLE -> byot DISABLE", V1Byot.DISABLE, body.getByot().get()); + Assert.assertEquals("tokenMode defaults to DISABLE -> byot DISABLE", InsertRecordRequestByot.DISABLE, body.getByot().get()); Assert.assertFalse("upsert not set -> absent", body.getUpsert().isPresent()); Assert.assertFalse("homogeneous not set -> absent", body.getHomogeneous().isPresent()); } @@ -273,7 +275,7 @@ public void testInsertBulk_tokensPairPositionallyWithValues() { .tokenMode(TokenMode.ENABLE_STRICT) .build(); - List records = client.getBulkInsertRequestBody(request).getRecords().get(); + List records = client.getBulkInsertRequestBody(request).getRecords(); Assert.assertEquals("4111111111111111", records.get(0).getFields().get().get("card_number")); Assert.assertEquals("token-for-row-0", records.get(0).getTokens().get().get("card_number")); @@ -292,7 +294,7 @@ public void testInsertBulk_recordOrderIsPreserved() { } InsertRequest request = InsertRequest.builder().table("cards").values(values).build(); - List records = client.getBulkInsertRequestBody(request).getRecords().get(); + List records = client.getBulkInsertRequestBody(request).getRecords(); Assert.assertEquals(5, records.size()); for (int i = 0; i < 5; i++) { @@ -318,7 +320,7 @@ public void testInsertBulk_fewerTokensThanValuesLeavesTrailingRecordsWithoutToke .tokenMode(TokenMode.ENABLE) .build(); - List records = client.getBulkInsertRequestBody(request).getRecords().get(); + List records = client.getBulkInsertRequestBody(request).getRecords(); Assert.assertEquals(2, records.size()); Assert.assertEquals("token-0", records.get(0).getTokens().get().get("card_number")); Assert.assertFalse("record without a matching token entry gets no tokens", @@ -346,24 +348,25 @@ public void testInsertBatch_everyBuilderValueReachesGeneratedBody() { .continueOnError(true) .build(); - RecordServiceBatchOperationBody body = client.getBatchInsertRequestBody(request); + BatchOperationRequest body = client.getBatchInsertRequestBody(request); Assert.assertTrue("batch body always sends continueOnError=true", body.getContinueOnError().get()); - Assert.assertEquals(V1Byot.ENABLE, body.getByot().get()); + Assert.assertEquals("byot is carried as an extra property on the batch body", "ENABLE", + body.getAdditionalProperties().get("byot")); - List records = body.getRecords().get(); + List records = body.getRecords(); Assert.assertEquals(2, records.size()); - V1BatchRecord first = records.get(0); - Assert.assertEquals("table maps to per-record tableName", "cards", first.getTableName().get()); - Assert.assertEquals(BatchRecordMethod.POST, first.getMethod().get()); + BatchRecord first = records.get(0); + Assert.assertEquals("table maps to per-record tableName", "cards", first.getTableName()); + Assert.assertEquals(BatchRecordMethod.POST, first.getMethod()); Assert.assertEquals("email", first.getUpsert().get()); Assert.assertTrue(first.getTokenization().get()); - Assert.assertEquals("whole values map must be carried verbatim", row1, first.getFields().get()); - Assert.assertEquals(NON_ASCII_NAME, first.getFields().get().get("name")); + Assert.assertEquals("whole values map must be carried verbatim", row1, first.getFields()); + Assert.assertEquals(NON_ASCII_NAME, first.getFields().get("name")); - Assert.assertEquals("cards", records.get(1).getTableName().get()); - Assert.assertEquals("second record", records.get(1).getFields().get().get("name")); + Assert.assertEquals("cards", records.get(1).getTableName()); + Assert.assertEquals("second record", records.get(1).getFields().get("name")); } @Test @@ -390,10 +393,10 @@ public void testInsertBatch_tokensPairPositionallyAndOrderIsPreserved() { .continueOnError(true) .build(); - List records = client.getBatchInsertRequestBody(request).getRecords().get(); + List records = client.getBatchInsertRequestBody(request).getRecords(); Assert.assertEquals(4, records.size()); for (int i = 0; i < 4; i++) { - Assert.assertEquals(i, records.get(i).getFields().get().get("position")); + Assert.assertEquals(i, records.get(i).getFields().get("position")); Assert.assertEquals("token-" + i, records.get(i).getTokens().get().get("position")); } } @@ -408,23 +411,24 @@ public void testInsertBatch_homogeneousIsDropped_knownGap() { InsertRequest bulkRequest = InsertRequest.builder() .table("cards").values(rows(richRow())).homogeneous(true).continueOnError(false).build(); - RecordServiceInsertRecordBody bulkBody = client.getBulkInsertRequestBody(bulkRequest); + InsertRecordRequest bulkBody = client.getBulkInsertRequestBody(bulkRequest); Assert.assertTrue("bulk branch DOES send homogeneous", bulkBody.getHomogeneous().get()); Assert.assertTrue(bulkBody.toString().contains("homogeneous")); InsertRequest batchRequest = InsertRequest.builder() .table("cards").values(rows(richRow())).homogeneous(true).continueOnError(true).build(); - RecordServiceBatchOperationBody batchBody = client.getBatchInsertRequestBody(batchRequest); + BatchOperationRequest batchBody = client.getBatchInsertRequestBody(batchRequest); - for (Method method : RecordServiceBatchOperationBody.class.getMethods()) { + for (Method method : BatchOperationRequest.class.getMethods()) { Assert.assertFalse("batch body has no homogeneous accessor", method.getName().toLowerCase(Locale.ROOT).contains("homogeneous")); } - for (Method method : V1BatchRecord.class.getMethods()) { + for (Method method : BatchRecord.class.getMethods()) { Assert.assertFalse("batch record has no homogeneous accessor", method.getName().toLowerCase(Locale.ROOT).contains("homogeneous")); } - Assert.assertTrue(batchBody.getAdditionalProperties().isEmpty()); + Assert.assertEquals("only byot rides along as an extra property", + Collections.singleton("byot"), batchBody.getAdditionalProperties().keySet()); Assert.assertFalse("homogeneous never reaches the wire on the batch branch", batchBody.toString().contains("homogeneous")); } @@ -434,17 +438,17 @@ public void testInsert_continueOnErrorFalseUsesBulkEndpointWithTableAsPathParam( ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())) - .thenReturn(V1InsertRecordResponse.builder().build()); + when(mockRecords.insertRecords(anyString(), anyString(), any())) + .thenReturn(InsertRecordResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); InsertRequest request = InsertRequest.builder() .table("cards").values(rows(richRow())).returnTokens(true).continueOnError(false).build(); controller.insert(request); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceInsertRecordBody.class); - Mockito.verify(mockRecords).recordServiceInsertRecord(eq(VAULT_ID), eq("cards"), bodyCaptor.capture()); + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(InsertRecordRequest.class); + Mockito.verify(mockRecords).insertRecords(eq(VAULT_ID), eq("cards"), bodyCaptor.capture()); Assert.assertTrue(bodyCaptor.getValue().getTokenization().get()); Mockito.verify(mockRecords, Mockito.never()).withRawResponse(); } @@ -456,21 +460,21 @@ public void testInsert_continueOnErrorTrueUsesBatchEndpoint() throws Exception { RawRecordsClient mockRawRecords = Mockito.mock(RawRecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); when(mockRecords.withRawResponse()).thenReturn(mockRawRecords); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())) + when(mockRawRecords.batchOperation(anyString(), any(), any())) .thenReturn(new com.skyflow.generated.rest.core.ApiClientHttpResponse<>( - V1BatchOperationResponse.builder().build(), buildOkHttpResponse())); + BatchOperationResponse.builder().build(), buildOkHttpResponse())); VaultController controller = newControllerWithMockApi(mockApi); InsertRequest request = InsertRequest.builder() .table("cards").values(rows(richRow())).continueOnError(true).build(); controller.insert(request); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceBatchOperationBody.class); - Mockito.verify(mockRawRecords).recordServiceBatchOperation(eq(VAULT_ID), bodyCaptor.capture(), any()); + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(BatchOperationRequest.class); + Mockito.verify(mockRawRecords).batchOperation(eq(VAULT_ID), bodyCaptor.capture(), any()); Assert.assertTrue(bodyCaptor.getValue().getContinueOnError().get()); - Assert.assertEquals("cards", bodyCaptor.getValue().getRecords().get().get(0).getTableName().get()); - Mockito.verify(mockRecords, Mockito.never()).recordServiceInsertRecord(anyString(), anyString(), any()); + Assert.assertEquals("cards", bodyCaptor.getValue().getRecords().get(0).getTableName()); + Mockito.verify(mockRecords, Mockito.never()).insertRecords(anyString(), anyString(), any()); } // ================================================================== @@ -482,8 +486,8 @@ public void testUpdate_everyBuilderValueReachesGeneratedRequest() throws Excepti ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) - .thenReturn(V1UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) + .thenReturn(UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -508,17 +512,17 @@ public void testUpdate_everyBuilderValueReachesGeneratedRequest() throws Excepti ArgumentCaptor tableCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor idCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceUpdateRecordBody.class); - Mockito.verify(mockRecords).recordServiceUpdateRecord( + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(UpdateRecordRequest.class); + Mockito.verify(mockRecords).updateRecord( eq(VAULT_ID), tableCaptor.capture(), idCaptor.capture(), bodyCaptor.capture(), any()); Assert.assertEquals("cards", tableCaptor.getValue()); Assert.assertEquals("skyflowId becomes the path id", "sky-id-1", idCaptor.getValue()); - RecordServiceUpdateRecordBody body = bodyCaptor.getValue(); + UpdateRecordRequest body = bodyCaptor.getValue(); Assert.assertTrue(body.getTokenization().get()); - Assert.assertEquals(V1Byot.ENABLE, body.getByot().get()); + Assert.assertEquals(UpdateRecordRequestByot.ENABLE, body.getByot().get()); Map fields = body.getRecord().get().getFields().get(); Assert.assertFalse("skyflowId must be stripped from fields", fields.containsKey("skyflowId")); @@ -535,8 +539,8 @@ public void testUpdate_deprecatedSkyflowIdKeyBecomesPathIdAndIsStripped() throws ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) - .thenReturn(V1UpdateRecordResponse.builder().skyflowId("snake-id").build()); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) + .thenReturn(UpdateRecordResponse.builder().skyflowId("snake-id").build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -547,9 +551,9 @@ public void testUpdate_deprecatedSkyflowIdKeyBecomesPathIdAndIsStripped() throws controller.update(UpdateRequest.builder().table("cards").data(data).build()); ArgumentCaptor idCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceUpdateRecordBody.class); - Mockito.verify(mockRecords).recordServiceUpdateRecord( + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(UpdateRecordRequest.class); + Mockito.verify(mockRecords).updateRecord( anyString(), anyString(), idCaptor.capture(), bodyCaptor.capture(), any()); Assert.assertEquals("snake-id", idCaptor.getValue()); @@ -563,8 +567,8 @@ public void testUpdate_defaultsReachGeneratedRequest() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) - .thenReturn(V1UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) + .thenReturn(UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -574,13 +578,13 @@ public void testUpdate_defaultsReachGeneratedRequest() throws Exception { controller.update(UpdateRequest.builder().table("cards").data(data).build()); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceUpdateRecordBody.class); - Mockito.verify(mockRecords).recordServiceUpdateRecord( + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(UpdateRecordRequest.class); + Mockito.verify(mockRecords).updateRecord( anyString(), anyString(), anyString(), bodyCaptor.capture(), any()); Assert.assertFalse("returnTokens defaults to false", bodyCaptor.getValue().getTokenization().get()); - Assert.assertEquals(V1Byot.DISABLE, bodyCaptor.getValue().getByot().get()); + Assert.assertEquals(UpdateRecordRequestByot.DISABLE, bodyCaptor.getValue().getByot().get()); Assert.assertFalse("no tokens supplied -> tokens absent", bodyCaptor.getValue().getRecord().get().getTokens().isPresent()); } @@ -594,8 +598,8 @@ public void testUpdate_mutatesCallersDataMap_knownGap() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) - .thenReturn(V1UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) + .thenReturn(UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -625,9 +629,9 @@ public void testUpdate_mutatesCallersDataMap_knownGap() throws Exception { private static VaultController mockGetController(RecordsClient mockRecords) throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())) - .thenReturn(V1BulkGetRecordResponse.builder() - .records(Collections.emptyList()) + when(mockRecords.getRecords(anyString(), anyString(), any(), any())) + .thenReturn(BulkGetRecordResponse.builder() + .records(Collections.emptyList()) .build()); return newControllerWithMockApi(mockApi); } @@ -651,21 +655,21 @@ public void testGet_idsFieldsRedactionAndPagingReachGeneratedRequest() throws Ex controller.get(request); ArgumentCaptor tableCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( eq(VAULT_ID), tableCaptor.capture(), requestCaptor.capture(), any()); Assert.assertEquals("cards", tableCaptor.getValue()); - RecordServiceBulkGetRecordRequest generated = requestCaptor.getValue(); + GetRecordsRequest generated = requestCaptor.getValue(); Assert.assertEquals("ids map to skyflowIds, order preserved", Arrays.asList("id-1", "id-2", "id-3"), generated.getSkyflowIds().get()); Assert.assertEquals(Arrays.asList("name", "card_number"), generated.getFields().get()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestRedaction.PLAIN_TEXT, generated.getRedaction().get()); + Assert.assertEquals(GetRecordsRequestRedaction.PLAIN_TEXT, generated.getRedaction().get()); Assert.assertEquals("10", generated.getOffset().get()); Assert.assertEquals("25", generated.getLimit().get()); Assert.assertFalse("downloadUrl(false) must reach downloadURL", generated.getDownloadUrl().get()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestOrderBy.DESCENDING, generated.getOrderBy().get()); + Assert.assertEquals(GetRecordsRequestOrderBy.DESCENDING, generated.getOrderBy().get()); Assert.assertFalse(generated.getColumnName().isPresent()); Assert.assertFalse(generated.getColumnValues().isPresent()); } @@ -684,16 +688,16 @@ public void testGet_columnNameAndColumnValuesReachGeneratedRequest() throws Exce controller.get(request); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); - RecordServiceBulkGetRecordRequest generated = requestCaptor.getValue(); + GetRecordsRequest generated = requestCaptor.getValue(); Assert.assertEquals("email", generated.getColumnName().get()); Assert.assertEquals(Arrays.asList("a@example.com", NON_ASCII_NAME, "value with spaces"), generated.getColumnValues().get()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestRedaction.MASKED, generated.getRedaction().get()); + Assert.assertEquals(GetRecordsRequestRedaction.MASKED, generated.getRedaction().get()); Assert.assertFalse(generated.getSkyflowIds().isPresent()); } @@ -704,9 +708,9 @@ public void testGet_returnTokensMapsToTokenization() throws Exception { controller.get(GetRequest.builder().table("cards").ids(list("id-1")).returnTokens(true).build()); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); Assert.assertTrue(requestCaptor.getValue().getTokenization().get()); @@ -720,12 +724,12 @@ public void testGet_defaultOrderByAndDownloadUrlReachGeneratedRequest() throws E controller.get(GetRequest.builder().table("cards").ids(list("id-1")).build()); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestOrderBy.ASCENDING, + Assert.assertEquals(GetRecordsRequestOrderBy.ASCENDING, requestCaptor.getValue().getOrderBy().get()); Assert.assertTrue("downloadUrl defaults to true", requestCaptor.getValue().getDownloadUrl().get()); } @@ -738,11 +742,11 @@ public void testGet_orderByAcceptsAllThreeGeneratedEnumNames() throws Exception controller.get(GetRequest.builder().table("cards").ids(list("id-1")).orderBy(orderBy).build()); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestOrderBy.valueOf(orderBy), + Assert.assertEquals(GetRecordsRequestOrderBy.valueOf(orderBy), requestCaptor.getValue().getOrderBy().get()); } } @@ -766,7 +770,7 @@ public void testGet_orderByInvalidValueThrowsSkyflowException() throws Exception Assert.assertEquals(ErrorMessage.InvalidOrderBy.getMessage(), e.getMessage()); } Mockito.verify(mockRecords, Mockito.never()) - .recordServiceBulkGetRecord(anyString(), anyString(), any(), any()); + .getRecords(anyString(), anyString(), any(), any()); } } @@ -790,9 +794,9 @@ public void testGet_downloadUrlNullCoercesToTrueButReturnTokensNullDoesNot_known VaultController controller = mockGetController(mockRecords); controller.get(request); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); Assert.assertTrue("downloadURL=true is sent even though the user passed null", @@ -810,8 +814,8 @@ public void testDelete_tableAndIdsReachGeneratedRequest() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkDeleteRecord(anyString(), anyString(), any(), any())) - .thenReturn(V1BulkDeleteRecordResponse.builder().build()); + when(mockRecords.deleteRecords(anyString(), anyString(), any(), any())) + .thenReturn(BulkDeleteRecordResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); controller.delete(DeleteRequest.builder() @@ -820,9 +824,9 @@ public void testDelete_tableAndIdsReachGeneratedRequest() throws Exception { .build()); ArgumentCaptor tableCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceBulkDeleteRecordBody.class); - Mockito.verify(mockRecords).recordServiceBulkDeleteRecord( + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(BulkDeleteRecordRequest.class); + Mockito.verify(mockRecords).deleteRecords( eq(VAULT_ID), tableCaptor.capture(), bodyCaptor.capture(), any()); Assert.assertEquals("cards", tableCaptor.getValue()); @@ -839,8 +843,8 @@ public void testQuery_queryStringReachesGeneratedBodyVerbatim() throws Exception ApiClient mockApi = Mockito.mock(ApiClient.class); QueryClient mockQuery = Mockito.mock(QueryClient.class); when(mockApi.query()).thenReturn(mockQuery); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())) - .thenReturn(V1GetQueryResponse.builder().build()); + when(mockQuery.executeQuery(anyString(), any(), any())) + .thenReturn(GetQueryResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -848,12 +852,12 @@ public void testQuery_queryStringReachesGeneratedBodyVerbatim() throws Exception + "WHERE name = 'Smith''s' AND city = '" + NON_ASCII_CITY + "'\nLIMIT 10"; controller.query(QueryRequest.builder().query(sql).build()); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(QueryServiceExecuteQueryBody.class); - Mockito.verify(mockQuery).queryServiceExecuteQuery(eq(VAULT_ID), bodyCaptor.capture(), any()); + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(GetQueryRequest.class); + Mockito.verify(mockQuery).executeQuery(eq(VAULT_ID), bodyCaptor.capture(), any()); Assert.assertEquals("query with quotes and newlines must be sent unchanged", - sql, bodyCaptor.getValue().getQuery().get()); + sql, bodyCaptor.getValue().getQuery()); } @Test @@ -861,16 +865,16 @@ public void testQuery_simpleQueryReachesGeneratedBody() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); QueryClient mockQuery = Mockito.mock(QueryClient.class); when(mockApi.query()).thenReturn(mockQuery); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())) - .thenReturn(V1GetQueryResponse.builder().build()); + when(mockQuery.executeQuery(anyString(), any(), any())) + .thenReturn(GetQueryResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); controller.query(QueryRequest.builder().query("SELECT * FROM cards LIMIT 1").build()); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(QueryServiceExecuteQueryBody.class); - Mockito.verify(mockQuery).queryServiceExecuteQuery(anyString(), bodyCaptor.capture(), any()); - Assert.assertEquals("SELECT * FROM cards LIMIT 1", bodyCaptor.getValue().getQuery().get()); + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(GetQueryRequest.class); + Mockito.verify(mockQuery).executeQuery(anyString(), bodyCaptor.capture(), any()); + Assert.assertEquals("SELECT * FROM cards LIMIT 1", bodyCaptor.getValue().getQuery()); } // ================================================================== @@ -886,10 +890,10 @@ public void testTokenize_columnValuesReachPayloadInOrder() { ColumnValue.builder().value(NON_ASCII_NAME).columnGroup("cg_names").build(), ColumnValue.builder().value("value with spaces").columnGroup("cg_misc").build()); - V1TokenizePayload payload = client.getTokenizePayload( + TokenizePayload payload = client.getTokenizePayload( TokenizeRequest.builder().values(columnValues).build()); - List parameters = payload.getTokenizationParameters().get(); + List parameters = payload.getTokenizationParameters(); Assert.assertEquals(3, parameters.size()); Assert.assertEquals("4111111111111111", parameters.get(0).getValue().get()); Assert.assertEquals("cg_cards", parameters.get(0).getColumnGroup().get()); @@ -905,17 +909,17 @@ public void testTokenize_payloadReachesGeneratedApiCall() throws Exception { com.skyflow.generated.rest.resources.tokens.TokensClient mockTokens = Mockito.mock(com.skyflow.generated.rest.resources.tokens.TokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); - when(mockTokens.recordServiceTokenize(anyString(), any(), any())) - .thenReturn(V1TokenizeResponse.builder().build()); + when(mockTokens.tokenize(anyString(), any(), any())) + .thenReturn(com.skyflow.generated.rest.types.TokenizeResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); controller.tokenize(TokenizeRequest.builder().values(Collections.singletonList( ColumnValue.builder().value(NON_ASCII_NAME).columnGroup("cg_names").build())).build()); - ArgumentCaptor payloadCaptor = ArgumentCaptor.forClass(V1TokenizePayload.class); - Mockito.verify(mockTokens).recordServiceTokenize(eq(VAULT_ID), payloadCaptor.capture(), any()); + ArgumentCaptor payloadCaptor = ArgumentCaptor.forClass(TokenizePayload.class); + Mockito.verify(mockTokens).tokenize(eq(VAULT_ID), payloadCaptor.capture(), any()); - V1TokenizeRecordRequest parameter = payloadCaptor.getValue().getTokenizationParameters().get().get(0); + TokenizeRecordRequest parameter = payloadCaptor.getValue().getTokenizationParameters().get(0); Assert.assertEquals(NON_ASCII_NAME, parameter.getValue().get()); Assert.assertEquals("cg_names", parameter.getColumnGroup().get()); } @@ -934,20 +938,20 @@ public void testDetokenize_eachTokenKeepsItsOwnRedactionType() { new DetokenizeData("tok-masked", RedactionType.MASKED), new DetokenizeData("tok-redacted", RedactionType.REDACTED))); - V1DetokenizePayload payload = client.getDetokenizePayload( + DetokenizePayload payload = client.getDetokenizePayload( DetokenizeRequest.builder().detokenizeData(detokenizeData).build()); - List parameters = payload.getDetokenizationParameters().get(); + List parameters = payload.getDetokenizationParameters(); Assert.assertEquals(4, parameters.size()); - Assert.assertEquals("tok-default", parameters.get(0).getToken().get()); - Assert.assertEquals(RedactionEnumRedaction.DEFAULT, parameters.get(0).getRedaction().get()); - Assert.assertEquals("tok-plain", parameters.get(1).getToken().get()); - Assert.assertEquals(RedactionEnumRedaction.PLAIN_TEXT, parameters.get(1).getRedaction().get()); - Assert.assertEquals("tok-masked", parameters.get(2).getToken().get()); - Assert.assertEquals(RedactionEnumRedaction.MASKED, parameters.get(2).getRedaction().get()); - Assert.assertEquals("tok-redacted", parameters.get(3).getToken().get()); - Assert.assertEquals(RedactionEnumRedaction.REDACTED, parameters.get(3).getRedaction().get()); + Assert.assertEquals("tok-default", parameters.get(0).getToken()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.DEFAULT, parameters.get(0).getRedaction().get()); + Assert.assertEquals("tok-plain", parameters.get(1).getToken()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.PLAIN_TEXT, parameters.get(1).getRedaction().get()); + Assert.assertEquals("tok-masked", parameters.get(2).getToken()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.MASKED, parameters.get(2).getRedaction().get()); + Assert.assertEquals("tok-redacted", parameters.get(3).getToken()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.REDACTED, parameters.get(3).getRedaction().get()); } @Test @@ -957,12 +961,12 @@ public void testDetokenize_tokenWithoutRedactionDefaultsToDefault() { new DetokenizeData("tok-a"), new DetokenizeData("tok-b", null))); - V1DetokenizePayload payload = client.getDetokenizePayload( + DetokenizePayload payload = client.getDetokenizePayload( DetokenizeRequest.builder().detokenizeData(detokenizeData).build()); - List parameters = payload.getDetokenizationParameters().get(); - Assert.assertEquals(RedactionEnumRedaction.DEFAULT, parameters.get(0).getRedaction().get()); - Assert.assertEquals(RedactionEnumRedaction.DEFAULT, parameters.get(1).getRedaction().get()); + List parameters = payload.getDetokenizationParameters(); + Assert.assertEquals(DetokenizeRecordRequestRedaction.DEFAULT, parameters.get(0).getRedaction().get()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.DEFAULT, parameters.get(1).getRedaction().get()); } @Test @@ -971,7 +975,7 @@ public void testDetokenize_continueOnErrorAndDownloadUrlReachPayload() { ArrayList detokenizeData = new ArrayList<>(Collections.singletonList(new DetokenizeData("tok-a"))); - V1DetokenizePayload payload = client.getDetokenizePayload(DetokenizeRequest.builder() + DetokenizePayload payload = client.getDetokenizePayload(DetokenizeRequest.builder() .detokenizeData(detokenizeData) .continueOnError(true) .downloadUrl(true) @@ -979,7 +983,7 @@ public void testDetokenize_continueOnErrorAndDownloadUrlReachPayload() { Assert.assertTrue(payload.getContinueOnError().get()); Assert.assertTrue(payload.getDownloadUrl().get()); - V1DetokenizePayload defaults = client.getDetokenizePayload(DetokenizeRequest.builder() + DetokenizePayload defaults = client.getDetokenizePayload(DetokenizeRequest.builder() .detokenizeData(detokenizeData) .build()); Assert.assertFalse("continueOnError defaults to false", defaults.getContinueOnError().get()); @@ -994,12 +998,12 @@ public void testDetokenize_tokenOrderIsPreserved() { detokenizeData.add(new DetokenizeData("tok-" + i, RedactionType.MASKED)); } - List parameters = client.getDetokenizePayload( + List parameters = client.getDetokenizePayload( DetokenizeRequest.builder().detokenizeData(detokenizeData).build()) - .getDetokenizationParameters().get(); + .getDetokenizationParameters(); for (int i = 0; i < 5; i++) { - Assert.assertEquals("tok-" + i, parameters.get(i).getToken().get()); + Assert.assertEquals("tok-" + i, parameters.get(i).getToken()); } } @@ -1007,11 +1011,11 @@ public void testDetokenize_tokenOrderIsPreserved() { // uploadFile // ================================================================== - private static VaultController mockUploadController(RecordsClient mockRecords) throws Exception { + private static VaultController mockUploadController(FilesClient mockFiles) throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); - when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())) - .thenReturn(UploadFileV2Response.builder().build()); + when(mockApi.files()).thenReturn(mockFiles); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())) + .thenReturn(UploadFileResponseV2.builder().build()); return newControllerWithMockApi(mockApi); } @@ -1021,8 +1025,8 @@ public void testUploadFile_metadataFieldsAndFilePathReachGeneratedRequest() thro tempFile.deleteOnExit(); Files.write(tempFile.toPath(), "hello".getBytes("UTF-8")); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - VaultController controller = mockUploadController(mockRecords); + FilesClient mockFiles = Mockito.mock(FilesClient.class); + VaultController controller = mockUploadController(mockFiles); controller.uploadFile(FileUploadRequest.builder() .table("cards") @@ -1032,11 +1036,11 @@ public void testUploadFile_metadataFieldsAndFilePathReachGeneratedRequest() thro .build()); ArgumentCaptor fileCaptor = ArgumentCaptor.forClass(File.class); - ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileV2Request.class); - Mockito.verify(mockRecords).uploadFileV2( + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileRequestV2.class); + Mockito.verify(mockFiles).uploadFileV2( eq(VAULT_ID), fileCaptor.capture(), requestCaptor.capture(), any()); - UploadFileV2Request generated = requestCaptor.getValue(); + UploadFileRequestV2 generated = requestCaptor.getValue(); Assert.assertEquals("table maps to tableName", "cards", generated.getTableName()); Assert.assertEquals("file_column", generated.getColumnName()); Assert.assertEquals("sky-id-9", generated.getSkyflowId().get()); @@ -1054,8 +1058,8 @@ public void testUploadFile_base64AndFileNameProduceMatchingFile() throws Excepti byte[] payload = "café ☕".getBytes("UTF-8"); String base64 = Base64.getEncoder().encodeToString(payload); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - VaultController controller = mockUploadController(mockRecords); + FilesClient mockFiles = Mockito.mock(FilesClient.class); + VaultController controller = mockUploadController(mockFiles); controller.uploadFile(FileUploadRequest.builder() .table("cards") @@ -1066,8 +1070,8 @@ public void testUploadFile_base64AndFileNameProduceMatchingFile() throws Excepti .build()); ArgumentCaptor fileCaptor = ArgumentCaptor.forClass(File.class); - ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileV2Request.class); - Mockito.verify(mockRecords).uploadFileV2( + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileRequestV2.class); + Mockito.verify(mockFiles).uploadFileV2( anyString(), fileCaptor.capture(), requestCaptor.capture(), any()); Assert.assertEquals(target.getAbsolutePath(), fileCaptor.getValue().getPath()); @@ -1082,8 +1086,8 @@ public void testUploadFile_fileObjectIsPassedThroughUnchanged() throws Exception tempFile.deleteOnExit(); Files.write(tempFile.toPath(), new byte[]{1, 2, 3}); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - VaultController controller = mockUploadController(mockRecords); + FilesClient mockFiles = Mockito.mock(FilesClient.class); + VaultController controller = mockUploadController(mockFiles); controller.uploadFile(FileUploadRequest.builder() .table("cards") @@ -1092,8 +1096,8 @@ public void testUploadFile_fileObjectIsPassedThroughUnchanged() throws Exception .build()); ArgumentCaptor fileCaptor = ArgumentCaptor.forClass(File.class); - ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileV2Request.class); - Mockito.verify(mockRecords).uploadFileV2( + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileRequestV2.class); + Mockito.verify(mockFiles).uploadFileV2( anyString(), fileCaptor.capture(), requestCaptor.capture(), any()); Assert.assertSame("the caller's File instance must be forwarded", tempFile, fileCaptor.getValue()); @@ -1110,8 +1114,8 @@ public void testUploadFile_filePathTakesPrecedenceOverOtherSources() throws Exce objectFile.deleteOnExit(); Files.write(objectFile.toPath(), "from-object".getBytes("UTF-8")); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - VaultController controller = mockUploadController(mockRecords); + FilesClient mockFiles = Mockito.mock(FilesClient.class); + VaultController controller = mockUploadController(mockFiles); controller.uploadFile(FileUploadRequest.builder() .table("cards") @@ -1121,7 +1125,7 @@ public void testUploadFile_filePathTakesPrecedenceOverOtherSources() throws Exce .build()); ArgumentCaptor fileCaptor = ArgumentCaptor.forClass(File.class); - Mockito.verify(mockRecords).uploadFileV2(anyString(), fileCaptor.capture(), any(), any()); + Mockito.verify(mockFiles).uploadFileV2(anyString(), fileCaptor.capture(), any(), any()); Assert.assertEquals(pathFile.getAbsolutePath(), fileCaptor.getValue().getPath()); } diff --git a/skyvault/src/test/java/com/skyflow/VaultClientTests.java b/skyvault/src/test/java/com/skyflow/VaultClientTests.java index 85db62a8..75339585 100644 --- a/skyvault/src/test/java/com/skyflow/VaultClientTests.java +++ b/skyvault/src/test/java/com/skyflow/VaultClientTests.java @@ -10,12 +10,7 @@ import com.skyflow.generated.rest.types.*; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; import com.skyflow.generated.rest.resources.tokens.TokensClient; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.UpdateRequest; import com.skyflow.vault.tokens.ColumnValue; @@ -43,6 +38,12 @@ import java.util.*; import java.util.Arrays; import java.util.Collections; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.records.types.InsertRecordRequestByot; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; public class VaultClientTests { private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; @@ -148,10 +149,10 @@ public void testGetDetokenizePayload() { .downloadURL(true) .continueOnError(false) .build(); - V1DetokenizePayload payload = vaultClient.getDetokenizePayload(detokenizeRequest); + DetokenizePayload payload = vaultClient.getDetokenizePayload(detokenizeRequest); Assert.assertFalse(payload.getContinueOnError().get()); Assert.assertTrue(payload.getDownloadUrl().get()); - Assert.assertEquals(2, payload.getDetokenizationParameters().get().size()); + Assert.assertEquals(2, payload.getDetokenizationParameters().size()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); } @@ -177,17 +178,17 @@ public void testGetBulkInsertRequestBody() { .tokenMode(TokenMode.ENABLE) .returnTokens(true) .build(); - RecordServiceInsertRecordBody body1 = vaultClient.getBulkInsertRequestBody(insertRequest1); + InsertRecordRequest body1 = vaultClient.getBulkInsertRequestBody(insertRequest1); Assert.assertTrue(body1.getTokenization().get()); - Assert.assertEquals(V1Byot.ENABLE, body1.getByot().get()); - Assert.assertEquals(2, body1.getRecords().get().size()); + Assert.assertEquals(InsertRecordRequestByot.ENABLE, body1.getByot().get()); + Assert.assertEquals(2, body1.getRecords().size()); InsertRequest insertRequest2 = InsertRequest.builder() .table(table) .values(insertValues) .build(); - RecordServiceInsertRecordBody body2 = vaultClient.getBulkInsertRequestBody(insertRequest2); - Assert.assertEquals(2, body2.getRecords().get().size()); + InsertRecordRequest body2 = vaultClient.getBulkInsertRequestBody(insertRequest2); + Assert.assertEquals(2, body2.getRecords().size()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); } @@ -213,13 +214,13 @@ public void testGetBatchInsertRequestBody() { .tokenMode(TokenMode.ENABLE) .returnTokens(false) .build(); - RecordServiceBatchOperationBody body1 = vaultClient.getBatchInsertRequestBody(insertRequest1); + BatchOperationRequest body1 = vaultClient.getBatchInsertRequestBody(insertRequest1); Assert.assertTrue(body1.getContinueOnError().get()); - Assert.assertEquals(2, body1.getRecords().get().size()); + Assert.assertEquals(2, body1.getRecords().size()); InsertRequest insertRequest2 = InsertRequest.builder().table(table).values(insertValues).build(); - RecordServiceBatchOperationBody body2 = vaultClient.getBatchInsertRequestBody(insertRequest2); - Assert.assertEquals(2, body2.getRecords().get().size()); + BatchOperationRequest body2 = vaultClient.getBatchInsertRequestBody(insertRequest2); + Assert.assertEquals(2, body2.getRecords().size()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); } @@ -239,7 +240,7 @@ public void testGetUpdateRequestBodyWithTokens() { .tokens(tokenMap) .returnTokens(true) .build(); - RecordServiceUpdateRecordBody body = vaultClient.getUpdateRequestBody(updateRequest); + UpdateRecordRequest body = vaultClient.getUpdateRequestBody(updateRequest); Assert.assertTrue(body.getTokenization().get()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); @@ -259,7 +260,7 @@ public void testGetUpdateRequestBodyWithoutTokens() { .data(valueMap) .returnTokens(false) .build(); - RecordServiceUpdateRecordBody body = vaultClient.getUpdateRequestBody(updateRequest); + UpdateRecordRequest body = vaultClient.getUpdateRequestBody(updateRequest); Assert.assertFalse(body.getTokenization().get()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); @@ -273,8 +274,8 @@ public void testGetTokenizePayload() { List columnValues = new ArrayList<>(); columnValues.add(columnValue); TokenizeRequest tokenizeRequest = TokenizeRequest.builder().values(columnValues).build(); - V1TokenizePayload payload = vaultClient.getTokenizePayload(tokenizeRequest); - Assert.assertEquals(1, payload.getTokenizationParameters().get().size()); + TokenizePayload payload = vaultClient.getTokenizePayload(tokenizeRequest); + Assert.assertEquals(1, payload.getTokenizationParameters().size()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); } diff --git a/skyvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java b/skyvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java index 8cae2235..4636dd6d 100644 --- a/skyvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java @@ -20,19 +20,6 @@ import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.generated.rest.resources.tokens.RawTokensClient; import com.skyflow.generated.rest.resources.tokens.TokensClient; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1DetokenizeRecordResponse; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1RecordMetaProperties; -import com.skyflow.generated.rest.types.V1TokenizeRecordResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; import com.skyflow.utils.Constants; import com.skyflow.utils.Utils; import com.skyflow.vault.data.DeleteRequest; @@ -74,6 +61,18 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; +import com.skyflow.generated.rest.types.UploadFileResponseV2; +import com.skyflow.generated.rest.types.UpdateRecordResponse; +import com.skyflow.generated.rest.types.TokenizeRecordResponse; +import com.skyflow.generated.rest.types.RecordMetaProperties; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.GetQueryResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.FieldRecords; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.resources.files.FilesClient; public class VaultControllerTests { private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; @@ -275,9 +274,9 @@ public void testGetFormattedGetRecordNormalisesSkyflowId() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "abc-123"); fields.put("name", "John"); - V1FieldRecords record = V1FieldRecords.builder().fields(fields).build(); + GetFieldRecords record = GetFieldRecords.builder().fields(fields).build(); - Method method = VaultController.class.getDeclaredMethod("getFormattedGetRecord", V1FieldRecords.class); + Method method = VaultController.class.getDeclaredMethod("getFormattedGetRecord", GetFieldRecords.class); method.setAccessible(true); @SuppressWarnings("unchecked") HashMap result = (HashMap) method.invoke(null, record); @@ -292,9 +291,9 @@ public void testGetFormattedQueryRecordNormalisesSkyflowId() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "xyz-456"); fields.put("email", "test@example.com"); - V1FieldRecords record = V1FieldRecords.builder().fields(fields).build(); + FieldRecords record = FieldRecords.builder().fields(fields).build(); - Method method = VaultController.class.getDeclaredMethod("getFormattedQueryRecord", V1FieldRecords.class); + Method method = VaultController.class.getDeclaredMethod("getFormattedQueryRecord", FieldRecords.class); method.setAccessible(true); @SuppressWarnings("unchecked") HashMap result = (HashMap) method.invoke(null, record); @@ -309,9 +308,9 @@ public void testGetFormattedGetRecordNormalisesSkyflowIdInTokensBranch() throws Map tokens = new HashMap<>(); tokens.put("skyflow_id", "tok-789"); tokens.put("card_number", "tok-card-abc"); - V1FieldRecords record = V1FieldRecords.builder().tokens(tokens).build(); + GetFieldRecords record = GetFieldRecords.builder().tokens(tokens).build(); - Method method = VaultController.class.getDeclaredMethod("getFormattedGetRecord", V1FieldRecords.class); + Method method = VaultController.class.getDeclaredMethod("getFormattedGetRecord", GetFieldRecords.class); method.setAccessible(true); @SuppressWarnings("unchecked") HashMap result = (HashMap) method.invoke(null, record); @@ -443,11 +442,11 @@ public void testInsert_bulkSuccess() throws Exception { RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - V1RecordMetaProperties meta = V1RecordMetaProperties.builder().skyflowId("id-123").build(); - V1InsertRecordResponse insertResp = V1InsertRecordResponse.builder() + RecordMetaProperties meta = RecordMetaProperties.builder().skyflowId("id-123").build(); + InsertRecordResponse insertResp = InsertRecordResponse.builder() .records(Collections.singletonList(meta)) .build(); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())).thenReturn(insertResp); + when(mockRecords.insertRecords(anyString(), anyString(), any())).thenReturn(insertResp); VaultController controller = createControllerWithMock(mockApi); @@ -470,7 +469,7 @@ public void testInsert_bulkApiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())) + when(mockRecords.insertRecords(anyString(), anyString(), any())) .thenThrow(new ApiClientApiException("insert failed", 400, "bad request body")); VaultController controller = createControllerWithMock(mockApi); @@ -496,7 +495,7 @@ public void testInsert_apiClientExceptionThrowsSkyflowException() throws Excepti ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())) + when(mockRecords.insertRecords(anyString(), anyString(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -525,10 +524,10 @@ public void testInsert_batchSuccess() throws Exception { when(mockApi.records()).thenReturn(mockRecords); when(mockRecords.withRawResponse()).thenReturn(mockRawRecords); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder().build(); + BatchOperationResponse batchBody = BatchOperationResponse.builder().build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -553,7 +552,7 @@ public void testInsert_batchApiErrorThrowsSkyflowException() throws Exception { RawRecordsClient mockRawRecords = Mockito.mock(RawRecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); when(mockRecords.withRawResponse()).thenReturn(mockRawRecords); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())) + when(mockRawRecords.batchOperation(anyString(), any(), any())) .thenThrow(new ApiClientApiException("batch failed", 500, "server error")); VaultController controller = createControllerWithMock(mockApi); @@ -586,15 +585,15 @@ public void testDetokenize_success() throws Exception { when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeRecordResponse detokRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse detokRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-123") .build(); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() .records(Collections.singletonList(detokRecord)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -617,7 +616,7 @@ public void testDetokenize_apiErrorThrowsSkyflowException() throws Exception { RawTokensClient mockRawTokens = Mockito.mock(RawTokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())) + when(mockRawTokens.detokenize(anyString(), any(), any())) .thenThrow(new ApiClientApiException("detokenize failed", 401, "unauthorized")); VaultController controller = createControllerWithMock(mockApi); @@ -643,7 +642,7 @@ public void testDetokenize_apiClientExceptionThrowsSkyflowException() throws Exc RawTokensClient mockRawTokens = Mockito.mock(RawTokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())) + when(mockRawTokens.detokenize(anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -673,11 +672,11 @@ public void testGet_success() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "id-get-001"); fields.put("card_number", "4111111111111111"); - V1FieldRecords fieldRecords = V1FieldRecords.builder().fields(fields).build(); - V1BulkGetRecordResponse getResp = V1BulkGetRecordResponse.builder() + GetFieldRecords fieldRecords = GetFieldRecords.builder().fields(fields).build(); + BulkGetRecordResponse getResp = BulkGetRecordResponse.builder() .records(Collections.singletonList(fieldRecords)) .build(); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())).thenReturn(getResp); + when(mockRecords.getRecords(anyString(), anyString(), any(), any())).thenReturn(getResp); VaultController controller = createControllerWithMock(mockApi); @@ -697,7 +696,7 @@ public void testGet_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())) + when(mockRecords.getRecords(anyString(), anyString(), any(), any())) .thenThrow(new ApiClientApiException("get failed", 404, "not found")); VaultController controller = createControllerWithMock(mockApi); @@ -719,7 +718,7 @@ public void testGet_apiClientExceptionThrowsSkyflowException() throws Exception ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())) + when(mockRecords.getRecords(anyString(), anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -744,8 +743,8 @@ public void testUpdate_success() throws Exception { RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - V1UpdateRecordResponse updateResp = V1UpdateRecordResponse.builder().skyflowId("id-upd-001").build(); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) + UpdateRecordResponse updateResp = UpdateRecordResponse.builder().skyflowId("id-upd-001").build(); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) .thenReturn(updateResp); VaultController controller = createControllerWithMock(mockApi); @@ -764,7 +763,7 @@ public void testUpdate_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) .thenThrow(new ApiClientApiException("update failed", 403, "forbidden")); VaultController controller = createControllerWithMock(mockApi); @@ -787,7 +786,7 @@ public void testUpdate_apiClientExceptionThrowsSkyflowException() throws Excepti ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -813,10 +812,10 @@ public void testDelete_success() throws Exception { RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - V1BulkDeleteRecordResponse deleteResp = V1BulkDeleteRecordResponse.builder() + BulkDeleteRecordResponse deleteResp = BulkDeleteRecordResponse.builder() .recordIdResponse(Collections.singletonList("id-del-001")) .build(); - when(mockRecords.recordServiceBulkDeleteRecord(anyString(), anyString(), any(), any())) + when(mockRecords.deleteRecords(anyString(), anyString(), any(), any())) .thenReturn(deleteResp); VaultController controller = createControllerWithMock(mockApi); @@ -837,7 +836,7 @@ public void testDelete_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkDeleteRecord(anyString(), anyString(), any(), any())) + when(mockRecords.deleteRecords(anyString(), anyString(), any(), any())) .thenThrow(new ApiClientApiException("delete failed", 400, "bad id")); VaultController controller = createControllerWithMock(mockApi); @@ -859,7 +858,7 @@ public void testDelete_apiClientExceptionThrowsSkyflowException() throws Excepti ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkDeleteRecord(anyString(), anyString(), any(), any())) + when(mockRecords.deleteRecords(anyString(), anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -886,11 +885,11 @@ public void testQuery_success() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "id-qry-001"); - V1FieldRecords fieldRecords = V1FieldRecords.builder().fields(fields).build(); - V1GetQueryResponse queryResp = V1GetQueryResponse.builder() + FieldRecords fieldRecords = FieldRecords.builder().fields(fields).build(); + GetQueryResponse queryResp = GetQueryResponse.builder() .records(Collections.singletonList(fieldRecords)) .build(); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())).thenReturn(queryResp); + when(mockQuery.executeQuery(anyString(), any(), any())).thenReturn(queryResp); VaultController controller = createControllerWithMock(mockApi); @@ -908,7 +907,7 @@ public void testQuery_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); QueryClient mockQuery = Mockito.mock(QueryClient.class); when(mockApi.query()).thenReturn(mockQuery); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())) + when(mockQuery.executeQuery(anyString(), any(), any())) .thenThrow(new ApiClientApiException("query failed", 400, "invalid sql")); VaultController controller = createControllerWithMock(mockApi); @@ -928,7 +927,7 @@ public void testQuery_apiClientExceptionThrowsSkyflowException() throws Exceptio ApiClient mockApi = Mockito.mock(ApiClient.class); QueryClient mockQuery = Mockito.mock(QueryClient.class); when(mockApi.query()).thenReturn(mockQuery); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())) + when(mockQuery.executeQuery(anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -973,12 +972,12 @@ public void testInsert_batchSuccessWithRecords() throws Exception { List> responses = new ArrayList<>(); responses.add(responseItem); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder() + BatchOperationResponse batchBody = BatchOperationResponse.builder() .responses(responses) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1009,14 +1008,14 @@ public void testInsert_bulkSuccessWithTokens() throws Exception { Map tokens = new HashMap<>(); tokens.put("card_number", "tok-card-456"); - V1RecordMetaProperties meta = V1RecordMetaProperties.builder() + RecordMetaProperties meta = RecordMetaProperties.builder() .skyflowId("id-with-tokens") .tokens(tokens) .build(); - V1InsertRecordResponse insertResp = V1InsertRecordResponse.builder() + InsertRecordResponse insertResp = InsertRecordResponse.builder() .records(Collections.singletonList(meta)) .build(); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())).thenReturn(insertResp); + when(mockRecords.insertRecords(anyString(), anyString(), any())).thenReturn(insertResp); VaultController controller = createControllerWithMock(mockApi); @@ -1044,11 +1043,11 @@ public void testUpdate_withTokensInResponse() throws Exception { Map tokens = new HashMap<>(); tokens.put("card_number", "tok-upd-card"); - V1UpdateRecordResponse updateResp = V1UpdateRecordResponse.builder() + UpdateRecordResponse updateResp = UpdateRecordResponse.builder() .skyflowId("id-upd-tok") .tokens(tokens) .build(); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) .thenReturn(updateResp); VaultController controller = createControllerWithMock(mockApi); @@ -1076,16 +1075,16 @@ public void testDetokenize_errorRecordPath() throws Exception { when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeRecordResponse errRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse errRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-bad") .error("token not found") .build(); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() .records(Collections.singletonList(errRecord)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1122,12 +1121,12 @@ public void testInsert_batchItemWithDeprecatedSkyflowId() throws Exception { Map responseItem = new HashMap<>(); responseItem.put("Body", bodyMap); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder() + BatchOperationResponse batchBody = BatchOperationResponse.builder() .responses(Collections.singletonList(responseItem)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1166,12 +1165,12 @@ public void testInsert_batchMixedResult() throws Exception { Map errorItem = new HashMap<>(); errorItem.put("Body", errorBody); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder() + BatchOperationResponse batchBody = BatchOperationResponse.builder() .responses(Arrays.asList(successItem, errorItem)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1208,12 +1207,12 @@ public void testInsert_batchAllErrors() throws Exception { Map errorItem = new HashMap<>(); errorItem.put("Body", errorBody); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder() + BatchOperationResponse batchBody = BatchOperationResponse.builder() .responses(Collections.singletonList(errorItem)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1241,12 +1240,12 @@ public void testDetokenize_emptyRecordsList() throws Exception { when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() - .records(Collections.emptyList()) + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() + .records(Collections.emptyList()) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1272,11 +1271,11 @@ public void testGet_successWithRedactionType() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "id-redact-001"); - V1FieldRecords fieldRecords = V1FieldRecords.builder().fields(fields).build(); - V1BulkGetRecordResponse getResp = V1BulkGetRecordResponse.builder() + GetFieldRecords fieldRecords = GetFieldRecords.builder().fields(fields).build(); + BulkGetRecordResponse getResp = BulkGetRecordResponse.builder() .records(Collections.singletonList(fieldRecords)) .build(); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())).thenReturn(getResp); + when(mockRecords.getRecords(anyString(), anyString(), any(), any())).thenReturn(getResp); VaultController controller = createControllerWithMock(mockApi); @@ -1304,19 +1303,19 @@ public void testDetokenize_mixedSuccessAndError() throws Exception { when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeRecordResponse goodRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse goodRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-good") .build(); - V1DetokenizeRecordResponse badRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse badRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-bad") .error("token not found") .build(); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() .records(Arrays.asList(goodRecord, badRecord)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1343,11 +1342,11 @@ public void testTokenize_success() throws Exception { TokensClient mockTokens = Mockito.mock(TokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); - V1TokenizeRecordResponse tokenRecord = V1TokenizeRecordResponse.builder().token("tok-abc").build(); - V1TokenizeResponse tokenResp = V1TokenizeResponse.builder() + TokenizeRecordResponse tokenRecord = TokenizeRecordResponse.builder().token("tok-abc").build(); + com.skyflow.generated.rest.types.TokenizeResponse tokenResp = com.skyflow.generated.rest.types.TokenizeResponse.builder() .records(Collections.singletonList(tokenRecord)) .build(); - when(mockTokens.recordServiceTokenize(anyString(), any(), any())).thenReturn(tokenResp); + when(mockTokens.tokenize(anyString(), any(), any())).thenReturn(tokenResp); VaultController controller = createControllerWithMock(mockApi); @@ -1368,7 +1367,7 @@ public void testTokenize_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); TokensClient mockTokens = Mockito.mock(TokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); - when(mockTokens.recordServiceTokenize(anyString(), any(), any())) + when(mockTokens.tokenize(anyString(), any(), any())) .thenThrow(new ApiClientApiException("tokenize failed", 422, "unprocessable")); VaultController controller = createControllerWithMock(mockApi); @@ -1391,7 +1390,7 @@ public void testTokenize_apiClientExceptionThrowsSkyflowException() throws Excep ApiClient mockApi = Mockito.mock(ApiClient.class); TokensClient mockTokens = Mockito.mock(TokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); - when(mockTokens.recordServiceTokenize(anyString(), any(), any())) + when(mockTokens.tokenize(anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -1418,11 +1417,11 @@ public void testUploadFile_withFilePath() throws Exception { java.nio.file.Files.write(tmpFile.toPath(), "data".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - UploadFileV2Response uploadResp = UploadFileV2Response.builder() + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + UploadFileResponseV2 uploadResp = UploadFileResponseV2.builder() .skyflowId(java.util.Optional.of("sky-id-path")).build(); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); VaultController controller = createControllerWithMock(mockApi); FileUploadRequest request = FileUploadRequest.builder() @@ -1441,11 +1440,11 @@ public void testUploadFile_withBase64() throws Exception { String b64 = java.util.Base64.getEncoder().encodeToString("file content".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - UploadFileV2Response uploadResp = UploadFileV2Response.builder() + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + UploadFileResponseV2 uploadResp = UploadFileResponseV2.builder() .skyflowId(java.util.Optional.of("sky-id-b64")).build(); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); VaultController controller = createControllerWithMock(mockApi); FileUploadRequest request = FileUploadRequest.builder() @@ -1467,11 +1466,11 @@ public void testUploadFile_withFileObject() throws Exception { java.nio.file.Files.write(tmpFile.toPath(), "data".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - UploadFileV2Response uploadResp = UploadFileV2Response.builder() + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + UploadFileResponseV2 uploadResp = UploadFileResponseV2.builder() .skyflowId(java.util.Optional.of("sky-id-obj")).build(); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); VaultController controller = createControllerWithMock(mockApi); FileUploadRequest request = FileUploadRequest.builder() @@ -1492,9 +1491,9 @@ public void testUploadFile_apiError() throws Exception { java.nio.file.Files.write(tmpFile.toPath(), "data".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())) + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())) .thenThrow(new ApiClientApiException("upload failed", 403, "forbidden")); VaultController controller = createControllerWithMock(mockApi); @@ -1519,9 +1518,9 @@ public void testUploadFile_apiClientExceptionThrowsSkyflowException() throws Exc java.nio.file.Files.write(tmpFile.toPath(), "data".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())) + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -1608,11 +1607,11 @@ public void testDetokenize_missingRequestIdHeaderDoesNotThrowAndRequestIdIsNull( when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeRecordResponse errRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse errRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-bad") .error("token not found") .build(); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() .records(Collections.singletonList(errRecord)) .build(); // Deliberately no REQUEST_ID_HEADER_KEY header set (unlike buildOkHttpResponse()) @@ -1622,8 +1621,8 @@ public void testDetokenize_missingRequestIdHeaderDoesNotThrowAndRequestIdIsNull( .code(200) .message("OK") .build(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1688,8 +1687,8 @@ public void testGet_recordsOptionalAbsentReturnsEmptyData() throws Exception { RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - V1BulkGetRecordResponse getResp = V1BulkGetRecordResponse.builder().build(); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())).thenReturn(getResp); + BulkGetRecordResponse getResp = BulkGetRecordResponse.builder().build(); + when(mockRecords.getRecords(anyString(), anyString(), any(), any())).thenReturn(getResp); VaultController controller = createControllerWithMock(mockApi); diff --git a/skyvault/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java b/skyvault/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java index 3d76215a..07e1107e 100644 --- a/skyvault/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java @@ -5,7 +5,6 @@ import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.generated.rest.types.DetokenizeRecordResponseValueType; -import com.skyflow.generated.rest.types.V1DetokenizeRecordResponse; import com.skyflow.utils.Constants; import com.skyflow.utils.Utils; import com.skyflow.utils.validations.Validations; @@ -201,7 +200,7 @@ public void testDetokenizeDataNullRedactionTypeDefaultsToDefault() { @Test public void testDetokenizeRecordResponseNullValue() { - V1DetokenizeRecordResponse record = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse record = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-null-val") .build(); DetokenizeRecordResponse response = new DetokenizeRecordResponse(record); @@ -210,12 +209,28 @@ public void testDetokenizeRecordResponseNullValue() { Assert.assertNull(response.getRequestId()); } + @Test + public void testLegacyGeneratedRecordConstructorStillWorks() { + com.skyflow.generated.rest.types.V1DetokenizeRecordResponse legacy = + com.skyflow.generated.rest.types.V1DetokenizeRecordResponse.builder() + .token("tok-legacy") + .value("legacy-value") + .valueType(DetokenizeRecordResponseValueType.STRING) + .build(); + DetokenizeRecordResponse response = new DetokenizeRecordResponse(legacy, "req-legacy"); + Assert.assertEquals("tok-legacy", response.getToken()); + Assert.assertEquals("legacy-value", response.getValue()); + Assert.assertEquals("STRING", response.getType()); + Assert.assertEquals("req-legacy", response.getRequestId()); + Assert.assertNull(new DetokenizeRecordResponse(legacy).getRequestId()); + } + @Test public void testDetokenizeRecordResponseNoneValueTypeBecomesNull() { - V1DetokenizeRecordResponse record = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse record = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-none-type") .value("some-value") - .valueType(DetokenizeRecordResponseValueType.NONE) + .valueType(DetokenizeRecordResponseValueType.valueOf("NONE")) .build(); DetokenizeRecordResponse response = new DetokenizeRecordResponse(record); Assert.assertNull("NONE valueType should be normalised to null", response.getType()); @@ -255,14 +270,14 @@ public void testDetokenizeRequestBuilderDownloadUrlNull() { @Test public void testDetokenizeResponse() { try { - V1DetokenizeRecordResponse record1 = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse record1 = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("1234-5678-9012-3456") .value("4111111111111111") .valueType(DetokenizeRecordResponseValueType.STRING) .build(); DetokenizeRecordResponse field = new DetokenizeRecordResponse(record1); - V1DetokenizeRecordResponse record2 = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse record2 = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("3456-7890-1234-5678") .value("") .error("Invalid token") From 41fd3076ca53b81b8137502f72814011b1467f1f Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 12:20:27 +0000 Subject: [PATCH 13/13] [AUTOMATED] Private Release 1.2.0-dev-225f34ec --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index e71d8077..43a57f15 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.ee51b1dc + 1.2.0-dev.225f34ec jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language

*WybTQTqhPh#gBe^hZ;ppHhl9 zWHASS_x&<#`>oB^`?I?NTl{y&J$T*WZ311>VTs+G*vO7~wHfD@zG#e$N*?262K2?r z$fP030aHZJ_8*4$H&aUUlznsAC6F5?$$U7P`#l?wm#N9Z;(hH|eRKlZ1MSOz`0G^L z%~MzdDHJB%v%Y*YGc@Oi;qD=BpWG3R4W2LX<~qe*=L1=mQh@BBw>{XT=@qYKGMWIN~(rINk2sK zMs`f%LHQl7v~!MhO1KU1m%@lSL)&=_e1_H2oxw;mve0Heuxx5ToaLk(pxB~z&+}HGob1y0n4~p(RNMSHrg)lcG=&bQ(cK zoO)q(u7%=t=+>3$~GF+$N@ZpMEpu_%UK7chZrwzLgU=7Ynpde>>yXxL7 z^hwsBxnBwFHTDCpx>VhqVTwRCLTtk_l=*FUI62?u{liJ7GNU19-iQ5>SHE(nuVT+s z)uPf3Pg!XEKfZg<(sXoNRN>tISk7^o`;DE<4@tSLO3M8MJqf!?)`vZ5Bq`b3ke{Nx zDA{P};Rf7|Jk_C#QGP0pc@Nz3x&r)&lE0yiZaaqK!d$|!m?Ds@IiJT1JTfxHk_D}c01Jx1U5BA|h)q4U$(gfCDS;&8-(fyTw zd<+Rp%xF*os>wp|wo32sv`GE^Y^=kbh`8x!8{w%>d)Bb=^Xl=dLHo6QHlhO9M`)8VaqqvKK=O}*{ zMl8}v%&$P(xmh)dkXMd%TxBC;4jj=@?jR9B;9z)SKK!ySe}p+-Bv4D%31sTJxHuBJ zT{$>UyLg>zcdMtULzxw~`~_E{>0qA3a}={}aZ|rF{JNoyMQv>X)~mMos5{OT$!CR! zel9uhT%&(F3Hl(_g7gWQu-z(@c0b; zBPIVYZ?FHhY-%8GWoKmbH`kr_kdi;`olIJEJxP%84|i^0dpG8%L&Fdx9pfLGx=~h9 z*VwpR-Un>&U~&Y6k=}D6(H*xyJg^CKPR<}h9P>&`;v?uQ_}{K00j#MF_lqM@S%42$ z_=E{Yk)JrFy>l)Qjbl2I&?r-KgI$FO>T5(&OG1vB4nQRaHq47puPAm2C=sHdbdHvA zM#-)b)%~8D*^9WFxZdFn} z;ZozjXZvy##ke~429+vgXTUHs2_d~1{);MsS%GCgUG6yrAW&3fu}YieUx&Vt1XvZT zpM~a2Bc4zR1NL{+D2^(MK;*Jd1k_ta{sX6c3%WG0zXS1}b5LpeKvA96#-c0M;eUd! zn$htvsW04?_|w4IZGBv4g7^#9AP_WgN@^jPat~9JIan_#qDYC8WbkN&@ zs7kH6h41Sx<$d(``^haA>)U&KhySO&`$x>rziaRQP~iU>^J5K~Le}iCJt{toAPcG$ z_!V}iHlqY*sD9nFHR3;Ve#)nVbT~V6JN-50@(_o*03RkjLKMm9P@9xqKWE`Isc`Es zxNfN?oQXg*(WBkb(1usR?RL6omSqb?3NvD!Z&d4bzC9^3L#|te=0eQu+|H1)HQ9`}eN*|LUUtg38Xdo;1)G z3Ep%yvE6VmsB`N$aA}n^yD>IVa(8HZh&2;qiEGk~+`q<{C5=tc#%n6B0ua^+v~yG2zZ^>zI435sWOG)2s;Erlr(p{x-nnEm3f9gbz{-$o5Aj607*M-k$i9 zXAu!dueiL%f}RhilVePw4g>x`41UMB9v|MQEygcEk)1y4Ox^a8S`knbeBD|K&!_guf{n;Ob=sk41{3Q*7t7z`h0%~HP(Nl%%ni|aqgH&OsD z%G4B?G@tcP5eS7UIuiJNljxy;28l&rZ2peuH69kf~ zhsw29SY7<`$~Se1#v!1&))=x7<{DFx7|yzI2}h3HZuSQ{xd##Y&5O~JvoXWV9xcQ8 z4IZEn4f2!lMd(9(RJ+YF$o2(6K*Rar0N|X-nKDB0V4^i6=Z9!~uyV72rg|vr% z^Yf*U@z5J4{l&UZCtughcmd|Gyrb` zlXHXkV0W%^vSAe&^n5mE>EeU72Qj~@?u!}Oqq>ucpfrjjg*;&lDM;!QEB$&F`dYZb?esdvEQ28x`L1xdEVeee)*vFp%3WF$2;~3FaYd}^v3CBkWfHui6w61nN7{*LYpsKcuaV$p+zaK zk~13+KAY2E@Rxn0tV?lGWuyzuBwp#r8AsKg=jKl!%Mm8um|Amf%2_U2ftwqCa#+j9 z_-y6bby?6r6k5nzQvYD-5mO4-|mDDykGz%x7DR~Z!7L~ba^ zw5DZ(xLmO|nB=e4B+jc6E_0gqzt*I|qjv=!i5}>SJAXdWnxAnYaWEc%ebOaO?u(g8 zO8B%_Ij!u{R7~rcJo2GpbO{X*toGZ<^(P7rySa)naavmwWaNR}=KbmkD)R%x$LdAi z#-p~eyMcnDi`%ofV7bp+hgWGsEuhmTS%l*3ZiCxG)Ihf$d}vvQbY-IMw6BLF*6Ds? zcW;98@xS{;JfqacYz`Hm0B%ym?m+E!CH#3qbYIjt=ODn3Pm+~48#N}+BMaral4;1LZ4a;{T zPU=q6+#F*yQR-#}2RBbZO543)Qk%9c%|l4!BT0d#pJ7hbR$+H#L36YJDyZ#!ZQS$7 zc@7vxF-Uh8cvU~m$^1|I-dfv!ZD^m!-x%1WJZCvX)VWzCzo$umYvpocP4|h~Q|Bt6 zt?%Tlh905h=84@pi(Yn5fcgfTmT$f3PTl|f+T1S~IXm`!n4T&Iu)sGbsYB=*bH|5E zs!bf_ic&!n^$VqfCkg>YZp1`Iv}`1gIv3*S67ICHrzokmE#Wze+_=dTf^eB=dgs#! zOZP6cB4dbrZfnRB+LXfwJV)fHZDj3fxkkS54lZFd)a=oBJwp zdMZsOiTO^4{e}Q$+=i{}iFGJq{*uw3V^nbl{x4-%zwp8&USQc7A9Kaqi<3rkzs!fN zh>tJ&D6MuB0|e>9e%E6CB4yW$uL>01U)s^FXP)_uSqi$S{pKG^TO3vYii6QqeF_`j zy$Y?W-=}L_o>USrc&#FBBG?CMo#LJcrXuNqckNo6-OX7Lo-mp!LigHqWlQAR=sn+} zt)6iy>FP00A$6H^M$3*ut1DOORB2VvmA2##k;JWm3{Z1NgR0yj9pX_!;GFh_IOG=p zuKkfZ&Lph(S1j&!GO=|)zI-hsT7#4_)H2j}>sVE&CqyM3iiVWQ^x}~Gg)1$Tc?Rk# zYWL{iZu?;u`&<}%lot-Q1ox?L?$k}45`HfN0}Jdddr&UjL^}xDy!Iz$5Gn=*7Pc<3!STyzLowEH(dD~~?X;((n&bR9%<4AXCr-=lc23vm(NM&6cN zr{_MpA9vmmhUsgFd{Om7Dhqg^Z{RF`A!r~{NgJYnevQ7ffB(WIyr&Lx0& zu-5$&B!h6uq@mC-{$VYd2Of71=P!>C-6R}jvM~J_bO{%3Q-Im!yzr4|wanI;*q=hC zE$7j3KvRu+mn`SC5f$lHQ=b{Ubml2ZHQ8|mn-KKr^{-8QIw;bhGQPjE^VKO6lgml9RCc?Hy7QA^QqIKo%@=fd2 zjuo%aSZ82NdR^_pLK(4xTO;)4WmxXxw?K!1a-tFFX0z1h(t^Ictx}lto``E=Wdl4Z z{f>Unz(LEBrBlCVvr^R&)nGvwVs0<0Dbal$9@P+8dsN zy_ZaL52Ncn4BY6CHC2`aICYZZ5(LseO#YMjtWco=6_Nkps*AP)UOZQ>Rbw~~{T=UC zLRc+GRi24l9vYt2+B|#5nvUxelG;3pPU6yy#qsjw&E@7Js9~g$f5=r#TgOeCiq%?F z>5@|(7*?qfk#@64T%CrQZ6E@GNc8?B;nd%@_{VG;d?$}5i_8?6sgCd5sHINHzSj>= z1!8#hMb>i$BbQk|TfM+T&NRHk&pN(NOUGfGeFnW`ghb>vRU4`VQV0x+^}G_+#=?dnBXjs)s31|@ppDhLFh~ASTaF$d`ctHO z1|y_ZN@}onp8;>z={|=Ze5piTcU@rJWSXvq!Jp1P))cwb5licPlc32ek3(jfN~e)X z6->rsT|rBX=ocQ*+GkvYprt}BLqaZ~2}URh5P^40qj}OAWHLZYUYGY|Bko>%T33OxMsrZ4u4DzhTnAJRNU=w?kLMh~)HW7s~*a%jBxXs{&H2sYY$Gm=Ov_r*yPQqkQIJd0MVHz6U zLdIj+!Jy$~i)v|$sv!Q%_VL6Lb9c3L$G5{##!RF8s&0(wWkKUg?9?;~rtgy>;Mt20 z)JpYsAq#*$dE_uGrU{JcSVQ|NPgEyF_FP7IA>j?)NoWr?>|WcMnD?qay^Zv(D~j0^ z!={$9VXsr*$XZ5*Mm2gkIW>|7bW^^y`b|z%$~7yhu2Lp_w#er3JG4i#w9HhG$js0i z0TPWav;BG>K86j1Z`!OZ`ISSiEE2qcpSc9_K^!22W*{ES9cD^}5fq6zh{YNlIvvEB zemln#)7lVm5^*fYK*AjoSA9~aOY0^L>Q%T$(8Be!N?)`?H6*L)w||Cv&6YtePnJ8* zFDL3w-B1JS{wi(X@q-TiD|=1f+1F09A&lmTd&uOK%kB>Cmp`7uEfJ*o96&Xo68^)7 zm?>P4zv)Z=pKeESD;u-FsZ1Rze}y$)Pk;995^HLmiU4t3Oh5|sFQ#f%@GhcY=bR?j zIA(l=VR-(a@g;_<1@@$n*s?BpWRINHnUa;!USaaXT}`5q=vLu502asYH^DBUX%d|$ z26a-VuxxKar<{-*u)963-1|u!C3R?;cX6wL&EM>FQS%b@LmrRbd_pW#;jE#Y~YOy zGQqIcE8YYyKc<3i0HxWIuie^MYI75ie&Z^KZM70L`w5LgrHqQ1EgtH)vyu>3mB=0h znqRxNnd7wy5?A*2QkM7B_Am2)Z*>@WF3UxbGOgFA@5CsPC=N4y%zn-I`sqbymH~EY z`wpw_)y`ZKWlH3U!|%*l0}UBlOq-0ab+@=Cqb7mE5Y#I3lsZ|KsgQ;{0%rm5S<(>m zX9EwWCS#4hc}M6k_xCfiD0u?qedr7LGxYsi+AQIFQU2$lZ_@S^GBC6_=^vrRa*}>G zYMnXVPRIJq7>-+c%K4%~a+T06covRzH35ro;~>Ce1EkVn7iO#54+^LVLie*056YAL z;D`sOri8LM6ucRm+>QG6<@NO%?St;OGS6hPZm{K_yBFDLBOkvEgR7|4HCAbs%aNgB zR4-j#LF)_v2q}t(UI_+QWi2;w%JcG8@<>*(e~S~ARq|;b`isj&OnNRU7&?Xt6n+7o z8k`(Wn%OX8_LO|qXxSSLE3!rl&~ziB_h`NfQt;??jq@<=SJsKN(|k90zT*_aRpZzn z_3%V#**vL=<2|n(&BeX5>Dmrvq9bCdgAJ}Rk>LbOk7s?w-SZ;Z9^SFkvXfbsMX;|;*ASWj%Sb= zdgB;zK(cv2kWE^5+X%1}Xr&pR-?Ay2RwaaB52%f*1Xx9MR6qD`i@R3bEvxBS|(B<;@ zX7h$ycFYo4b6vln#KxD-RT@?L%l}z!KDfJ9wA*0SVMW86^^wB4aiWl-OrR z&5rnK8D1~$0-}1ifs-)mm*@thw_3T*g7~-MhN$H)Ln^;vK1cn|5cTHXHJEr%D0nWa z@EsiFPn((4dTRIWG+YgHfO!iuw5|o!a0>dfeJ;A`ergOnVssGyrnSW^qkuU5&&DoziN}$#8EqZk;=HPe3W(H%(ZL2N)>!S@HbCB;g$){@Tpi2(QKqXr`rL z_nuDlP%$OmRjzg~}KV$fT2O6-sMDjG4yl zG}z|>Yom%6_QyYS{8tr6nCvA57`_?TVj{RA!BZQ}exs4pAB$nanull46|gF;QM?Z+ zIZ4GgxuUv8aSqQ}*sNXD-&B_hT$C*C0qSSfl?bKN$;8i+wIgyLw+q=faMnAJr)x)6fT@RY_CbVYG6-n$uoG;^_Ln zF=6D|>qC)ZxCg_;?thT8grz9pB z{*0-~{)CW0Ns}Ym-|SrzyPe8+WXJ93lEt^v2OIx$u#BR-N86fCg0z$!a;_)DIJqFT7SFSncFHo9y~@XNam;nBGbY-NO~z$`X;S$Fu}c%rxrf5vJeiP% z?USw$8OUQ4?K$)vV%%@2NJTd&gbqlZB~5i0W*kzOkUj~E$1o+c9~&B_?-)yX0>IIX zMNosqEcaI^gLxRR4~-O|Pf*2c{RznUhEt&U-R>+ zrkgIYydW$2wc%h|U}oF$wR>y^0uUzsw@WYgKi>=BS``)O1tCd35DSRd_L?iEOp^*=1o;MI*VJ~rz!AJ2nVX~wCw8sm(lDS`2B2Ckqm-4P z_1K-TT8UZ57`Bk8l|@n*iT;s{C$kv;vCvTPlr6y{_-bz-RX+y!GlVd*y&YH? zw3n`EiL~EjWx^jS#WJ^E4nXA3y>f0UrPdpH_-cHst<-5=MVM&fTbpy^Q|OTBsY<~= zjf1G4(uT)rKQ*-r&nVaGt=lq)BY3+1ov+n1-azKbB00opf3BV65H@qyiB2l6oo?4C zW5w~u(A|$d_-8IehZX7eNR7s!f44hc4%bC$ycoZ+)y!j>E+>+BiC`-i6X!CGB5msz&VW|ew zT>qv^^ERd_tACJG)du*x&Q?d0@UOdC3%(^_E`HoFxpV$(Ip10GO*Xh|Wl^6Rf$Dfz z0oa4iMm`p}3XFK^F|3J#mFWsaE-;7ec8GQaSx@C(1qZQ5wDl*V`25lNt1-Ip$F-|lPpt1!#} zzQ@C~GN-Q4v8w{r_C6CTJUux+*2++~6~gJTUoW5M<5w$p5PPc~t((RtiVN|iU*m|5 zGx9=fbsCK11alI=vO6SB=0a-7C}+=<_kJA+97+cE`M?8E_g5TZKa4);xW+6P3SbK`WGYNoH4?u;zns9{WMv!pDs|=%zfrxU z!rnwpSG5qoN&S9=yUEHmsHW{Z5JAlff1UO{no&yYe+I?ETcGZ zqSRL@LGW3W>~k-I4UT%vzUJh!r3HvfHO3L?@}x5F2n$?R-(gG97My9R*-hA-Gfsgt zaq?g*8wb%25@%tJ9N(F&Ns~u2MFhijwO|C{wZmszdo(18nPxe@+ahLSLQ*Tyfq+zT zSw2fEd|q?_mkM|-VnTTW@xrclBgl^>@p99&YCqdSIU6{)Iu3lpbFN-H(PUc;;)cW; z9OTzq^h`?h!7jYnBj@}y>V4&TKSQ}4zSzm#NXIp;>~sJk*s345jfGIre2aWpkO&L& zv|7A?NEahz@s*6~*8XTGoj7p9g|E6nq1x$=f4>A!b&DH)VW4TbTvh#2plOCsQcr2; zZNB5QM#j9P@*jH>Q0bBp*wBj>2>1#Y^UHvh@fp|8H6M4){U4Kdon-G)wXe{k? zEKRG@VEhq>kvl=>lL49{J7{UR2!9wW?8MHgs&bfp^A=t8c5xu;?Nn>N5#?! zyrHb++owxckcv9L1*M0v(iTN{FJ>g|OW4+a^PU&*-(TS@I}qwSq3btr<|+@AKz+v` z>Ng;@1#ym=Zn6;`8p8tgEu5!@U~cQ-EWt7XXoxFY;m#Qdhf=+sqYy8=9aD7=E2hnR>H?hyA&N#g?ByQpCj2j9Tv{-e=eMb*Ubh0gxzjG@t?Knvnt$`z&!jmz{R-l`1}w9 zfSYi_n>Y>p84MRm#0ZDq#rpnp7R(_d1J@V4$Sipot#l%wL_;2h<}zSav;Cam@Vf1f zHns(x;izrH^+ui!XxRd{wyGh@(HU6=+3vXv=9Jdb<57RGxsE2Qq&+79GJZ z^qE3ThFI*BUyOuK?3za`O(pbh6&)aahA)s_bZ8-64Wzj?Idldmz%sZD#;Mk1siCf? zzQ<+ITenw#or@#;wRQLaF`u-XB>bw;A~IBUe7}P74B1uS{{bd32cv4X@QS#=eylQo z){FLw#POx4;7^((@Xb)ciOOfj_pbHgRn3tc7AQE-{H+`K5VL{|@;4>yPdkA1H&(&L z$<@Tg)yd2hxRLNrxB{G9DsZ1gxw8wAKN&6&xk*(w8z_6JSvyJSSlHN}md~!Uvq=Pc zfFq`_;wgMW;`s-nA(pgYXUftHxD1tTQ~M5X;rC z4XW_Cs4s!27@SM@7}h39r$CJbbN&lXrantx_I={A?hXjT@f(8kIu|j zG56(Y*X8y=L5oiOMaLbEx-QpWHP9Ai@!n~E$xd|Q%LG#=(DoLoPz29%9~ zO-jaLWGdT@JW|Qp@$PwOloHdgANE{6z>LJ#C#`Q=eZcjk8Q+Jx3qs#m4>9nJQSxW$ zQ&xZn*ATXNZeP!fw4fTAgOBpAV2*g$)}tbF&VXj@oG-qNf_ni&TqM=#Ou=M3fp1Il z{O~k42X<_#GaXc&tB`3U@_9EX2_ViJoB@1eT*lbzkTmS>!0lNKX6;MQllgxB4bNzD z{Fd3*)itfepeD`1RH}#3A|GbY|KJ!Lz=aF%EJvWttKQ4)1cQlV_uAkXd@>wT$#hG} zDdTruoMM>aM|mR$KXO>n+szc@A#Eg7qy*!JT22ni8ls~kM&FxEzlVPiK(c`-1P`ZK zs#=48Yd!T@2&nfHyq^O8PRGSY|E2f;_idYh)&l-h5&uWDUJo!o4nFv;cZW2(Icm#~ z%t&|#FN7RF{5xU9H>1Wjx`~PY3@zxY!JhX$Y&|ZIU&d*#wy%W-GgX(fAHVX3tK34{ z4=&QQ6TzJ#m6{GkM5dPoi=6d0MQmq>j)rnPPlpl#=3>jz^~ytcr7f&WBh?LfApR}T z?SBOI|K;}m0}H%{4g;ARz%30_`%)OE{A=JlEFcN_i~I@O<;|1ak;|`M?c1tsuU(rU1#}xr0JI)2lqpj&mv&djb%^5eO-W zOC?k}`;V7#xdI}uw94FTQ5p%G!m)P=>kF58Iyok(&S$HKR$%}TX2 z5X(H9QL$XSsh;K(h+9iqIDYQ@wJAC47Jp{eN|{LTU| zQ6VbfBiUFaRt}FPNNoSHF#{m2b?+JD7Ucj>vrc%?Tns~McHhgD#gSP=7KbdFT> z@e3&SsNDXMuA~us$_G67COFa`iqGr;I`G>7*|5{ACLF`0ZM&Y$9%P?QSa^7utB;3` zb~q3gP!q6x)u3IWV)1<8^RkIG2e&zJ#+niZiv5MNtMZpz9p3^J6lLI{pg~~{z4d^# zV)`?x`iu|p&!Z~9KhF>wRDQ^VGNbd0nSv`_6D*GkbGq$DCP+(Ck`zZ*GmZtpCq_0B zz!Pl&9teQ4xZvngBxNlVIr-9nui(VFt)Rf>28iws*QdxFUP;O|zOi5y&jT{${Gfu6 z&nydZ;2A9{Amq-^rW0P&&-Bf-&G2JwHQ5g$<=4`8f+-a;pPvmrmp3I zr~xcTEpY4jug5250T}L3{I3&4=v@e8fQ|#62F`1wtyW`uq~4<1>0Hks%y;^2Dyga( zkx=K)@m!H6yogqC=C)Pw4F!7c?)yuhsDcu8el)Bx7SP}Gf@r}Y^fB?>jDf-TF~Rr2 zBdu-2m}9@bmD?>yM`py_RC~KkK2AP%T|PI}J%zn>{8ssJzx(kY5jKGIG}bs2Z%6h- zCPs;!)EuqSym1M-akmHa!gB8M$o^aKb^7xWbfD|1Nvc2<&~;UZUkD7%?!Jvi5NbIS!6* zwJYcm?_?!cP`<1r5G^CiWv-d>{saU9X@{hiDCP&^jQ%0M49@|%)>?=RE))j5QF5a( z_s7EFdjwcSXG0sZ_8~a^{;iGS4R+G#GseT625?u^9%je_U_ zKGu9Rd`L1nCuN~{F>NVRav~Z!=TtJu(R3xIL6&oJRwaB(I*thvssT!L+0nJ`m4zW1 zxXeSYM1L&wcIuBFF200@Jwsd);cVM5er?Ha_AF)q-j3ko+X?Fqahe$DE&Al^-3nOM zu}U~)P7S38+ue*AdfPF!LCfIozJb@RP=utP$WhTmdvaiDk+AXz%!sAUpFH4t=D_u~ zGRvR5u%Bw0fgqfNmPRc9W_AZ17B;=6@)bGNIMf*SWdP3)r40jf#!+({j>Nu!j})SZ z>dFBCEZLTQduO7eZ5qhc*KI#5K?XQkb$huliQA`8^V7#Gdm4fp3=W-?THjz#^9eas zKbqBKB`^<@RDH%T?DwrLKawM;Bp)9x2&Va*;G5Ta9xv7tm)8_RmZUo}l<1V6xq==| zztl6Ywg4?g0UW%J(4|2wcmr@2HblFBwo)ns>h+b=7Hl(E21A5OhS!b!d{G@`8wkd= zf!TR*Cu_O3xG3z5=-gtLWP>O92hs5Kiw<+?iw~0dcq^JT++|uScBCiR?1yvx_14GF znddeR49EEvwV^qw{O2t3$!3%g`YTK+wzj`Y)vrK-A>q0^V84%PNDI(*4$6}_Gwihh za{0qlZMB3b?1_3=*c$ZgB{5SxhfCbn+SkMW2V>g62No+o+;p93w28c`8N- zmG>WRHp{X2I*#|0%D~Vu)?A6GQLCcLYQ{^>3!jEfZQWW%W~Uwf4mp$rWoEU`iwTx^ zu>F#LtnOjfx}1j`zfj;bCcY|_hVGaGScAm3q^U<&&z2c&ko7oeV;e*o=fj>!)GI9^C#hd_@UvxQmRnJcab6kw6Rl%SA+(Hg(zh z#f!Cbk6K%R!Fe(D1rp0Kjw*z2osTXGSKT$Bh(1esu*`!mZqo|XmG%kRLM^EPz?Blu zx|U_X`eXFmtPYN^zQtLC%`Q1n{UJ({N85GTeM6IN?1wo22O+l*+`t!0;Rf5r0Kqq2 z4eHmaJaBDO0YUwOSyK$ouL5^Bn`KK;Jg=VNX60M9TY_j%$RDd+pS^_}37XMBFQX?l zj$ko6y5cG;bMJx9stlf&)LsBAfS#||rNZod6i92^<>jDvv2FgfMe%tyVU~|~;zlM( zy#Gqh6#Ik7B8sL++p0_J__|%)x~*HYoc$4`n|^!nVujJYTFGvQ%cdMKxF!drOC0Wt zNa`0EzAxYOp9#IMpw0$}9HR#}C6q(UFfNCnmO>tgGk=hJ#i*C%-KkQg1B9poe6b$3 zU*QQ8k-o8bhzj73Y&H9Mumz~x7_kM^-E8YZ0{_Jm5QZfzNG0@O(fSrN^@4G~W4{#C zWrF7G6=k-Pc|ihbt=g#AynB7>@pF=?39>@c z=o8`_RKfRl^QFHjHjPiajE@}Zy5K={M zjlcArP}FEtQt26SLZw)wDLpE5P*tBP6!rW!t6u{Fut^ZP$n&%O6~tGZ70IcIlO*KX{!)?VMw z*OCxtRDmN!dx{9|2&;lYqY|F44n&Or_%H$3taL`WQ69BMx!)$e79dQ%FE>qR;(f*O`t_e4KlIGW7gg$JKV-h%p3=5Wo z9zVm0cwS+i@r9+a>% zct3f3>1F@d`}j%HuHw$u6 zI?%qL?)l?y))PVjqk~`xf-@u${oR85ukPaiq&1oHWoM9~MUlK+Tj7{~Q$E`t<(=Ktc5-s8Yq6Tp`spjnI z#%BgSBdN@g)00M0?LPUVxHj*mZNS&k#ACYKM++0($$K{K#Pfp2G+eK2UTsR>pKt_k zNY{}u!$K5auK6KKdTt??_RAz{17N=}KXGgoaC`6FOGta1)MVJk$i5HYd`B0x z?tMl)vA)@@)7-=z zlokG~$)huY38dx62nMvU5S#n;;o|i9V>f@rDwGsY`o;0qB_z?~Z^We11U z+w<3q9#$$2rP^i81+3>(g_(;o0OFeE0Jtg&Hq&efUeS+h{gU(oamMX0@An zGz6@qSlnK1C$@7KQi`h^g__g`&#+=TVdJ2}h9=A+@JQ~4%`@MA7&Lh*6Piib&3BTv zH{^juOH+Px0GjSO!VBvvo`tHo{%qI05llYa=~RXadZbOFaC`Cuj*V9&tPM991&+;E zR!;~BZUnIU|$*#!>)X`%KUt2 zgQ0oWAw;<+$XF@{?ybZ9ivH~EIbuMB#G<(wp#b1{*kUtg=17V` zdII2KxEaG%;u)f8q7CHbAM3k*LjsZAyrzM`QwrJJGi>Fv{gv2cipd{$=HAgIIdXMU zeGUG}ag7l)lixJl4)oV%C)Sk~$IK?w>&=vBD3;>Y9mi6Enhxe)2Q59724+CUT4jkl zR1S+{I`edE(~eF9do(g}^q8J?F%yEQRe&O~1~5fe#LfHBq>JPuVGiE_IHWR;NK!E9 z#Y0a?E@}?*mLm6Qe2aK#^Y1lL`%nk zGHG0o6cE03CmI3=X?;FJmMHTC2>LyA9H&fZw0p*`3tf<0>B)?VYrvh|%vl*b(ExC; z7{9b$rpxR{IZ3t%;qHWryk08gtN;=DaW^8vGw412?!2LZ^-l&Dj z75!DVMn3i+B{9&VE5tP13-W=XI|<pU{95{ zIAQvWd7}geVcyJ>)_psossj(uVv`7{zg6=thxh@`YWjz!ScMnqco(zre|tF~Qa7!7 zX(%#Zcb5PB{XqSU#67!Szet4{8oeJjc5L_qm>YY^I$3#6MU0YCtEd571XQ*CQN{_8tuOEPS9h(HJi*S7q-+JoIW#{q@Ll4i{~3cI zG`rWPQswUp;crVov(C_GPaVN z!pRwn9YNFYfbLcHvwIz;rC#a3K2>K2CPeJ7ZJa%mf;LF@j;TUM)eXYUPCvF#I8WLo zL8~l*%f`|(ua%k~Z-rFE=kIC25~?S=?Jgu1Izj}*9Ng?<-Z&0Uo^R9IP~@V-+~%p& z3|igUb0=}>Y}JhOfHSDnr9W=_FW>dh0=gQL$FG|TTWR2Yq^Ir>uNwTf;EcZT6oe^4 z8E5`7DpgC8gX6MH~qJK0=fQ}sV&2PQSZ;95s8+#b;ovhZDPQPZG0i@b-jNct6 z%tHsMcH|IKM6Bo#EGFf|0UR3-}+4@!lDdgACeZ04dW)p_}SLF{qv6!Yzr@ zQ)nA1Li}P*1cag8@?pDik@eC;YbeP7gA?bZ8ia2 zh*owOz^Y6pZO$SQvueWQH1LEx2&Kb}CvBFeqcD5(?^qP*Qs0lIa=@W;;85LXRQdb3 zvWn|>6h+z_=)LYsksv}$h(w4u>|UqQkgn>U6fN6y#bJQ6V-dXZn(FbDMu^ zEDyR7G2eL>(Y_Jkkw;s8AUY{;`kK$?AzxMh*U^gnlpb{EE?-mm#W}j&U3Y#%XI>RB zp09JA-z@itsXL#Fea~$y-+e0T9n{|MR09*nC8hZkyo_r32S(ZNch!f;AlRuv)rY{K zwG+JntXHJKfita+vNLm2w;1)Cce|F4@A>@qODO1KH^lRvC2>{18Yx_wB)VbsH{0zD zzSBm}g=c$p=PvSv9qk$k4~B=fbgx5zg+r2Ukjl$O-#g?lpt`iu6IMI6U0OqY>5C>u z`=@}0Fp$ay=!k{VB&{G!&?#b_GS3vvm5)chFghcolu+nWpAxo8S4MY6m~Rk&gJ+A( z3Fa0O>5M3?CV;(Jl<{_iGvrx#%`mdmU8v?kv^50%gnF*Ye72CUUlXsd>wpNT$ld+^ zi;nJ=eNoTU0atL#glS!w4jAE#tXHA?} zmR)}8wxbNWULlP8xbxzAE`;1ivK0*uZpd6Uk(_d?S5b!&u)DYab+aeqV&{jtjM+sE z4jy)k{b8_(E?6u2VSsJh8b3LJsyaVT%~I2o1*IxnMJ&longs_@)Y4XX{jL@uQV*Eq zRBW_?*mABg4fJ0x%SMH>FY)+6wVic}+l#ybI;`2;N5)QNp5hWSa4viosykDfg7Mi^ z0Uf?oP{#QD&{2VXO;5BD{K4+|rY)nACA7y22k*xokAZtRr-5yc$DDtUd~AJ1gT2Z|M3M@DJ+6iiYXr1eD)I|IKgyb1(V-y{Du2pEq>> zcXZgnzoEmd4A$!u!eGPX!H2wekl2G}E36sDLfY(ipj&SuBI(k%f1sfkMx+4?N*s&l zT4GXEKT$4+#Tp(r&GEH#>WdY{@DNM?0C0r25&!lV|2{`C&aL2XeoTDpGj2&{I4k24 zjLkRwSVn+Zh=HtXuQO3G@qK3~sw9wIFnsv*Qn zZ`jWj6q!%w^`|>zk<_T|=xGl3ZUbdwa^^;S6|&B}u`10N8!)6V`y-haSzJ3tiihT?uhicYTa!thZylfgrnOM|<`VSo@P z-1mODa!cLaHnhd~sM@iw?^&OOcZT1pzaOsvQ%wKNMb-{}HGQx`n0ch1>R}A2b$G{S z_5l? z|KE+||0n?dU%RLOU5uhSZZpq_(MjJZyd?{FpiLEfW5#wC9_xmPS5~TAq8Ye8fZis3 zzRl4?>*fuHRvSd9`w1S)>(f>bcI`em3NXu@(x~_xVYap5YCkgrphZNa%MFa--|7PI zK~$p>K>mC&O2@ugsUq||ftacnZgJQVKFDQll+T0Jf%zp}rH(Re$MEsX9v^zTYPl$S zYu1xi^`b!(Oub`Fgw}LzrFjpWU24xVl(*zYYTdl^B)a-X zB{<#qWHs$(y;YCw@Xe=lB-?TocN)p`LZ;j6FJMF(vd)G{>v7CR^Y2c-Tr@&!Y4p8# zjcA$0PcTnkwICoi&yQ4@5|uPve;3V>^;Y}VwW~6()>%N50Z59mbef_xXkaJ7ijkTZ zn?=<&eP$}56El{2^*l1FtBW)dh-*VEN9eBATpb;|w&WCNt;Q#!&!63Q_Jb|kK6Ibo z&sVM6(3;kbNX~P5mZFitntH3POWec@My#L~p|8!SQl9Ba&Ls(Q^G-|_&RC~ly=-jb z*j>u%RakYc0oZJOB)0WCxR6u3s}-wk+5FRTSD*barbfFRwdDn zc<0{;?h8w=zRE9qj(Ul8Ze6kh1e9;a%op|CM^l(|Ur_vlnj2^f>tPX+0^?lS3lE>Z zU~l93iD_fnB9Y)edqcnw_}{S`b`^N$AUaxZom^xms zXuWw+_5tZ{hzQgvm**qG*5bxVHc-iQBO{bB_aGy7NpWWG>-f>e}{uCl$CV zUE=5efYST4MFT@jE36?Mw8OlAuD)2b z%93YnuDxUuWHnmr{k_8_ip>OW{2&71KA_n8MHnF_KVc2#dPyaem7lrz)q^u(U_ZXA z+%nnbsIl-e-GyFl^tHH1y5_0a@VCmzDxx>}3~Nd5XH;Ccmb$pS6S|a>AaVfd`S-vA zZAVlggPd^W+8n_#xGaWqbw%KrZ@3A8QLO6yuLD^lob(pF9#~D~#vK&FMCWzmtaIQ?>E^{}8SDK$kK;H6Q94>KqhX|WVE`-Mx=bl$L&KYOb zUi-{gdj(NS878e|QeTMR=@dYuMU;#R*UypX!11u;wg%raf1Isw^i55DrRe}2-1Kn1 zyYB>4c_@_Z zRH!$ziWq4bq}IfZbBWy)CoyS3V#jU6GLKy4ntYyJkv$RrN;a8U_392tdGl(MtVF)} zdMQ#)7L0~)G*;kqrLCNgVd5i$=gbTxi#Nwsd@~Lo%w557HEo&gG~3Qv(m{~}9TDGc z7XP8ZI!+kg>du&)^9{_v|CY{^}50_Q!xXu;8;U@m-(1CEAFm> zug0!%US0w3&}H_#h`c9z()_l-t3z5_D4dH0ImUyZ3YiRK&Q8!J9-QA0I=SIvxyjHD3$taB z!~4MW6x?>Qa6?>KT&M@M0p>2_~`pO+8YT-R(7WK@r(>C!ZQ2@zQaBu1|v zdnmzXGMC}IZ_IdQMbN}es%8gish`CRGGYy{5libX5Lp0&9&FQSmMLs@PvqypOcUnE z7{{nzcOXbOBpkRUcBvcpSbhv-DBAT=4SizTO=n`-Z4Vj%@a=-Uu@;>hbmCaU_tL@Z-eB~FWPJu{Nzpnb;Mn4+o7 zq^-L#`x-{C8&0J1dB!rcEbv$bGnAw?rpCX2ShRL-m7z7&AmiySX!||6_ngA#N>Csh z(;Wa$Rp;g^+tCR7P%oqxfx@Ab`)xO0k8ea6QWx62Q~>!#uGfD=m`{>an7NM;Vyp6s zRE%@Df3}C@C+*CYPrAV@8mxkB%s5JN8Pu|tk|MZ@*~OyRwtP;BPtptJe9aENmut}< z-M{O>M@8`RFyyCCxoH2s9>BnWWJ@Wfr~kP&_}?Pif5$32{YS%+G^k+-V3a2*%XF;TP#kB|9a%By|*Cw=Ri3p(A{E zg0U5SVys_PruRxq=M~FnWr-tif>~3mO)a+vG5xC!0R~@MsaHyhS9wqLT_R<7ya-p4 z>-A*VU2#1Ez0CQm>=%~~54=Z3Ne~X9U1`3)^}DT=!xV_=wtkJO$>F3EO4|v)^4K(m zSyHT-^)wY#yJ3RSCa8#jH-=6baeACqMM4r@)o}m#r(dZVisyM0)UV_LiWvW`Uny=G z?X%N=sJTf0wk7@l)Js#2V-bh}ketVZ6hruwq{PH4U;PFus5=@m3|gYBvHR0nZnnXn zbCB`zO3^rB`iDUY_qkMR3>Ys60PC1x>h*`mrW&bjZIrQwk8y6koF~@z+R_ z$?xN)-Cx+?3b<*xHw&?0e$o~3J7nV}YvF`bZJP;|PB_L5U*W@dQ1So`u~O8HEJ1FW z3{;3P*B}mDZI`6W9W94(_`7pGAZbe2xNtM{jP$M;^E-Legn~Qk5=)#+GRDXT{{LZ` zrm3lhLI$<{MVh)6;;b=NHy(~_G(`1iK=z&I7;Vfq2yo!yUOWp*U5*ahg@1kIL-o0T zJmi8o=)U-z_lFJqAEqhMzN`}j>Rzh67Wyy&OKw};znG@HJ?is;jt|%%nET%^q|N5h z8w+UC-~Q2W*}8ouN~wj1!c8IZLq-QwsaUJxE2H?>ptTckj7h;KS`;y;^#|9>XFKWwZXjZPNPPJE>ha;W_^Lj$8bXb=mnzT8n=w_ zdJi_5IX^!d$9ukbUoa$|2kDL5SqwBv0}^*M985Nr+3xCXHD2D5ZMmBDizL3X|}A_$f<`l*t@UygjU-ZALMLy(Y{6;GeA zaaUu4e@Z0CP}fH@nk&P`qVTpBZr6v?w2n=yKoTpDFgBaGSt4YOQaXRChxH1ygyU0* z6Cvuq|JYG>()xm@U_oUJv3d4fZC;a3!wtRUF(Q~mMX5Xor+~2H3e*K$x~()yu1gE_ zJIj-RBOv41F?0$md5F-OR<8!@x^N12IuLS7TCq&p{kHovKf{$ys*jyvC#jW~V}9Fq zW8&8l@uQbS;x$r{rSjKKx&aZK;d{EoXpWfxrh-1fLv2IT<-tjqdpD+e+`+)N$J%z+{62rQ;_<*Lob0I$(~RUU8w_@y;l-%% zcn}~%UwE0gvDmu*nxp}mCOOMEjmJVfkG%vK^>H{>SdGu~mFeyM34BNcHo^M` z*5B40OnBHiTSj8}po)y1e)KjW{L1kk6K5Z&4!8|^MNsd%S#Ji z#3!SU;EeFmY~-cVIK@-~txX!b@l@fmX4Ybni!vG=BX>N0u5(^cT5uC~@cq7TaO>d= zJBLspPck6ex)UWt455N$??3iASDWT_L(g{B9jWSaP$Mo>U?>Y; zFsWLPP`3>^|?y%2831+);BGO;%$-gIGEf$9}%`vWtSyY~jK$j$@=Gd`4w5CqP6kA-i z;C5K)UKYa2l3>dKcS!9K@b^z_O*XVO1LD)CN`$}LY~LV|@KSOYA^!yk{iodUzw6eG z|6@I!vgi{)8S1{)RiH@~JML|Wm}Z~G;t>~|QfM9}qp0p+>G;-_9>OO;RPKa^-05+G zaEs_gbQ|#e-sbb!ZOAYXX@}Pt`rt8Ty|v-nvO^WPX}Jjzo;_fg%edxdHgxgL9b>Bk zG6i={?l46aHW^y`>LvLPc@=k>=rL-%WKJXVD%R^$W}zz&nUhLqi`J^^om-10jUna+=Su+WRT)?2EySJ~tU%(m?m$3GtQG z{P;^Ebp8A(ZVLZ@>IwMIfa?ERHv2a+V~pV6_(Bx$nah`A0#&WHm~;nP~6VtFILfff5pk1(#KUT=Dka+&IA%|7}4?dv_FUUUWmp+A#P$?k)k#z)>a7XqhU zA;{>mAY1>P(y>)I@NNKmyqNQpb1(hEfj)IeilP^iDm4oQt6u~wpmkgPKl*0>dZK3N&@~BVZ_a0|4%%||3_Ww|L_sBc!zj#5YS2F`az3HcUt^ zHqR)QeyLSni(D-{oGGp%HjnS>xrPN-X!7i0zAQv_#?PzIF%7E> zJyBWr0L-A3gq!kMoHLb%l>j19!GAuJR*Utk$j(lazE{f&$A~VBd`NCFIX9LyF9ncb zbnNJVPZp=jS(IDqk)SgZAE_xjr=u`rh?5UzhNWlA58SwA2QQ#YlJ_%4TQ{^|HfRhX zQ<`W-lGUOwfTJO!jUbPjDV#x9EeO-o!UmHl1vsI_r%*H7>=`E=*6&^8JnIUu$ zg&3^^(UXxxSgcv}O6~Vr@!)2fdD?#jr-+SL%`BS@ZHE|F?)54#EmN#>;t?F>aT`@0 z!0fU!YWjLzSy^FeqobX z2jan{)CTW)OpC`@CDlcVjUlK2^=SF>>nR4XxQ)&*413j_edLo+ z(eKV;9(W78!PVquVUy}l1D8p4$giVTWDR&Hc>$b^NA7RiV%=pAUywDXPlrC^LeEg> zA9)eR4c#cI<@Q01pgKQkiB5}de z*_;r|!iZs&St$wFY#wu=T{~uI_DG*f17A4F5QcWsn_?q{hDfe<1GnS$6Kgjm>Q}_Z zqddvXA}rcYlMBDVn%g74*f9*JypjcCt!S3xQy0exfq8J0>4QsRLmVZs{c=#FglMnK2CbEf}64sOuDj}}_*2u_Y8dHvSsZP>E7k16$ zhkA&5!_@a0$EG16JZN)}doYC<6rj;9hN}nLQB;h!^oPenE3k3lggMv=4&zS*K?QZs z3;7A@5TKMC#Cm^(zgR>8GQX#5{M#hiM!Cn3Q8xgi^&J5r#r{ZP67+wg=51}|WfxF)<1>wcqnM%O+%xVdZx7NL$ zsu840SIKUsgj-N7WzwZbHgBxI!I@WDzb#fG_o9qm9M5J}*X>JH)k^>31Xus_m-7oc z!ZbfuP^}dn#~-)+adQhBD}a;7>1=ftonLgg>Gdti$D&)K5 zYeek5W3a!tZxN-i(mdv5Cd>5XO^1YG#SZCeg~Nxq8-ZTvQdinbzX8n5EjPHb7N~x3 z21Bt}InUa`n069nP6Ph^g^o0odkq_BPd7ST0f;`HQp@_6Qa(dnanjiXQFaP`^LsavSz|ElS{IzXH{Kmk44K7W*_3$g(~@umSLogIm(>K}T6O z+xc-3lUi0g1~k}ft$=0VAQHWcLtRAXxszc46~1VjdZMOCn{r~KjJDGzH4YR+cp9Gd znEN?}3Nzivc~6sAK%7yi7XF&8nc)4MkgTbyDZo)`ThBBmu$Y#LmJC~fr zqgeDV1n1kY5sRiSgk8-lUdin$)TA2}I2RksfhhK4zxI)4XTTmi+TGwrVYhS%I%OZ0 zwl{7fes_YMgFSo8tg)plXM)on9rLX;+%j7DoHhGqT&*)7{l!oR8r$ZG0f z+G_ZMBy)Bp^^0Vw#r2b9sekG>$=a9HE|y>v$(<{PD=u#<@=!l{NlL)o^NGsj^_I{| z=tsy>OY3*YQcLMCiS|tmOMF|aO&r5&oeno3_$p0AMhIvT>?N-3)nE5>ncsm?-=lKL z1$W)WnLI1pq<`U#?y$#}$;Iyvyx~o-6=4Jm#afd_qifd6Hmf_o5sj!i1f8h*nbj4+ ziAGrOW6?Fs#F^D;hl@tg?V{2(i-wuiVH(XC{9!<)Tl6Y3s{@Xs6g?Cys$o6@F({D> zIpyav0j1_LP_vl`g`BX(oUlclGqagypeu8kfpeJ%sFcO`hJ`uuJZ7ueC}epxU|UkL z456@Ag+encG>Nns=(Oa+CyGM6urD~UeJQa6so)xIgy-+S3$pT0S%xIUTpA_0S98JB zsken)=40gV?ZxJkT;|PG=4F@ViHc8A#paa(F7tJjr8$iSKH=rE-1*hb1$>#@r=}pv z0jhHq;XUY{=~*f0rLCkEO@#Mh>!7ymg(Cua_GS4TVEBtW_bGPiOFn7&RP@VFm3f90 z`JCL-@#xZfm-(ZHe4oMS7v=J7ClTw~f_F04`35ELNmSri znJ`Hjb&614zG;Ki=(8^Ta!rCw=%QcL1KTQ;&PL@q>`1vZedrD{B^+2W#y*;?-1X87 z?QiHJJ@#Ii2v!(SXD4Z&H|9#{w5}sKgO^#4FPm)BrU%|i~hOI8Lc2vg)y%l zO)pY~Hjf((CsKtqPt7+eQiYiaEQu|(5X{=16P||>Bs8p{9HT7tKC2R0fG>~hj4Xu` ztTMd(Y7vo}+@Kt`N>9}>`xqX1f=B&Kr(_s!Q`jPL;d*@d4!$99Ih*-N)ePvCmEVim z4*}$NyiV<#0f^_`l2o+D8K;d_1rm&MQO5;r_W$571qO9R9MLYhCDTqqi6^G$h|25o z{brp$G6;ft8R$ekrZK{VdRedR5YR=Xp_^6(c3PGlURad30l*gqD+$VZE3wL@)QFYF zE8)shYSF+{?aneMiQbcUkO8n#U}1#>4Qg2~#WXO>StmJ2K&78dd#{VTO(fR2U8>Vd zl-fgK@L=9}+qwt8uAmq10CGA5>d8y0Ep`7eyriOMl4fSHNP!JuqadRn!rT8R8=L>h$(MzU3<42{H@%+QD!eG_oOVq2b{qLh4A=D9ck`DX z^7q?KOD@}0AFr-X@E*uU#Zuz^G~Lpt#&q?Md^iUT7R72X(Q1DN;U56`$;c#}<2DSw za!Y1TPPPVR-N0-1PU6esB<{!dMxGJMN_a_q>^#;bDUggZs67oxZ5ZhE-1*nc*Jd9U zdM|u)#ZGhc%j=MNNAv$N^JTGcT7YH)*MS_w!?5OAZ5l&4&!eeFbadQ7^tpT&bzs@3b3oVI) z;*zUDm1BsE)?1d_i1tuaD(Fp!Kb^RqEScFauMlE5N-6ON{_m_SLe0LC5-@8~O3LLf(Kg;Sih zJES*&A3x^vHh&R_8a z!`nqUvLDmYCWq#mufSjK-$~E+YWS~Ee6i$}!byI@>DBui{6wAhnDCRcx|P$NU&jkK z3pOchUc|3&Or7L6SwEdI$m8Rc>`r#^$s9AxO9Gif;5KivH>Q6}9``vt2{I$4*ldF?EZSN55 zl>_{LRDVlR&T8gt)j2<3h=NfCs!k6ieOF8>H$IyGQjnWwX_{g0$!Js4@)K`6b&+N` z0y0{8x(}>@0N@w3j?bG+-|@|NuXMu-x?0{aLq-`|stzULX$2jF_6H3s@Fla095Nu? z__s!6J6p-+N!_9X?O^>U8Ko;1T5JwiA#eGwC^J@AXlg>)-@}Lm3Xa;z?^x1Tcb7vkCV;atkDOE)&9d{AbLVn9}!dWfr|#%0_JNh}5@ZDdCV zl$>p-afKyR$3129?wYgt-2OJBVZkspi=!#^2){8ZkDlZt5Pq-wj0M~3@n2vpW8S4- z2eCalL26rF_2LGI0ePCAerBg<(Rw%gJF0oGNwgeH8DR0I9JOK~(s0Cxni`9KpYbK{ z;8YSH)d4`_NdbRKnFzs+i*l@rb7~9nk5ij-B8k(Y9WauMB0y3^Oni+~UQrtoI&zFm z5MqLKY0ru}VH_dR;cYB*GRsSx?bq^H%9zv1_JqVH2Xq z_*KAU9Lw>HVs-@&^1=D9ur}dP&n;qV&$jPePcCc2(ugrBGtvbP5 zpZKV!bz524d}ZN}AvLwlmX^!J5Eh~}dAxa`+``rdQ)a$cN0l7=9LeigB}vmgEPWg2 zx=TGbhvZ-9li{AFfqOpFOFvmonFpctg`m=dwE%K;)Zvw_Z!q}ub~vhxf%!aqT5p-_sgxLGXC!TlkZ~Du#*Nw zGJfMb$2+B6auVY7)ferWK^LiQxn984K*-t=gqt_^~-1>2~cV}fdGCmxZQldvWL zpXhk8G75OAIHUhiIzzuO%bD{n)5>;MLe|J1-0-w?;_zPm(6`61pxVM#YcKH9uR&z6 zxHD`EERZr)T=8riHqi!E}5a@IMo5Y3AD2hM1*pTQq~nIa~;^;K+sn+_D>< z<9)lyV@pH&&A}$;n(cm=ZoRyZaOMJno<8&F^O`P!RF${Xz$Mrd@5a+h1P=mbILjGY zWOxXhP1YKv7k zIWS_fFbp! zNXPrn6uvqRpzuJR)_OOU00cfek#}a6&Z)x1cFnt5N?U8gbDk2(k!Fw1cGxiVoLStT4eaC)quT_x?>;nN$|V1 zV27LJs#IEFFN;0>HxV3VA?&yX?hUMAuA>?73CqN`F68!QzuIWSXr|0s8Tx-k zz9H;_C5FO>J(3UrD4Gqcm;Ig%D5KFk?DAW2ECk*Dpg&{jGe%DDSz5_L#*H6^?jx<188! zlmW3a-=k(3=I)blFnyBX_O(Fv=q}JQ_j1pIWjDq8Udu&*8wv&Yh8W3gSNf!w!-~qU zNx-M(qM???JbMNk~uEx$CA#Zims0w9%*3!17o*QG|PEp6VU^CyFGcT}?iY25k=5KHP`ivVj(I znId+e6*dsS*XKSBT{0V_D1pilbt}RrV~kY-C#!&4v6UL)SUc`726H4&l=;oeG!Rnj zW+M`EDoldeK!sMWGDiEHMOO~;O8~7|6T@*HJ$yFFbP4E|cJ6|E?!soS z4eJ!zu_IsZ0{!&qi~t}NvZ^=6i{Q>KC4f&hmjM9!@7x}q6}0?ikL0@ZON4{rb$hD6~}58Gk=wA22u)vg@oNRBAe16zjI+Ig0v zdjc^0tc*o@9N}09Z;G@tao-DDZ0EnpA=Ykph%S?WEHfR1PJno{LMua>ecPLM)W?}^ zhxNS8vb%&>V<^$R`a7cG?h;`V>5N9G0Wfo(|B(MW# z=riYFOU9u~MuX;9@PL=~9FuOF(3Jaq09bUOJ0IvwaF@k%FHnnvYv=BDo2A1p-Fz)) z=-HbO7@?kt_0|h*>IXkek=cqY1OHBCukp(stJTg01t>$5iG?i#pQSO&0T>&0r;fN~ z){)prRRB|KLYA7c5TC|k7xV-|sK@65rDMCv%;3n(R4A$B$f+JE%z0jl>=Ri)KN(Y1zbSb9yOa&jXA_V21!xZ)(BO#*IvRJ025!cvn zNvD)MwhHf;X&V>($1g`KZkRRlg5a=N`qb~D9dR90e;yOjxbo=-e?(2;Bt?r#!k3mKC%!wH7Y zb~_5v#|hTw>IZjq%kQ@XcDJk3Z~|;1=R+0%+#dj->$~IHLe2Z@>D1@-h#W|{01f_A zj3+q;l(5vWTHbDqs0{3WrpamAg&C8+WE1W;LyD?UlaKk|D<ij!hJt#mpR1-WZj8&qg{cO%W2&e3YD?}BsX(@+_@88>LE=rB*&5{c&*(5YSg)}2VOow#*IaaNO*Y_Kyaccv6Pd#J|>(Ory zS61VUWSJ-&Rua4a!rH^uCf2L7PAZ3;B-XXwP>rsdWV+$PTSl=5oCZv^77VeJ-M(V1 z$3TxDiIb;^wl`GzNrDqmjx!mco%%pRGYY_IO~mV5Tq~$x_07X(Sy9Jq3qpo0AF!eL z@43Gk*>4TGa8q3=$xNZv!Lo-5Pg?-vHqRJ3>Q7!X%`m3d(2uVoTwp_Ox9UOjSb1^ zKJRy-AW5SAphn z1x2{I#Ft!ni?&*5^BW@z3K7n;8VKnkg&@D+!tz^z20%l-~xgC6GjwtRFVB8 zF&2J!dKYsyH)Kl{&i3v?V?psfCw9lhYSdir;`t^{gi|OhmA>)tsOR4HKd5 zl#1Zl`p0NeCV$&680rF~v%0(3#Hvm7wWOcIUpbXm35;F0 zSW+y&6e|D;Z~RJTbC`5y2bzrnlSLbWMSYPYw!;Uw7f0(IORbLB8L2(smK91N2B0|e zxn^mgNj=5UG}68Qm)SfRic^j-)DAbEs&&TYT+S=HAhj1_35%Q_l+Q0oOn1>Fk(%8$ z1|-080Ny(~ctmTUt6#VHxoG4-&CZlUy>-7eid)N>ZZV}AqYpCgIpki+@d*{4D^}!| zl&ov-llR?SZi>&w_3QO#i{Ivd%q`Z;hA72|3TNiXigF(Wj`7~|e#6ifELgL(O%mEP ztXMazHyl+GKec1qGc*C&#Wv}T62E=o8tps1Vn0NL>M{v$i=O}CRmNVoA zIj1~!2NsXY&IabB@iHtpegY>~14<@4j)!75VBDKwy))CUK=IP@D^Ju%skO5^kU5h2 z$!$5OT74Z{*O>XrhGhr8-wJt5APlgmLJYu#i7^4*hP>2=EMO5dg)2_4Y!m+{AzY3O9=moJptkWg#I-0ar5YZP0y#4a zqND^NGZ$JW_7^|=k<_4_zdOhI6Z0g~YZwWKs~g#}u-!wl-&{1ds(89%^w!^Ah{#jU0k~ZW{Y^{_yF%m?z!%)`4mI z^3cx*d24EYZDnHf9sigcTT-4xT;50~j*MEtGn|%M)FvSxCoaD>r4Pv-(dFHOlU!Jf zRy^iUwQp5!;GY15gg^83SA3GoyQgE5PtKpYbdj=<`3GXmI?(Q12xDppH?EjLX{FgaT0QajpxzvZyQ0w4jP6*ZgJHTi6$*KyE(;}wXqyFYz}mTQo$T&5Y;Pe$~8c8Dv} z6U}}HJ>ni`t#DH=p;&zF?O&`U^3>VdKU_Y)|EN%)us;0*7K@1gzlneUSFQK|b?n~r zfnq@GWr&YY&70TChm?k6vCBczD3R6>sTmslo_&w6N2t4^r~+#c9RRyifR^S?YsWYY z_7L74f81QnGyISOJ3{B+;ln9)Fol2&rknk+{}H~bnk+Xa1)iy7U#`T`G6qFNJ3^Nh7bModRXR?sgQna?!?Az~XEK3q_4whhK zL3qWCLJy&h(%#VkcGbFr2ei)p$dg3XCS?Qj%*)~=Dro2BkrmRQ#u18alp2PiY|&rE zAD*Jfbe59b(eyQc8h@El)m+9o-bjh0J-oufR_yXRG~eg?B89=B>TW8|1-ATWYN%sBsXGrcHXaC1N ze(PV=E6d}5aos@wv5)^R62pHh!%AWmB0tcOl6_YE7c<{uXdHLfM6V&p`6fkS?xD;* z?CdA#&nq>%GoyIFhb2aIX12h4k&&S~cNu~{N6$s5P{^x!DEos}@jNvD^{16jIR``5 z(yRTpY2p}6j7vH1dETq9KELHck<@1+7gaq@`p1>_Z#AMKWI>PjsY?QU&j(<~N#S_f z&L(?%)px-7tPziC@Zcg1E^k}2yW+zbO6i$&@g|ZFe-K{?O)hR0t2Iv|5kuzgUuCrc z9KLOEM^>np@H-waT7bV)r-@wZ=F+N+j`#eS$-2?cO*v< zbOd^L<;zhl%b9lN^K0u{`v6f?;p%|k_rn(7zHV;%%=8?+Obfu_WeMVvZ4w=~lvE;>lX+CEoX0KHugp^&3H zH~&mGNXV&KUhpcoxDzRy-e^x@lnYlAbh?P=b1!nBe}N3L0%2L@Xr(Pm>v5SRa4g)d zMPq)!#1hWLwiAi^l0~S*=PlrDF*o;d!GQSGJXF|3j)wGrvX{6gh$HM^kgD$oN-+i$e!#Q@!w2j{CsKJ6ex?~1eq$98UE8zlx&yzBL zWIVXzl85&A0CXuisy7>blOhr0vt4|Gt_)shub2h0b+5eX)SjU^efwxF zOS;_$?XD_T$GOGdecBJ<_x|@U`s%gMHpkw$n`l2{u0c2OTmTOk%TYqEQkj?SlAUiG zVnQOV<4E&w<~bUCFL+)F=t;q-^uS>M#sgK&`;2(4#y!ST#p44VFN{Yz;2?T?h_pbu zhnD2)r>>jt{Y?d`4eD;iqgaHN#Rz0XGob|g0s|tze)2Lbq(*6u2&4mu6m#OerxbQn z20V)lO;93$3CRVAU>AyXSQ0yWd~#@Q$r1s_H@GPrD_i~gSM^TAgLXJH$srQg?DsZ= zjmg$ySxWn|3D%ri>zWDak^Rrvqsb(349aXh%o6PxiGd)*ETy();|07@0K_AXcPzt_ z;g2){QUCaDqK;naeLL*K;~01W#~zjSkKSTQ9whB)w?8`Axwea8`UyUkI;h%!ekHTM zdEEqy)axA)uZVBzJ*k{iJdC1ml7#BBc>$-9qedlBcf2Z*p~UP~ z4(iriXGXi#A~Y$RKA08i zY4Bo|xFlzV*;%93i_c1n-f4lm!eA|~u|8LQC@#QWH_f^3^79fKO%S%6G~xsb_qSvt^4<{}xR1S(IRp2?Wzvs9!JbV-?p&%lKq!EKog?mr{= zwM>xTcng~%K$CYed80eKpYn@xwv9J#tRu)lCWgkk$iuwbZuYD5Upw)Z#b8O%Gs162 z@z%rScbOda6`jVojJ8st3Sm+7OlzcwkI9N*kvraXh3R9SONd$1sv3eS^BpFe{GcMr z-F>mJsfdTj5p%?q^AS^2KPYm1%03{>M=`t;)+s`e6IxCInTI_?<+q)*xuXZ{m$>^?>D^&DiaWU<)jO=|Ki$R5 zL2l?qg z`8P@#d;$D3HM=oYD}E}VQ%{z^q3HSB+eIkCQkecCnf@{Y{vph-_#Qhv!6$7iLEF2e zqi$_j|KlvpyF*|^g&@${OMuV%C#`D8SjX9qE4y}{9|j+AqMdaorPurHZ9WFE~o(T&iu8Rs?93O z6@`qaB4RCW{(&uvPgs%2U-LJ-b*|VkOM$auWwxP2_t%o^B5lrOm2v-Ll|On7Ke$y- zF3093W1$9n(u^8GNm#b)kuY0Bi_uQy~nBwbKOa-vwGnAf(N}}d%F>#TU%-`^g70Wz_5;j!Qkv%)=e=3*~Eo~QqQS`S^NGlOfy19Jms8lR5a)p32O`JnoYQkYkaS3(L zkbEmO-fSvX$~3*p!7fB%cVBUL6RF6$4Nb+eABSPd8YPsWm3u#KlGTUfR8ts0xw3!I+in_g0xiz>_vJ))s9KPh;g5ZLGy=`KM-dY-zR! zAUCmM!e@hS8P1a7ekRXG>m5kO#p%GDA<0&6M{&g0QFxTlo8W|t*a|mkt(&cqc>;7@ zv|a(#n4+EnPJeQ)yIRD|op>c6(yom%jUp(rU8}#C5yEp?tyC4ED->TcPeO|njN;+? z54ic>5@xvHRUy5oUWm1!{$7yQ(OD@g0-&-Vr{*#JvWj?h245e^!MUh)Irae*K^9E8C;z$Jeg5s{a7yMvvbQMN@@O$OWF zFP;oht!xgzaD129ZmG>@oNu!%77BH4>O;ASq~c9hbnOq5WrVL8EmKG6cnKn=>8*9d zV8P?|fhd}YP(cfWKNbdSGBn_WxnP}K3v|IML@;n)b3D)m#A;|JUyH4AtzQ&NTO~o7 zWaBHPS7i)Es0u1DzxUgrR8YYQi%U05M$&Suf{`;ez>0mB{6?#FfEmD~Ls`8 z_rSf_O@JAlXlk{V#f0?JvcO}v_%fd&)V|859L~jL+9mDKdmiJ`(B!zIY5y)( z8|jzcjJM{&MD5IOduYN%REdDkEE%aXt@bVxywcP%>xkohtd&|P0V%;q`^G*a_=`=~ zmWH{r29y z$&d;e+t+y&;a8%+5sZW|-ELwszTxr>XRpWu&ySvH^7x?EAV0_(5ys4_<6o039ju`g3nY8R-4uujss|DARVg=R-qZ=MfRv zP*5k>Nf?lb)_LmO&gl0n8Di^@QcgH`V~ve<^{x)&w@${_g=Cm$i*#ml$tKV#hKH?p z6{L|vhvKt1E@T#(4t%un5*}ef-+ZF$9~wBB{Jts+kH=-?c1Zt~B?f(O(Y9S;1LF{Q zmnRSIuFm!o>WBnW!8dlW*7WVg>1(8$+RyNyhVZnnhrxH|h zJkN}2T1RB!r(v3BTyHC~Z9IJza%hlLz^Jrivf$)+x1;2Wr5o~`{wR}K?MC0I^XjsO z87I9{oC2MR__HbeI}myLZ~2KEWEay}Jg1<9!pQa|x9RlMn)xkvpVBHO18V+UjV?xy zlpl>hs7X>d;I$!R1>UVxcKvOipurVB;J8@B-R0!x*JlMY(dt==n@0}~zQfy1?*f&* zg)FyF`R(QS?>ILt zocF3dw=OCQwPgWmH?qfJR}%8xmKn7emm~$FkXQLl`>3-*gKrhvyG9=HOcB2^_}(Lb z*PeM62V*L^zk`tR$9?M1G1CyPC^DaX9fB=DyKM*i4~|^tOod_Ly$bi7b0EwdWP8iv zi(k^BG!tg-`N13n7GfzbSsJ00 z(algz!QBVke=;`B3V1~Ag3PwVwg~KFIi=+4vnW6Sc+ix$T15T}U+O`zZSo@$)gMgx z9ri7?dwL;F&Pc^2aj9*1J@w=f>=Gvlheke`)z7JBO!p|A$N04IZ&VU2`;ZcKd!dCq z+C|0H5rESi26;UZ0&}52+BngpuKKu9$9N&;IJE6?wc}l<>>WOKU!Gr{f~kN0dIlUz z;CBrXID#^G_7EHfyTrFCR$+ZfYHwk0XnILNG|z0~->!q&$5D4N-_YL1QTGkIq2G6F zszZe*ZT=W*j;d8BkQgfn3?l8t-MBB!@M9|~p)Y=b3mo?O^J%qV4Tf!@_Do&v-1f5BR2@AlBMJc4=7nDGA`UT zH#N!=aPQ2vpoF!k#!TEEz+k+l%ZjmQHyYF;+agjamKKy|YQ=ga4=_AsAY2|jQEh3A zWMEeMKmYyrAY$2E;no56(Q3Gks=P!Qv`f7cpQ+A}2GvRt-=)+9)69N@@X zoKG5pEJ54#<67xD0@YXA*xN#Be!O$cSzDv?^6cc~^5o5JW~1c&?JRu<_eX0m zCMTiM3YNUKKbW}j=f`bJB73VWkw!S%&@cHeV{(!M!GYOD9{cGGNuiH4z0a4?{ZE>9 zwsiSO(@wgCnwjHxuIjd+cC}H9Mb^b~`_>bA{Gj~>a!ln93R^5Tp;@_=4RH)vtPZlS ztDOWK#f`VM*wHjFtbD^`g96BLJZARly3@*vZRc>;RVPS`0i({U;1r&LUsU^ z0>&0n3j9ik>)W7a?nVrmAKZSz+W3A}k?fABzh%+fSkG;Ax_V)dWZ+9-uhEfT+z9)n z0QfvG+Mz$>X(`-o0a{a|=Ddk~#L3~Y7Iw?HDWsq7XmXQ}eWayuJK-w;JPcT;-duzx z?Vy|u#2FXC?PKmH@Lq#}jCV0NJKmyzLRWs1IcIFaZz@24=U$BS?m3qusk05pr8<_n7Vm)EB@k#;<;~Q z*~@xBoBhR0=_BW4RYS9Fk`c3u1}fWB+k2E$vvn2_j;C0N&X!h$fEf5Y+%J6x>H?!| zG(>W-g@FutLI40D>uF3evSV!U%QT?C{O@jyoxa4Y=lDZPAvY1t2HRwH)LG2NI6;qB zmXtMA$s*j^h9$2FsW3ltH+sbY+La4Osi2K_>Z<{kkKZE`NTvO8r^P}dev88a9+Ph;M4y=j3iu-(>mV_Hf9(Xz7g z?!5fSr>6_!kr;G5Ivp!l>OQRBx80|dE`zM(*z~0@!#DW)@C#mS@tO#sagmkEY?ar% z(io`3b6tJx_KR_woPWal+?g<~RHD4KY32b$9b=6i?NfUA6xz{fh15Rq#Xv&ukS|PO zLetuzn{D9`g(Zndu8Mx5QdKvV?)FTv6na$>?K`r8~|mD*x&UPOPHc=^)L;t zgefnfe>^rE+MC^=yM&sa`*y7?27|<#gk}6eue?H)lNC?X-kNl~o2}w^4@!ob1JN#s zLL|TNEhBf9WyECfAZp7S$3LAAzAy8< zA#TwR3MdP&qsZ8J<;?wzg{yI9NZA{inp>gbuUJ0C)qKs^i}hTw5-59;Q?iE8Zu?#6 z(jUHt$>B@acb^f1(Vh$F^JpI2*=KH0=KA#h8^mwHjWBt(fwVEdkMe~O00QDQ> z#HBJ#YZbkmIb}E3a|mJpf873!67ID&!1}YrXYKKtTaJz&qL#rcI^(?vJsdh9l8QJS zqh%?7VYJMLkv)+YugP(RBibuE*;}sY9V`Qtdq!pkdB9e+pWjkfZ?dn8;olAce*za!Q|cc9$g`g)dgkWcePh?#k;m^_BkzS_t3tWrdQPV zvG;I~a0BX9>^B;{L(l-%8_L@-%kK6o``g6(58yjN)n3|HE>N2NA;{A0mCFLHFYGMyoPH!OX23s7>oau?aHx!{YEO*{;R0cY85hF5!Kg2;g8S@cD*ef&p7bk)v zye|wTCik#`8F{8JO!9d{1ZexEEfhVqTk#`p>w(+2hDyj6Sp9OInRV!?GIYwjiQi~h zYNfSNwo|yr+)%bDYBMok`~a#qcM`APxyQK$B~w!Db-EzJTFrrsEjIG4G<~7K_cB>A z@{Pug+7>z3kF*_-c1Nibkd{2K@Kk_sDfI+zpgEFp>i_)m@7y#aP+|G|N7}ajH*Gt_ z!sDm0g3y^kKeOSDurxA9-wm}yLs}s)rZttZ;s}R+VNiXh45rvcl8GiK=RP6lbnP@H zA)MX~*ry%yBnx`HD2LqJkq=^j>}=w{?1XJPyF8sd^_<*c+KOF%t*Tl$q0Dj3bX}GC zUVFKG<#*-te)ZVn{ZKi^VJP?@_et%*hTl$E{lIDrH2i6x;Y^P}PqFSp&#BkxowJ39 zfs}rE<0Z-gEo-a-{&HZPkI)rrnh$Tm{hXCE@Q}6a`IjI^p;HO9U9@u@FdIa+KTLwc zc`9;*AD32#JuuZfqO&~WHBu&9C-pez>2G>JHJ=(kdWDFP9o5;ea*TRB{bLB`(EXW1 z8f-)eV!%6C68z?Wq}{Z7EOu>V?6Ji6j62H$-z0FHy)Z3bqpg=a-|%%t5+Adp>b1fQ3LvK+U)59nQ+X4i^El8EcYUj#pQJWeF$gZX7z@wQ-5BWo4hUWrmak zYE1h*bka^DDTT=?KSYV*)1pF)x3+q98;~Bzp&|d%5oh}HGonQ-vwKVP@#mlrXg9gE zY8^clHIBB_nj*?-CulKmBekaGj_IH6LdTE1o6LJhHy!IOrBUXzT5S4Yq{--nS#WD0 z83AN&{MOEG=tJbr`4m~sbhNbkShaxxsM+NAmr2o($W?rLHYw$7oA4;Nwo#3~j$u|W zMyb~F&c?#tOfct&EcQPB2!k{29jl>4N~jH^QOXj215(a~hXZwY%;y|^_z~RN^qe7S zT}O;em3)annemp0&aUrQHW2=b3?k%g9%@Cz3hLN$CKsIqwh~dJlb4=d0*mq2ATQ>@ zQ(}VKIONmMaT8}9>LdhNwdY@>bxdz-i&ACMau?H~Fg zPdI(He5+5W+ehTTS(7Oap6pVNS8Hmn-C}i32-Rp$FXTBZXz?Eu=Fg}ahq~&7HQmyy zDM05etNp2eX@#Kf%70XrSw7Bj0jd>Aifq9b_?iZEXmK~bt3%J$TPe^MWzWK%hzamP zhRs^H#eM1Izj%eHnZH6r4^a&o5zrHT&ag93Dw=Ry?}*I?5J7PTqv0SOAermnWG@K9 z=2%os|8+1cr^iRuix%Q0;8-rXu&iEMC`1o&uzf=5ov>bgs(hFfqA$3e2R&%qIIQeB z>lN(DBI`P)>_p!W4jXtbRXlQ@y*ZAhn_+-0mz)4JQB^m7*vnS!IJ(f#IaSJRO7)>V z;yH)&zaUI0m#tS~N#H`;Vh#j8P$}JAl|}gs6>#+5(6X1Bumg#f2~IpY+{@b~z>2T& zmK$c88L$Funw{N*n=&CeAkm+{B2_||H|W!Uc0q5@VP33+tjGL0LK%2&UecABOnG#j zQeSjLx*Xi3znpVqxioF1M2X=$7K-JaT=nxb?oz4yr8l)S(s=V3`NQIg+H<`ypZxqc z>qGA3P$!!W1NGnR--2J;QYXRSK+G<^E1#SI|b$F59_zVv8I1 z=r$gATKEe`J5=7ncyEg6Td<4ovS_C%ak*#VqmE*$X%ChC{nWgE-TSocBMCLsj%+k3Nazg)22{qj3xk&8pT>V*WNjqND$`=7( zYEhjA9dnNheteTRP{Si%uJ!0bY3zIT?xSbu(K;0CRFb7DFFDXkrjX{haY_FB8dDw< zyg~U>+twN1&sa+Z{dYAm*=s;qMXS)+O3nn4Ue#H)a9*SMQZRG1`a_?W{dP;`05^^L ztJ0N(;6&_^yh`5kHN@K(l~rJQ!I$S61QXDSw4>hECfNpPjy z_a*G_kD|po?hOA6#G1vc9(R7bfZxv*o_Wg$Jw0RTMx*FrU2)e9kxHDtku&p6_{%oE z#FfY|CP9a8puy86qTb<6hwR^zMuS^JM^B=|X(J(bT7jq0+BlO_!9^pzyeygGLl)om zZy5&6$A2SxZ)@T6?|LPg0#g`PY-3oK4g<<3kAnr^UIN{*CcY?~k8IuM|K=Yv)8BasvzHQ*C{>Ognz73#ICIAVW7NjuZoc~wS$4>1hGuS+so`MTN zg)%UtE~baG1ev8Ev;Wd|&#a@jkIxBabHW!>T{oikj4MDhGzR!t{cQ%5`4&rfXHBqlI%nm^eJ8VLu z2riXu%v_sFkCf&K8Kx(@uyS$KQ>Na>~Y!*!j@Ab7LA5lmM?!%$))D zHN&ACT{n&1J}h_ix35bYMt%d^P7GFx5w=He_@V-U1{h{ z-@6`4*Wwj@?gM?BX#JN6=B;gK+lesNMF|sp!JtI0rQoT0+~3)Q=od**?4uaxvAskW zubpT?qpNJEwe$;dw}iP^ZW=Vm1ouRw8g4|P~)ja8um>&;R$84!IdfU6kzWFdipwYa_Y(p=nqH8sa9mwn|D+cgU01Gn?!|5M zb-o%l1?u~`$2*(6duMYa;;oz&LdGigjZTce zat>BA?H^#_3I8tF*v%Vore6nePpnRtm*AvHL;Z;xMMg2=+Btv{v)PEJFB?B`tz`Yc zWU+>uDg-&hbr8bTw>_09Q{Z6?j6vdI4zvd@P|!y9cbJh-r-`%LlT7n|2X&b93J=CN zZUlYp?l!8R@DNV@drEqmb|ocd4RwTF?RX$wKhMe~1hM@27`>Y18oOB>jdlf1P`ti^ zaryjA*Bo->9fd;st`V-+gW=ZnqBR8>7=C7bH^Tmttv`WaKmoSF)~i8mGj2V1D2E%k zILZqLi=Yx1G8Td0h%R~C0>b;l$k6YJBt>T{-;XCh1SCde3)z-8IWdz5XO#D=tM4){ z?$~`;!xNZW74{m)OW|?ULvu6`HPt6^c~GEXyCa*b!bwDy1Sc?rQ16!{L#Xz)ulOi5 z6kScD(TMH#D`t>l0y?Z$&}`2nO5_vA?Fb|@bz0AAik`cn6WIXg|Dh3 zi3W-^;%~LEmajzF@djPAWUOFis!M_6M;u&;cJkppNF52P(pY zIM!Li!&C$BiiDu2DX4+Mil3)bpezvwIwE&`4mb;|ybSpY;kpdmqiyhd~9Wb*!;HG_$w$RT(sYweEmc1YAl|fmOA)lv7 z$PE0^hIKsF(Ar^)4Qd)<4Tq!~@M=^FaG8ZV!rcs_NQ$3v#2UjwvScMh8o)ykjvW=v zh{b@(SO3ALV399sQ5bpWg=~43l1;IZ9hp^(VUQ8Ty5NSGP{u8KWksA6ajcA~wQO@ynZ)cGJ<|Zq7=e1QS;I0{d`bzbCQ_7AV1#lTX`y%-- zOrQ(JKu5sNIVq3_Jv$42nhDC1X5bImz^a7fH!5HodiFZ}G!fL1VxSA|Ku4HJU)m0# zEMhj_*#IvO74T@T|LX9yc;{73$}#r}Bm2V67cqQ$0D>!bE0Y5(b2se!$cqcUQ=lhPYw4)F?kOVVZ z32;ACzpj~$1DvRVwUm%`)ST}p>!76rzR!IoTrXxG(8h*6G69pm#bac@pQ`N$SO(sK z`Zj}18N_;P2%%d~@V;ez4ztG@S)phB*wuByB7){gS}DX|oLAsai5uhvze z>#d&@T0^eaaLDX*qnTQ%R=!mYD6X>yx|r+iR5ub6YRP^~4DCQW(Lf))^944w$T{8v zfwo9NdV-}8M@oJO*|-XhZ`lypS#Z;!DJVtfV3kqIS>^yTMBOa&N`q-7gbSB)=_}-y0TghVS0jS zz^g;facOkm1|P;tI{_iP@1D*PC2OZU0V10RZaVAVt>hl?irXRl*hlni5Gwri3)B&0 z;2rwFpY$DHQAZ&vU>mkQ{Q@2RVk z7zLfgJkUXjqS((mW;><6)4g8S&ubERC-S&M+mukJUic*=X!nO6FquADrIPJq zTg}mBlc8xfa7;2A@vwh@Fx2VfREidjN*a;AmEb7I5_QW84*uv^Dda@UzJs534s7CL za%3K-1rC_)1gi!%1)$@u;z3$!A`#ZKAAAyu-f{RydkMJ&n8$N_kn?6qcCiaC){B)) z7H-60Cg)~H*lE#e;j~0dmytSzwo4JZlN?Nv+d0(RCWs5a+lpF2E~aK%3QjPMzDiQ; zVLv_2&DTlMqsgfv{5 z8ODxmDi|+t|ElYUy=I+q-K_(;h1T_U%AAMp0X;D!Ua(2FFzE=hP0!?x6RG>as~4sF z1};BwG*MnGQC91>IJXL07&BTr zS`1s4bfcY!w9FSAm1vEyO%``YjDXbd94n) z`9xGks|k5Yt~8>pCUTiY%*uCemnz>#N>^hvPmM|Kdn)@)PE{nEEBbJ@1q>U?JhB4` zE^cQ#Rb@yLv3I`v2B=LncUd>ANCaCQP+Y`x5_xKCNYhW_5lg_6w2snH$grbUzA@K@ z0mfS`3T_V4YP3!)AGB_L%5JQdESgw{DH?c(!3ZT|ci;@m4(uLUL&GdO?#MUWm2IW6 zJ|ELCJ5eVe#6W3(2LFSIBDIxKmWazlkqUEgNfM)w!M==X*UB$t@!2Ny?j7?dh&kgI zB=e+dZXGz;wm!(TEKq-CYPP%9*<^(@+Io{chOUh7=TEhv&&PTeq`S*x{d4*G=n6;* zXFDZA9MtFQ)llGHU&M^zx~(J;!zztfbO79$N&Bri-3Aw>RbY+W#p-0E6@5y7V|P`l)KIl&F~ zhFQM~;r_AOY@BYBSA(QMXeL0eZ8$zvI?A!qbP1q&Jn`BgZ1(NSi8gAogke`+xT#r3&3WR zi>D104A>`<_>vlwG>WqaY7a9ublL`<5*KLnnXA^xs0_O1M#Goc@isGV+q8xzb?Tn+ z3Za@LU+HJ&qTP6}S1ZBGEn__U6$-6`yW4R^QDBM=CQR&|yl7zYZSeN+W~xG~L*&NK zhw)?&%~eGp)HpSY%^xn|u?}nll5S6D&1lcAqEKY>F%cM*KQWYof(5_L4=kz3|1?4A zYlm8uSU@Oc6NBt;pWRc04~9%zXr;@8_rQ5{>XsSEx=DRyZlx?7qBOjM)9X*wnq)SX z#((3k*r`bAo#-`~^0+cmCNDKsqvxEkyWi1I{;O^WFIXzm@)Q0C2i=Z8H0qAv;%)g+ z`xsJ~=1fqafhO%c$PcU1QNA=P`R4O#gHU^;skv7+t*`Vz*bTbP{O!;A#dfZ^c85m( z$50^g&?r!-b_dflyujRVmz>TO2KiKNP=38}{2*+mWbR<@hE-_%h7LM!#1hXpgz|t* z@TZb0p}DnPubR#+FLd501yajI>PGGQKCjaz3t3krU%);h2x+<2-r#yqMLX7T#FWrb z(rSD*wQua08E*+f(AiT8))r>Y%WhsB0IxisE}7U>Cxgvy12B~vsz%7PNr+p{ps zBaTcpkO1xHFQ(sLBjPm8o0+9TYhCUaB^(ZY9QFynnl3EtD9x+E|2ol$QSJOj9jl{W zh%z&)mLnGf%?L3qTd3+~O3{Mn9gTtE^qhB`z0;28fI!rnKe>D2x! zUb)}rLqg}Hn+G%}DJoAVYti)0{je#%J!y>JhBd@nl8$S^G57Amf<(nrQ#}jU5-?G>%_@JGZqxp^3Uxc77kJ|M z`ySQw%=shg|$zi){;n0furS@IT5 zUA1*dtT!A}s6p#~s@dlIL~a@Tj);8w%+kW@}Msu^)k!lNR_~{!vW$rExxWJ-y?q9i_2}$`|BUv?{y6pg{T0?zr1E_{nzyv zix*aX9s96K=lHk+u2gkvWO2p#fxznPu{Ww;#z|)0lI)FFbPbbW$htuX;#*n9j@(St z%BiTkh9fPnF;>=nc%^A}GlXFU%%C3^XyCD2pPjW{2Akh&zlrOlF~MU1U=o-gI1#^m z)^HE<^{FB2`O+>Vmby&PIL>N7%bcg@5lUM=M|kU*rp~1u+MpN-GtCxF%(CHBw29qj zY=Q)UzBNGk=v)C^KP#6TwNZm$P)kNBLYwI1*XC3ZVs!T9~!bV#B?VaT)4g%mLnozb5&RmbZ$RMb6B~lQ;joG{hU^ICv*W z0kSa3<7;olH#tj8H=HQO!Qf7ZtB#bvv}mpCnvGY90yMOgGJH_WeQ4?(r(#OiKifgQ zQ{Wg)vfBxf;Rl}0Sv6<&RTdAy+q-g)7!e`&!TjlKpMo<*@73961t@2&3)RQ2nXJ|d zo~k*!?%FYjvTq%^FrY)%oaJv_=K*J<;=&Ba6LE`ScYVKY;=Z+48ic z3vVzn6yQ)n&3bx4phrVm%8W3i@_9?{6LMAYSNeK+glc(X`{Mp+?(~G>qjhdWE;SpP z^H4?Q+=DA=XL9eH-6!IvwZ9-#8G*Y9p9T7!Agg5F{R@MDB9(VDG%p0Zf%NxpvuYg^s>rJgZP7=nzK!-m z+Lb#BIx{<|OMNvQtnwTl$9+%X^i9QTg`&Ab><|1t9(t zD7H|c|Nn%A|C+?CQT!JOUJc`lF0(>ow6_`o&oXN?7*Kv4=+vr@8mRX z!#c`C8v2-sQ~n<_n000U6*d2_G4ek$wU5}Sg(Zdd=FKwQ7`uz{nGKgzr16{_5{Atz z!4Vx9s)MO8KLVu-83~2Mj5+ur?+G>$m-s##Phea|@ivnrCFwNRNjr5oh}d%__wux| z?zF1*vIg}2@|We)-&s&nIB6wmDS505l8cv*oJ$_gviu8;eU9$NoS?xh;ib1py&uht z{)JQ?zl6@h@`Ike0i(;tD%-8EN!pQLoZMWxJ}rAT0Xrj@z~We5!Qqs@^OsL(#nd;S zQ2P^$R(W@=?P+%=s)R2wfyLp+0%AEEJZ`r7S^Ap?UU6iZr#hg@f_9ejr%x?NP5@N! zu+5WbgMkF35G8bvGAqQNY*Po9QI7TrWnJ{3F`1%BYEBMXaaA5%`%s^XlLbY^R$HnF z96inJgvhuXcrmaFOtJ_75_%2KqMnfeqY&F3VNJs~bOvxbL0XIe7~yvH2r8g^s7L5G z!_bFI?TD z|AcDqC}LRaVIMAl9pCSjYKr12ldX=T-Q*s9!#LEd&I^i~!8*F29mV{iU&98|+l*)D7(v6^(lz{c2LSO$lxSt>3 zN{B~oX<)DZ-h`b) zQ7Mz!=SqAkd?|9U_a>3$yF;+)e8E07_%O#{v9|jXJwlD2HGYo~(5Ac$*9>jZ9{c&r zGzg;2gql#&QEW|OuxD#N7mf?=7egZQo~x9^%=lKjEUe@qHf3RUud$w&;%W=_9Gd)l$wp_0$c#ZSM+j0rIdg<-rvHyj&8 zII30}1_UaeaOBVGkgr8Lu!`;!vA33gAcM#UiNT)O_--kj?4$GTRMv1c@ExUF9A>N- z?8*`b?DsFoX}{?mTN;&rs+QA-@R5Q$V))6{NOOt>B3AOG8Ks~tF1dtipw3wk@2AK( ze51zEetkc*byaU9tR8HHQF~(M{Fc@t)+iirVDWP7Pd118>Dv-K_(a(+bx{Ic)lbX) zDyXOWT9c)x1TqD~1KI=Zt4CS{~DDHjd>k2gj(Em5q*1{g!3?6y4)w%H@Y zb)mUWUZaoP=nTU%nB>~5`0!tA487%Hirf!t3{m8NB0kFm!oQ^}_rXQJGU!q9~eE z+@2afD*L}%e}9e5NF1MlLI&70s-l-_)UsQxa#MmEJ5sH=q+ezy>SqJI73L>2Szllpq~)a`2% z*R;8t!i5^fS%)pIdt;w)7)mMbl*46XwHUBqX~sE#XW$Of>3s)BfxDsHmZ@y%N$pZqDJ z$n;WjW7&NFGUO7USWSZlI1zuRC(O-RRFmg80&P?OINLY%U(k3Lh#Q({Pt3}BZE_#3 z{XND$qux9u$PwT0hL$e>7U|ZB_cH9pzqRy2!Hf-7EqgrFf|g<2PBmbNC@DmGr=bN` zfecG8vOR8)I)tyVz-jMwx9gNu%WnZ-)}IyZVn!O!p4-V<6!Rd}lq7Z)yb|KQ0^;)m zZqc4(3$|6|<4t60e#{srox@#?7nr0jqwz%)-*HqpL4^zQ?w}Q2329nemKb#WqU!~l zPkz#}{G<4E(U3OOKk)=H(_OhZTc{5Y_=mPQ69iB9>j$B7keNeulGzhS0BcNCgY&?j z{YH>w!o~-r7R5HhS&j=?tfj0qi(#z$5NUG~sKbTd_mTAkvVo=H6w_POY zo>)H9<}N?tCe;>=l{g&_NjGHvAEMqdIufpn)=kn$I<{@ww(WFmTOFr5NyX~ewr$&H z$F}Xrm$;q-}J4N*-kO6cOs zJrIL>%E;@E{UY2?Q>HAVa={ecyVKc#{Z8Jysh26|ZkJ2X_z-JHeL8UtFn3E-(;J)xN1xh?e=N2@%z`hz9+xwT@&OqM0 zp+D6+5mrUkR>;|WF(erA48uVjII=b<_Mxi+^1au?-wH&9C)W!@8iO~qxs0rC%XvsyMta&& zyx8(m;WRbX4)5$`o?*}8j?qTwCJw(h$P9JQI4vuRa3q!m}-6CYjbns?{>f%^SD7&WApXu09-4{sp(hQYYHO%nQg@5k@b= zE~Ctqg)h;m=SWiy)-q+ck<=~eHAct|Aa4mZYMWgXHDbIA+b+~_>b4$Y4~BKNwJ;m! za)NG_>vgU$bR2B(cfFXX9zjt6Xx99o#m;DFxV=z8Ri?e{qj}~AgVESi32sF#iLJLL zo2%017p~L+%2-u#<5RNo4AWGoJEqpCaA1u4^T6n#C`;)vq{;s1pE#!iQ_%INh&G4N zG~TdcBK2fyDEs(GqfT)$tFildTv~m63`Uqs>R8DgqMuyfz+f^|kRC>qB&`+> zlbAG6|Iw&8vQ(XkhNsrgC}I$O`BSQ+U5q1d*?7|?EK6!}XnM#%=0tWVdu6Bn>aO7fTs2`VLg8 z-mye(%RNnKUd&Jwuw+vlUCU=uMnwW22TuILuJ|YEPU1VDgmtc%^*&z`6>k zXe;bG3k=Z1%DKsrR3)tg|CU~D4Hi;D%f`HhP6K&E&$#WCu5s2={tZgVpB~aYcbXh1Z{)B%>I0g$ zEB~9WlEq>#9UcLMH5kX6zJ9Nkt=8m3)Z8e{)^4&lnH0M2Gj!cy!{ygD)~q%5qmx@5#|l_A`BP2lP!N&gk-@LRdas~Q59!KGVZv$vlM0@`b1qUUu* z#B6vTP8X@Tz4gU44kcrQqzrKcqP)2T^0(_-l8@tG{{C&)uZibtmCT((9sO34wJ7!q z`(&kX=>L&vmHj>G$=#qzdgO&2G>6@k%0ihRH|QDZC<7zZoKJaGd7VStuD zR-qdlR^kL0wTRw>8^2wt9l+i_>o|s)j3eDDN!0L>{!gg93!Vv$>>0^iF<~J7pv<0S zPmpSn0W0dE!psvuP6x;3@ao;Jr4jlqB9>y>PL?F5b>ig58DtWxvwQ( zw8&3CF_gI!_dhVhxXo&`$WJiCog%x#Fn$4)R`UbfND*>uX7YxlL_~fRM1E6_zr|hr zdJSlv6St%KS>h1&JkYw4dGB-}0SN7r#m!oH-TC@lG&rZsQJ{^qGICxp0HtfTPpRsK zg&06!*r%V2m2O06pVeqC@oW~p@I1VMi_XyOmql>U8M{pnlXs`HVCN_eg+Zr$uF~5G zoKXDW_)}r6!+Bz+Sh1IM@d>?`oKE)f+1$k6>#$X`2xN`?OqwX1d+rCb*u{L+r_2SL z<&`aLFt{`4%g2SyypqyU>~3xnzNvshV+6qI26JAv^yZe&AzbxTF^6(IbOrKf(Np=} zM0W=Z-(&YXkKjYa$<_+kIcXjn4+7I4l0W%miq5pv4;KaUng4;o^))0Yqt_iU6?9 zjrAQ(@E;bBm|}3HCo*HlV3~@4DGJWZW!6^ZM3yOI`nnvhP_+Ca3&mQ&Bjw{34aL;S z;%T-7cgq0*k>}mD(9=erZNmcOo*A5|lJcWZ>#2WVD;7g~uJRQjo^kcYm83K|ttNo+ z_u2W1E^%|uyq};Wi9&_Dy*}^pSpet>iaAsj8TALFgw+(QeiuW$Q>}Zeu4i@TAL`Qi zG|!ly@+s4@m0wc#^{U5F`!Pa}YU+%}9Qy3xx+2a!U}4AdV+F|g)MB+fVVF{+VIO$| z0-Rxb9!R?Tp${4xi1z(9dy65pBSR`rgB%Q{O|?UMvaq-hpLv0n1(ftZX8}%F=^uk{ zN|%h-LybD?dRcMAV$q2C-s4EFim_3dmnp?765T?TwMO_u_PEt<-J2hfxDL+U@|(6D z{RVMt?ZeYH3Wf~QUDHDs-pXlnZ=u=VEyV*v!!g^cY);?IG2HAs-ocB{&Ju#58I0Sp zy#}WN--)3gh}$W{%)shbJpjQlwA4+tr|wU_Dby5-!pGc|kG~$)dpZZ_OT5hPSTRy? z$?bnYfR9hn@dB4+5vPxFxZN=`-piAOY3fVJgw|j6?(fHUly9=cZWSzt{vl1R5}WP+#oV@9O50k4Y9G;^%s-#TJG{}3vzvJ-r}8qSU1*qsHsJCB(n%5Nw&`! zKU;Wu=?|-3%vq{Tpex)Fb`fr2jrF-kO=v#q2Fo)+aF}Tzc%RR`b;}=tV1(%vU+mRD zZ7H`I8Cm^ms}|rm93VMCJKCE!Y4oUT&zz`b&MZa79MPSQl5d>4NU~4Tzs8p2BE|m* zIWNnpS(XD+V)O9MABrzaK?(Za#^Z+rO9M_}octfn_{2k8f0Hq#hZiX#eN89&U{Lr# zj|ig{0nG%w+R@C^nPHK-qKLMaaXh_bZXEOHE*TP>e?Ma8HvpJjUCts^78`x~q@`xZ z$?pZ+_( z&VnsQ-R^6|Z2{V@`|A!ZinQqo9T(ch@!C&+hvVf7?FGEkrn~`XoWZpcya_uoUk{^BkL&O& zL%+KW;WF=UaMKJO6~2r$`GIrn-uGhKa2NWmvsan3ZUFq)sO4PNA*AWjsI2CF|0VZ( z*EVv_P>MFKW%RD=$T?C5j*Wn=D6?04%9!j<_2|7Sj*0=R0j#*!@i|Nq@a7>ABUgu-C4AFNY0T zbgOAQuq+j;7c>h0@u>}g*omOZyU4SJ%^51Fh)fl@Iur{7gLT>z=B)AQWv+}*xqn&T zV;h%d&%T)6bGKy?-{gz5C}I!-GFM5YG3;lyiDv1o+Ja_@zw3H@7rb z=V83K0zRQ8@AFI0?xTF+@V76@R;Yt~=@%GGC`oLoJ7a#DB73DO>#M{jlN`t$R&m}t zy8sABe?$^EeIq}?*e-G+CQ!(>)T0xv{+T&^fA&>m>PL_oXI_48IQ{cdKBdfCXfA$q z+QXE?gSV|CdAs=4Ln8Dj>$X;0wklY$=6Bt~FMgXlH@2&sa6f(gmC{6uDQ#nRf*J=m z7mg}I0Aag*Yw+LO*vR>a!S;JFG=}g$MCgBh?C*v|3iv;%cbYn?c;aZEI7x7}!9cn+ za8x(;6gtjf-~cRceocT@9UV}dw7Ew z0e=|tYiORohR$fPKm>h*f5W%S<*iNe>gwzLn)OfMa|I}Si8_+9a)|sl-FPbFaFPL_ zpfwesvCZM`mVLyY?A>LV(Zk+S%#ZHqu6*`@VP~Rdz{Sv|k~C`9?Izey0a(4)z9OlZ zcqWRKafGm35hYx*C!CqLK!TFUXyI zBbHfRk~s2l>$6O3JTvnwR$tiX_SI-Fm1;Bx1<0`MOAfik=kE08zZ2deEZAqbxzp8V zre-?*XFrW&N0_?4j4ovnD*i~$hA}|6m(2(joVGyrW8>&n9SytD<}7T)|8h_tlpCAl zXVkLtgc9Gp>H`(du@CkQdpHA}h5kho;{mp#ujlXTuMgKeogR-VIRIVQI%>nqn&L^& zrO`tm($C<=Z#?)zJJ>Czp%3{>@-Te|RQg9TnW(C5K4j1WJ2z$h%i3tul=6C_B$oPL+vF-Bg zx+;;3)xZQ-9sHTe5phj18cw9Xgq5S69?hr2ITK#kBL3zMqxGW#+cZXykFhi;4pX1|lW+v!@{jNrD#kUcRPCbI~2J{rjd++j7hB87!CTF^C{?X^lMns@_e}oG23OqA5ygPQv7BbV2RGv*=qyXgkK$uhEk=%`7T=- zoqdwE3JiQ$Q3~d@zvAKla(d$2p9rW7;gnmb)hz#)C04|ur2ZmC(T@J)WB(EtQ>h50 z&gU*KzM|hL!NTO!ZB|x8Lw(6m2Q(Vj9zV`#F{?K@yC9P}@)={*duJ(v(brSG6h%ev zP>|37QxzH;qgDY_=KEiyyYSgfr)NoX9WXtvHiNJyGgyH1NwC=%Ha+ zas0*LJ0wWFh8-;Yx$b!=c7hGuBd!9M@61BYFyO0$6NC_b(Pa# zFmOnoR^~5xK@k87xvkosc?fj;<0%wl}%nGwy7MRc+(#|t1R>~QHSFz=B^tYZD ze#P)b-WvJzeg_(q{A|1VS!B5p>x(Q~_x(yawlRCR^C|?j62UDpD|#!rA_Cge zH2-84!I5MJ;w^44V=Z7>PUbr64S*YEc5PSyl&VequOmXwDQH{v~Ie_YxD13Rp%P7$7LxzBjwAu5wN~+!y&cxNcs* z4NplY0YC*dDD24NurJMA)8kY$IPBr0pukB2fOtrdoYm&#^%<4uNs{FCu;2ppq)3S3 zV*(t>zP3roC8b4;7*{eqPuE>+mp@>hi%~M9Jzn4bx8SydPtPfU1OdrG_;27F9rJyr zc|sy56PfZcmNDc@^Mgc5pzNw;WqJ1({3+Y1i^=qHi#|HnYA~9S82^SW_ z^%s$8)OM3*sHr<2+JHxUt3kB+%KRM~0KR9S)>E6K)hr?;mR)r{&dwz3EQ!yO{;afs zbeKKy%=FE040(v9$@&;0FoVjN$t*=T8WYSI^gHgN?t+LSp|FoDfGZSIScp_q(=?s9 zC4)`+TZSr{SxQ$);og{1SO)-$2pd6=_4p}?g^-@HUQF5AT2l0k+x?dStvptk{tfsEoDUogk8Z)zcfL1@s{}*IsPa%E@mkW$lX`mid8(c}Rs5?@7mC)Vv)6rX29o>qvo>nf` zgEbB1`sY?}4n;?!HQ5!50c~5xZViY(t*C0LWNMGd+R&t1ssy}5!-pbu(wMijy5ooL z#Bk=_T?VI!9=6esIr_Dyr|oPt*G*pqv)go!dzf@Pbwr=5Z<%|1K>C#bRu~X;*x|H0 z`bV&w5Ong58RQQFdSl(sg}84ym{eFkZLv@UYqNeqw>F3_7tWnB6gtN46lC|UM#Imi z($!ZlJiCU>DFgJVDxI^4xlYv1YiOcDD$@myj>KkXJ0Hr7R+8*!Qgzm|Sm!i;NOjWJ zy%g-ZJeOAY+Wuv5azP>3_4{!-KhTjfL&oPQ(T0VM(&Z`a; zXK|m1MKAljj_r#-!1>Ja=ZcJP@CmMXdA?qF(zW)y?v_qudGV|`s z-%MsDd|&^WYR`D~seR_*$bA|Q^OTm`_#_a6e85hg@*iG}nY8})9++qcHZ+FNVrD`` zQu}R+&aZ)41+JnszWF^@mvXdL?jl}Iq^X@B25W%K=!^KO-gfw~u*iXDW)n9k z4;>RI76I)P%j5sh#hi~D0OlghX^Tg^U?8rdnLF4$EF8ox2@5jwW}4*Sbfn;1)XN z!94=v1kUBz!NvD(VVcKj*H@2W1m019;G*KvmuzUS_hN$VTqQ*j-VScj;%;3<6f<1J zbk`wookakYIJ)LBziMoKJXo_dM4TFmV)MR0=X^w5tR{pW3M4(Ph#AccJ>xQylcZk# zZNW!BW4`UlT(|#AlUT)PpEHL50eM0H@73|YDad~f`Z5$5{d+41?Sr<6{RP-hnPh>k z0h&OtH9j^~N>VRsBj#+SZ`g9A%gY(x7Y7mYI+%Bz`Cff}bUy_bBl36Q_K0Y2 z4^Wv(jU>bd0c`tLqQ)o&aaH;zH&=_Itb52z8E5;_S`+^6P}`39|KLW+V381|cn0%I z=bT$@B`$FHNMEe6rYgd@$FUwj6ZBeuDnYI;Z7$mhb&s0cX_iDMmWQuDSpUOcV#mqO zk4NlL{*wuF27XZ|wqo0b1kr>nGLad9LF7OwfO)|s5AaU1YnRe2*O+Z}ROTjQA*C4r zUP@gS6i_C7?G5uY+*<0lMbdDE^Y%*$kx^dccf>#muGLQy!X#F+CW={xM1y?uWwgkd#(CMxb<|Ra3Px=>;76V)O?U z^4l!17$7hQCCJpn&U|5yh6s?DXVU9~!)A4Y%Qcm16ve6x=CleXu&&fL54O)CBmHR0o67^HCg7FhD@?wzbrtzBL;mabv>36;R$5+vVm3f_Scl#TpF|1 zjD-4ek-|3q>sKa;eYy^j32`(jSHHDno>-B`D*%cTX2D+^m?3}Hk)B{V63JDIRfyul zlC&*0J@IZKEMl#{qk4r#=> z@3~9$=3pC5O{OHS7Nr~#GzM#f-IHAS~jvQTFn9GS!)$^%&T#ygpEo^ zhP}ZoCmrPw_(2zsTK1d(^AOW^t=UVcKc{{hInzy7w3X#e7!1y%xg5|@IHw@(m$L1` zLED&Rgw_8l&>_+9Kk%xFzrkZt`z@Yw0npOP8j_mcB`bX)tDu}v%*N$iPvk3Obv?|4 z$~S*G{A0ab1x{YYNi`*P%#CC?Q?1nS7l)4NAt2P+QYJK34XK!waw?eS5fqmz`Gl(O zNV>12x<*(;Rz-TiVkOFwGA)+aPumPQGn5`$LbdZROTgnIzM#N(0Xo&K@xjmN7=VWj z=>b~5rdBV0grS+mu;2=PwH25%R}v|IyuGxQM?8}VvA{SQ`gLG{5e-y-f!F=H=gSwVwC!BSE!Vf(92C46q_|e80&OK<&ip$v_?}iNfDinq_;M9Wd!UHqhyQ* zauUcNCb;&=jvwKY~7^3BrmAq+nb0t05V0^qz~6~&J^0eweU z1^11-IclMRY<1{v#BrOG&WM-xczcdIG$kB63N5q;7C7Kw))AWQ@o!*>81LMnelZ3y zo9U*G>BhTHO>wa&0FZD)>5msuI;_uggZD|IaaawUWAiJAZ2pDvIb^#+dg{P@k5EWG zAms(|_4kHGe=m@Q72xdK(3z=AunqD_za#Hd;ule4oN`10IF0q1yjINn^oyBw*y~2wMCL!x6PX-I zqpZNI{d=)@^u~g)i{uW}m$U%vZg-f0#}t-+3J%n!N@M*D13)SI0dIVDL(G4gt+3DQm3JMzyn1f$yf$-BedQ10`R`xsJ}b z+CyZW#E9agrbM6~rY8L715~$?cJescyL8A7Ee{|$6fkc+TC|xoGPerc>$cs;W5kxK z{IWmSp&^Ox2SlHF?hD)^WxbI39lkPoru}`K5hKzc3;M|T`pHvVS7v*^sxL3sy=6j0 zK0fF?s%}jdKDpTJ67Dg7&+V6GQE+~HgpjB^KwR@?GT$QbQ{8^JR??=;iM?t%Slb6R z)S-j2XsfY4(JQ`wst8?F^C`s+JIj{t; z^ia~{HGcUuBsqEMC8nMVR}5vVa=UrAv%UmYP3@hkAmqg!jr*As5&JzoMovx$fkFjgOFmLM zK3+of9pJR8kvhv9WV(dPp=i!eOpb|uB~}%5gRzcCUQuW9nVDuPukb6LI{B8Xj=Aan zml3+^o`$9)9tnY@@{MhsqiNY-YSUmqidwW^G`7Uu*7C zo+ObLRgL4h!bB6(mRm;bCI{koKiqFtr34urrv$$TtYLR zw;i^ZzkOzX1!6MO$|#@qe5!7Sp(5!Qle=+!&~zKaZ$0ZB=VkTB!9MoFf6UFx$ui{L z%wgmXb&hKs`$G?xG>PkRylZ{Qg#F9UrpJ!FbbLx_qzo~(qBjh#?9OVJc(5_8zjZuz zp#kT=dE2f(REpPXF`J$d*QY|(xxJZJlUAeYmgjdXgR&#@)31gK^j0j^9NQ#nL32OO z36f~=J7K5UFZ=HJ3JqHQ>~k&%9XUbCq$xdwJ-wpFpIU``BWI%vz7lNQ0sP6Hj{070A3bipI0^k+> zsRo&xZNAHPo9BY1+R^fG;gs`+=<{EvX8cEDPbeyUBA+ zA)kM8{;g({VdYW?i#8ICA--aw1W?Kbh~}A)?@O;;le>0CC_7`*cEo^v(pwnuO#GXcX6`>_*3&?vFyNl}c8n7ZkThlNF-?!mX6GPz z^6L+aX8;3FQjZKUK23Hy)v_#c!0*st%efM=JQ0eu7a)82>QN_DjV0xr0EeDrQ+#$G zEYlu14`GE_|3(*BvsfUWln#pnyv>b4UHW*=ih`L`VU zBXk3+@9rKR*;Bozj4qi|yh-3F<8jp!aK|W`)}axn%p^`t2{CJu?^67yEF@m&>W6}^ zUEs6AB64?78unC{y5Q2C0NjGDV4T}Bj~?ifF6;z7>@|+`kJ~(a5xh4fF$U&gA1%mN zI~4XiI#?>r&i6X4Lk{^SwNZyVzi)RCvU=6=E;0+YtH7V=q#UQAp)Wl_ng?1f00G`j zCKegq31pX6vW|*60p6>|Jx!9#m#L!}_8m zGwUvfOzZIyRQyi`FcdD+c%Mg&k}ljgJ+4{51#T?`*4NEt&TUvdpVI=HorKoE{-^5~ zKlE{i> zh@|qBdjcE((dBP?d>Xk z)HDt|4tgLa#mDoE`zY%`@F?r<_8kzz|6`lweLTzwtC~nrTmS}~!eI%}#^$aB+t`Y$ z&3Wc0n`4-Y%u;axwx?G}ALN*$bfFWOeB<<(<%sw_*; z$2?yxxuMY_iYUIZIGgpiTl(zrU-M>8ZU|M^h=T!}7#%5II84h~$lnvh^tQG1sck1? z5(?^+3S*dXh*OEY*wQTk+FnFSyV)$whM&3ZB5q@r;V)Pys!C>3tQmRG>~dGCN(nM| zdwCHW^z3jen4&RO2Q1S@+G zG<^l*(&*=*8a*WxL*{_jDQ4i%VSfe9)5L&lxR;UOZn8G;r;W@2TJzJUI!q}uMzqlG zG8*`Z)go|rLR(40KJk`cy?E#@PGLfWp>?8$0R*Qk6OJYG3LH-}QZ*12mloT*$$f?2 zic9P78k^X5*$9Zr5>#2`!k&C%>?)Er z#eNC1Mxh+#`qlIY4l9}s-PnjYtI}>XTD6LVaydMzaeo{fB&i+QxT-jE3bxw{ddy-}Ve6+mw!rUZ%rtp*bD#x+lSYzUCf-9&5flpPfHR!K|p5ms$9ddgGUB zsQELRZhjubGE4%z#V!xOp=DQAC>nQa(qi?E#@o`2oE2?n%B@lO-y+){HyDmG57teQ zIDv4}xg{Xr2me6*)ot=Nm8*B|kv246r-5D*&ZR?kuv&sLgjlbd( zloYKZ0v;O@q_kH;EGbu+^a*&>z-LGGi78Y)x@dm@s<9PhWQS^m^i4$T6=B+>gPq^rmcZv;!ljc&w8C+dl9F`mZWP&YL)t7DzupT@bmIpMKdEjnl>5si8 zVPO_kGyaA*mX$pO&y~dSt51OL{+OHR6V&{|k!i?WA+P zRX3pIVvTCa&1ZNB#%p)#4*03Y7s?L?D}ljK)fY8l;d;80LLMRK^^C%nwk}A}Cjfz1 z?t!>TtCS%v5`#S}QDsa!ZvOn8xcsK>^BpY>QS_kWTxrx;oK(*H!_~|!AOI0&V!YDI zaThr?I%by{f>8NJ*(WmHk)w3t$7P~Ez0?_lvl+0=09{%Hoxp-1%WhoIJr?z+qmo9> zcO(?TNp=Rfm$O}=j1I*%G@iz_G`i$987svG->V4X>?IcMJKHkIxQr#9 zCK_iL+$_Wz-7W&rW@|kV`+cV>O7I^RjQpHOmIBk%))>pNz!!MOs=3nTlHW@*B?Kh z<}mD^HXZ-$WU4s;?;mQXG&b&~eYF69vwlDNmAqQ_9p77{tVR2pjO7g9L8Mpx9O%K3XL0AVD*A$C;97^$6d0l#Wi;dAlBLG ziuIO}XlGDL@K{&~38Ti=3&@C!+Zeb%?}Vl17)1HE{eAQlAy$C8I@ckbZ}()fG| z(}bzMyCEm&o@m$ZO1#Q6>qIg;P!#bDaNoN|C!jRuiiqm8NN|c&7^A; z{^vBo8~);?hGBp_oOs|w$5?eJj<;FX(O+_q{@QQJ6V9oAAQ()o4l(Ss7reU^7oZQW zfG4>YtdB+R>14}*khnh#K#omc_fG^0T<9bXwPVw|_$$##e_3Gjms`MyF&B zOn4fseIiC9f7#S5#2Y3>d(EYh3{z1-8V-rs>j|zykz^G3L_>%Y4ckMyNDY+HjXpd1 zws*@@?KpvkZ%Z&^%q>S)I+62trzB`@tI!EUOedC*EGKs8z%cRwN`_h3_GoMeoEuCa z`XYTAo%fvZV)o_( zoy-sataq=fWRFL$Pa`C?u>aieN)fq~Z90!{C4IUxfom;B8Tr^{8tDug=}a8iP%zk% z*uNxlcAz{^AbCOn5VQQJ3gnA3cR)R;g6r#sl<^Q zNW*CTzvoYIHg}ZQoC$F7jbM{yXIXT2q}jQA0nOBWqC6pek5bpN*&KZNU3JA|ht+vw zF?1o#RqL1O8nP{Ls^aq;2Q;E|@s(#O8bjt-aX;TdIqB@(BQuBmEoJcQr7T+#dT3iF z{@y;l%{4@3X0hR?>%ck9UW}3kyHeT#9jV*Vndo`SI^UsTY<}e+}RkOz6L@|C$Mu9fhYGu|uKAAd!pkz5g1zPL zV+|Tgo)1l4Czf`(5lP;3(tZ)a)QzPkUNqp#ogCU5oYmEWJS zE+&`v7`+SC_Gr^URrn{MFW!xbw6ti@xWV%bwviz93&jg`h>e*9eiT-oqTFw zv##75%?0LzMyC1tE`4gH&*XO?>_`XRG2uKlEA3}m>?Sk%_Jzr=XJxR zW6dIRd!j{7V`ondg#E#QuJd8@B(n7T^%v-GzYaPbdL+56YT*SHO6UIl{}w<7(Er%q zza8koaQ}4DR|PxEuEn3^ede~m0&lB{!GLS(S+(#X#w9w|_su3FrNv z>9XO3OR4wUVb1(N<|>2MclyRv4kXfl%}^ooJJ+i+THYE=7%9l$g;U~3s#y|)?i$=a zWEe3_9+KnMlo|!=@3v7j+}Zrr5m3H_m1v#ht~~u-+OE9l;(ozDnD?Y?Q1c5PR9aVE zk!xic^qQ+KMKl-y=H}AxDmT(9f!pq=7*U;NiDD3rYJq8P8o z5B&eigx@Sr7l9buVEs=*xX_&;)AwB_=l{z5di?g5{{KB6unUO+(6rOURY&q;fTkO81|eQ>Yk1us&sKj@ z#kgEm5d&vLy`8yQ+ubiGSXrm#D3Sr69~X)sd)v$nM0vzz`QOTB7YK{#>)*8LNq3#K z0c-SER zXDF`ORzqZBoC6O>^Bj8}xxNhIfr+JLNN`Hz9-L@0PjgGBS%vL+Xuvd*G~59%)oMM@ zrVyp*I--v=bnBR27p2dR7u*pJcS6zzkJmK?^|kRV+&-YZN)@Hb0jBP(0#-(4zMM2# z05VGDKx4|NCHa>vg5*i=8}t2MKyb5bN0d93SM;#F7|k@AzJru0JT;6l2qwGk+zr8| z#c`Ft5{)U=#^EN%O`^vPh@n6*qN7%S2oDODam#JoK1?*Ni0E!{!N}#c&vHZa#N?P! zX$)5hvKb)JT3a;SsFj-xVJbnsoN65_u7$+g0%%mKg^q)lKU9ELf0#7+QAdl#fpf1> zB++E)<#%Xy`5_~{(58(#VC_U7O3W|)9Rd}@VSLCHH0+u5dseHM%9Jp@=@-M59Tev< zCtch<9S?;4L95M}FID908U_0Gym=$5+ln%0f)(KSbXbBlXSAUc!=kR^L#J;#lSyVb zELWl*n7eYFbCNmJtK03AvNXR|DMFUOgYydlZ;7d3uIqVs%VlGm%v zwFq!ArneK1klHZbi*e8Q!8H-z;|@m1wucH&fjD^+WvI_o5i8!{-|OOQUo;wGMfA*j2(*AC9!Re7!@jW=veT2DRFh$-@#$M_cyKlL zkU@wbJR)|m!C;&-)E1M3d+zTx=I=jOxV=HnP5$rvhGJfIH$h0x*}QVHN=<2%q-9yJ z-xP>BdlRCJov^_JO} zg8z1K-z`cbOq&QDyI+Xq0aZKyt+adg7My={!N8KcrS^H2@g}>z zyirctF^E7fn!jTC3W@er0-QHwJv?CUxJ;4M(-@~&9Y^IXdUd{%W5SSTLMXYT;P{Sq z>S}o>dI4CbDY{6#0F6F{cNuKiToPA?GAlUKMG%|v57VQW;96Tg=L<8ni#!F<2%+A` zzxS2Sfn%iZ2W$%_j)6+2Xx&zYnd@?_g zTNsVnS8vd}dYe^0zCizLb;rUzW8L3s>HPoM=>L}$^8dHG>2XLRz;_@Bt~%N$0x@`B zgHpKv9}nR&;uXk-#wEi#0*ZJax%x2~$ zj|zUOoP>icbAOXg0VA#xaZUY#=2J4#yoV{gb2X#aX3-SqE2k?Bu6C=M&dQT#MQH?S z6INc@+FSogx_Ou!gKgc>f05P>8yfC`$AK|Voq5~p z9TI=6c`DHzG3Z@1wWBG*BqgyCS1}NcksQF83bw%{4Zj^eNXOGs7HtZAEnu6wIpW|= zB#k1h8J4cQp;S`?ZvTz9P_VWHP~DFMpOc$TvZH^+B2{yUQnvIT}4ffbm@(tF$&Xc=wCMz1#6*a(r1< zmYY-Hb=S2@v~zl5d0M6NAq8B&>pD-N3CpR>ike;7QfCFhnuaQGlhwe&Zr%!B6lJ83 z3Qt4uI=f=3)#y(-)_os_cH+td5n)&IiG;H1vZNuC>6LR^D`5S?GYjQbdQvL-Gy5FV zQLz&q;KZCglfJ9+2xmCH>SS-W$oh`NPwgy}y~9l0w<#I7*KM`9e2)otdU0( z@&4x5)oojqxnKEDoaZn$yeA{NW=aOl|7FNrY`a;8`fGl#6nys#HN1Yej~D%Y?#zUm z_;1*PkO2Dn9s8dWdrl93A(A;RCFk~;7TDQ0!1PK3rwkqLNg@HNw0pmN6l3KkPC0|q z2zXW3N+DA^vz%;F)*qmwgo_>RP_(et(`>#j6jePWa`v41+M&B~&$u$kfN_-*7_$Up ziAI2JQ4+x<((@k)`OtYx8r+z9%qpz;{vRgAQ+P;I~DmyOwBHkn>Y{%w(a z0FwVPa)9EjmSr2Pyy89f>k{J4ttuR!(}w(v10gpEnR2^iO#7SI6{zw`57IvhD+y|@ zL9`-n^A`Vfg6*UI+^|*u;}KAO!Jc%Rb!>s2HT$DE(4nQgZcP6+D6ka~T((n(d_rCZ zp_1)^AKROhDa25{jAnBKO746mLasn{K&@)_8QXE19ZaC=A)S&d#&sXRj#^)m2Xl{$ zy->TQPlNps-gl5vgX$z(D!6b3f<=yawD+)ACA>E8nV zlBStUniL1A<7PKta2YVT#4oF#P7_9t8XDecQTD_%Xy&r+9UaR@QiO0B8K*A|klyTQ z$IY+q+(pSPxDbn46^AMyt!RdUV;fjpc!hMRZnB6O)zPdJdv z1+U6buju*Sw;eGc_MsKzk3TN^znTy7tvl^#WG~f6*Wa7q&q`Qmvz4tsDkD>RM#kkH zJXx;_?uO55LLl}XsdDaCgW5*^s2X7g|T*2flA9a;eyTqMH0h>fflvdIv)@HQVh$`5rg-{ykc z(=W&*<|N0w=ODTL_7I3lrk@^uRJKePk2^|q2ix=GSnCUs?sCy;#@$tCK z_f0zpUkqFUp$`01e%h|&*!pHo5=1-cLTk34EA=i zdEY!1BxT@U+IE;mw+ZKlekmcF%{-yO2&JRd8`H8>x5WudM)%3e##lGR75(YSiDF)nuhU31MZOI2Y(z!af84=MJ87>kND=pf~_J7vOz-0>(_}dIpO)52(SJD4* z$VF|8aOw9|@GT*%0MW98rOp96_OuEWg!(R|z2hNw1T0iHLM$9jBvGj##pcnzhg^Bj z_%b5iUUCFNidbQWfiNCq$v||YiVZE3V{u-1kW^qeX%sKQI}AL(*)dSYO=K9ukHo}W zDXDb!OIM=Hl+uDtALQN|q9UKKfe--S&?IRztv=cazdIDyhq3CchGS}}R+KGZX$jk) zU%j%y(B|Ih?DKnf59!gqyaD6HZ+;z`+Qjruh9 zxC29wDBkr=3U#eFm;%qe=P{q>hT`pxp5sL_mok+OmOx!)B%mfzdn^@4ORQQTN@*W) z^C!TEK41VTmf44-M^853F}g6ThGuGkeD=o*D{=5=P?9?i$Nhlg;i)#%tTJ4~zI*BN znNk}-w?jhbJjNUI!M9p^{6orx5oIQKxEzg)Fqo_{q!1iB#aaUjgwXB5}ppfug} zAS#7ZvtRV0N@6zwzKnImsIyb=1U8E#_$tw6CMy}9)9hqRlO`t${*Fxk3@ruz4Jbc8 zEL1gpJ~AJP2l>ZN15xdOe_5zHIT?EoqR4JN5y6Q|*ph!}l+ms+U2avR!WbH~`#}_z zrz8C4P5NW@SbbO3C!5$4I=s)j+jvd%=SJW)c-9c+vz)x+RlW_X65DR1*2dkz(wsjA z!o74_wT=yI<(IQo2A*YZLg|$ZE08)|KUlznlWpdeNA#Dn$F6_1S^gKRbUGvO2rYe} zN!KmKc;QMnFAU*}B1Ah1%J*d{!#6LxXG1OPwrMPUX_-wvjkGD)C$AE{2}>mYF|+?O zn4WbH?|C+gEtB#dZlru06BcHm6{J*SRf#i!S9C$z151VFL=B#lRc^M04hXCw;Zu$y zEFaOMY;(ZNiQkZkoC}W>q?9~eEbN01D{F~7-E#&rqE2w{nR2@ zHEYEWUsH@q=R|j||Na-zyI4?Ry>j+N z{30jpVt0tsxFQ!SlA{)m1612%&s6{^oQ$sbD016O9Wn#YR_YdMddQf&=okqJoK?Ud zddf4HC}k{MsLVepkw@-(6adH37+`(>^mm-LQ#i~n#T028&qP@)ErF)eIKwKnYY08SxE2cbtHTmPUa6&1Wu+4>0tEd|1>P6bmWHdk1!W(p zpd394Z(yh!Qt9)4+muhlmo1y}lk<=GguT0Kh?}c){%z+v3{(U$=zh~%1{z8rO6;&@TimF?+ zHAY#+B)KQ9in_N>m1x_~VZpQIZxeZZSKyFZFKzoenFWvgMm=xU9X&I51e=2Xu~=Rzlt|1~qBWV| zN7$N49GAUxIkSr`D}UJ1tUBq|5(K#ab9lC_uTv2~dL| zBkedq3Hj zhyI*gLXpT?VKy)VM|pl65)$G>1~QqoR_v?S&0d*+Jz(Fqq{KJ?e@+B8e(l_fr$!Z8 z(Tb|ZP8`@%gPx|yr9_ZbW%m%E&W%<$va%R<= zt+lDFp)0dgtJcc={wdC=txoMQR(RA=oJGk=Zbm+<@lPK(Hq#V6{~_pi%;?f(?E6fm z2N{!(j}Kd|lILf>=z3;p5@Q41HVkR zG`5UPOdaY3W~*$M01VHthZ|^SDWDaqLYY!{%!e)3dFWfj+~=mKTXJyH4W>aYuimmz2y%NjuX!&BFy9cj~^MGRI8H;k7Q2~I-*zbfy$w%mHvGVt3(UbO8AB= zULIkdVDn@4;Zy-Hn#h0I$D#M{iut~jahph;ts|=1mDnnEa7Mx=0)zmu*FsRUrFhR# zQAPd@N}?egdKvi2o@*Zrq|i;}Ge90=IO_v!HqYRUPTys3nu46))Qox_jRH5kkO<;n zqz6yRIAjnguxMew?X#LR?@!9Cv=}Zn&3JR0@(v4)vP2Cg3;ZO`d`)c zEhH=E3L76ky5lX*7dbz*zjEYDAlUw~^&?Lz2F`@?pFmLHpFlA4HOQ%WSr*QoDn8!R z&SkZpUC#>88X<<=CIYNKHaN z!gBAo`>>oguW2Q3F|v9m(=_ug|B3&>Tmh@A?ffT%p2jULlMbplFfmf8I9&{Mo!#u& zmj`I(L9v@Sw_>!8n1#JtUu7{oX*Iu*W9OU@o>v3?+aMjLaM(F|vnC^1`n7qUMTgog z?%Z5;scjp5!n|Dhk5v#&T*Wk|>o*Y$Ozpl7c-L&&Amz>&q*4z05}wR)2iGaqr`x6p zyT&A6-O{bb+b1Ail2;!sv-3||2nWv(6-JIy zOLJrfX(G;a5s{EWSn*C!oe zhk*{hocs@#gK1?V+dsGy#;w$<-`k;XOwFZtwcgOlY|9Tf2k4)?MH!6 zDB4R3gG=gCC^kKLMeiKd42G|l(c5`5UXLWs`G$SO3xl?2(XkKsShbIchFZ|EsNZDb zQYB9d*VTkS!|6|)mIKe`_W4LyeDDV9JR?S66G>dK>cs9ykjIgJkp55qp%9BnlIXePZyJE$9{IuTgN)L<3+1mC5;1r1 zFbeT_&pr&d#K)UROl?W69_pcR7zE`tYjzwRr=QskUebsA>6OU4gcJ3BZo~tX+is!T zpKf1W2!O^d`Y0)EIeKRy5ycWC1X51^ljWG1g)FS4Tu{$JGMS-m{2noUJy)1onVO!+ z=5lGnn>YTi*m(UXdRTsrjaC80st3iUWDSC(iI1>eU@}f<2u%?-t`rm77`(Ddy=D|U z`Hq&G7S|&p`I`{T6dCvXJKVpwNf4GBpLAk^+NO$%)?xB zQ0w$-X(k$1iSrMID4g;23m%M-0`yCMIU$1f0SzKQh0y$j(F&M+Zp3h=C#s8-&8e|q zEb0LrS$CO_oh+WrJwCt>*jz#stTFk^z=0@OWo9?MGTicbWu@`4jX7EZb{v|JrbJU- zQ>sTO%nF4dOCY7Tt+s!L0b_Lyb=qQ8iiEe4#v!$BDTN#rGQVFx9 z^j5z_R0*^eT1r4$W7$a=d;sc?-taR>wf;5`VoFOK!J>m4HFihxR(Y@*s`cTSGX|!P zKf+zO2_x6+`oDsQhQG(B$$e z#+41p1o8+T&z~Ol#ScpngwyzG-Cx z1;0C0C!kAAc5c2eu0S0W?&C#YYSl=XY;ZRzo%y-%pL106pxsUCbPT}n-{&YV9ymUk zdEK8)iT66ef5E-8vrCir8qTbwHbTp!Bs`R`7WXY36n?VaSob)k(tiKDmluD!vD{0w zSZrD?ueW}NQ1IdZ62bP{h_!P706UwBd+IS4Nd^pr`P83onnq8yal|Q>lbZ^%)P%Sw z`}q)u-7YmbiOhM)JO0aQ(8E*ry~?+^Y#z1u`aQpK7}TW|v#?M?=AKv2cKQUhDKBcu z&BRHTzQBke%hf`e64A@41{94_to>njo&?W9SIG{GZlw;v>>AEe*Xg{!A*wwleukj{ z{{h%Uuo%A(3W8!LvJXN4>OfY{^n$P#mn9T8%`b9|cFJoUmvn1VG1yuK!xlW7W;}w3 zIBy--PwEeFnQ085-L_*PoX;*8N>JGsfF5A>gcG&ip&L7aawD&Ggt~x21B-W?PtPFt zu*t{f8KM$_en88Z93|XMm^R$r?#uFOH8D0u$~+E=@b6^B4D(mjXNzOV7%`(nEnwm% z7l9KzoijNA3%Rd zA3Wbl-xhy-`*+~JA!ZXQe9ioR{HMzO^?x%-`PBcIq?RMzZ;TI3P4_~Rz~8Xew6Vr$ zw5HBRdvL_FsQ!(~wG)=)jrIH#*rE+pi{b@oCZ?+OL}X+j4m}C$QZx+I;bLw5To{VP za@^oPLT_TF9D0wE6-iAfE~_fpyz3>?%SX4)IZHjCua7`bju1YluOxa%R0=LTVf_u5 zFDa(Ejnyg~TUGtNiTQB7aS(I(B4ufCbYvxmdV-H}l!#V0i`lQKvmDOpB%ckS=8kyh zp6I(Ch31FtZv9w~ESiouEE&6X4Y2LInh@mab+i)wl zx>nf!n1+?CXi{%XtD_+`l?_bh2>ih>m1v~|6=+K7`&|~$VqA<0#DK`;itMeOdcP2G z0v<9ZS!7A8%Dp8PJ3rj>e%D>cr%u1dFovB7P|_SoMI^hmYGq?=m<`7|4kb5x4{M-{ zi(&LqJIDA}4(9b~yIIxRlqUL<>Zs|1c2DDUy1?IkDM;BgH*6fgS1pk#X;J&*7n9Sp z%r0T9zt&5=JG*hiS{QQ%yZ7#8)VtjzuDc1?L!o|R(&|KY!I!gH zh%bw*33umIV{EUwA%<^Ady)Aw8h*eK7O1~arLii?9_V^Z*QsGOdsd(&wlTG!S+d^I zdtg7BzqeL~$Nju%-E$1thlo1|KUse`wF>u?OUEAIa6bhnFXLo4+3ECk7C$t>hBPq7 z@ONV_eJO(Z%Myk+Rf?U>Y!9O3WV&1vRuNq}XuGqXT_Pu#kZ?z9P+OKiN>dKx`(an? zT*WHDpqP#T=FF=e3R&rQ0^lS;PnR|WkKWeYyD2|QA|s{A?LZ^@w8uB_n2%DMQ?MRh zq^hb zOPYL?($1UC>k5!-{JO-X6E)HFVn+8UPX#}>;yBs6!)KiAYooIyYvLdyVKH9GiOahE zA_Ac1eX6gp^4Ra~y{mpEOHH(ZpYp4(va-GBIIOqpm1kcA2G_O(@kK%t%V;S*rDv+# zkMP{;#Tg6XEmW2bjD;8&HJMiS(N<2_apo|#ZAY5I5ycw)?9+=|(0y*q3q8J69+@Jz zZo+iVQ`9aEr*dJhwj;MzT{7=;x+L8Kt4j{hSa8mE!eDvPRCz`*k#vxGDu-e$_vk}- z6Wtl@D2ff+-gE7w5*lUErWvyva6ZsA!Ypm#igK+#n}XTizBU71{9ve+3L!a>GO4!Z zQDRuR^nN=ji8sl)g((4aMaCY2%?I-PHfIz3odV~$Wtw=j2YeF#9>)`s<1u17&p0b-8+|j7#DZgAC~g%hWT>Q4(3P@~v?p?{7w8N2y1b*p;IS?xTENklN{M z<7BSVm5)(t@GC6v4eygQ81fT#-UD4(I8?^PFAH){u1GOy0Zb?>}TyO8pfD<1;X(U7i+)($C&Y)(7J8=Ke= zIW&b{UP+s}Y57j;rWOMn;JXG9+o9v_Xa4I)K)bTE|I=r2rTXsbE($X0fmJGf7)JW8 zDV?%e<`qYiZva0cGs|qb3p~Uqt^FIEaHn+Sk$TP1jgjT{5Zn`5^$x?^JN>fte1z5D zN9gUadOr}jBB+v;qhIDA?1r%|=nnvfE??Wc+%XXvZugy~GqQiDYxTR@^GqjazxM9z zo9mHyhHdBT(+G%ZKS=d!;Z_tK-T=;IVQFig+l$Y(O}Q#Sw(VH)`PU$5K!rbM;!i%%B*cfHZS zeQ6GwQlFL3#n6X)evGt^BeMmXM~W@vY9Qi(3-6PVAPeh=1nGxLOwS0ImfU`&~6*)Eb4hF{>DgC!6f8W>MR0P8UpgjGy&-Suz}!#B8fuAr4ofoiY^YO z%2GM;L+Cn8#!3>B!SO$fx^SAblrXZ8F<>fYbC?zzvrS_6KwQEa^Tao81Jp4l|9(eF z3Z0=FLMI`Jrbku4ZBb2TQIYvRc>+_N1nH0lAH{5FpuEckvPe=rEE&A^X*B(PPBRdg z7%y2-f)V^+o*T1+bKSc|Wcbt8m@36lVlfk8tDV1thEaPUYB@}OI*L|InI~IT?vR-+ zH=J$dd#%DC1#fP@yg9VOkL9d+P*7 z>S)N|!KbBYI%lmEvCPYX0uG{+o6jZw~ z4rJY#f(L=Z;exBrk;Adbq4WgDGc08|a5^0;(^O>Y4=o^z1mozJ>o0(xjNmm0?mr%g zWAu0~2;pmgDoEhtdMdyd!xjWPO{LG^43Lf77bw~!IN&34Ho{k?r;Om&Wvu&wL>a!* z$A0nS#SZ0|SHz$$0_AUKJoR@@U`=i~rp>lP!?6R(G01Q8XQ~TXO6otf`{mVmQ$?ca zM)Cx+;z}5Dl*TsVY|8Y2F-1r1qH$-b*sC^FiWi3p_~V_th#i{oU`fZzQ{!VA^hUd+ znGU~%9j7Gp@H++=54eVgv>p?5@mnb%Y+_Pd1hleGG1{QyoCyDILc0Gx@L-?Be?O-W ze)svn=$JYYGqH}f3+2@?w`Ea3_mP5FOCdptRH98(O?L5Ie}w+SqzM|%PA)%+xJfuc z-CSR^kZVWV0rWvWTfq*bSdQJOx^>T}Hn@JqKHU+*~7p<{c9u}Szc08#r9 zJw4g>=$$_1+IMl3C9Zn}c!(Gz>eDcHB%{VCOt-Bw-EW#aDLXt}KTTA<`=zKvpEK|@NK-xX5x3OA_4$*ZLUYt>QMrzitQfpIjuI0Nr%`S!_+z7_G;T6liw#WyGn zOO?BvZ^s!vscYkQK+4fGom-fA_O^o#@vXi1D~h%$@@*l90x4bzhX$$clmoUDx`5AY z{%yW{JmSgi!u>mzQ+nUU#heg%H6RW~uZXrMK}Bor5XzFnE```iZ%_t)UNBq>hhQSy z-{_fMh*6aEuMj-wDzmC*vg1|pIFPFPL~LT=I@G4XY9TZOpi6-t?`rcNN0cP0MR=pc z_pZ6@pXiaGsu5x-v)kB1SxpzU#<}^Ic&a*}oAbcj_leAP=8A^j{b3LMP+~{06kbGD z_~Id0^#fSUFq2UAeSS_J#7uhPul<*@f<9N8Laq$Mx??;KfG(f7jGis%zke~=Kh1 zaJgrsgfjym0lNGF48HV*Ui?^48taxLGo&ef-8#cq|F^lQs?N7>aXYXndPZMM z*)ngCFex%%P>8^!7$vlS7n0NrT#AS}`kR14VVSK6C$|4}XKiiEev{uEowzduP$M$Dd!zU!K~j^moJ) zdb+h6)dkiuNbPy z>Z6C*NUD&0Sb@hyG17U_UX;!*q&mI=m}4w5a|L3a!R6S4_T3D$4$T1c>|1Pxy-Y?# zAeM1t3Av571%9Io8c5GSB=p+_vXJ~};jkqYkYJW1H~2&S=_g^?CoMjRAFVOL6sXhD zEKcaRbiRkb!YzhM9ZW!)qlX@x5@iO00-#P@ve1mh@QB%Mb1AeuV=eR-37(xk`L4L} zhzCT9&8t~I(}qtFyU=R<{i+^+@pIg+>K&8MnLx|vSa#LDZzhH5N1ZaYEv(t%3LW&S z#d)TJIt!i>@9U7Q>pESF1v=ELVSYdjpYP2*P+I>Rud+QXJerM%pf9Nu%a>}(8>$vE zfC+wWH%LKjw&FBg$KGKtoBHmj9pi{f8Wa#RyBRu`2K!HaEPF{$xWws+j+1MMc_Cb^ zkMrp3a7NkeJRW313TG73iAC6XGPKS9U-lUbVQb0i;(@ zS@|wd7N2;( z$6KBe3Na-{0TuF#aK5VjcfLtS(rXjZ%a&eBH5-YE1o&-mg^6KH6_lx#mNZk0{eo)4 zG7!SOd$zA0zuY=4D*igl$^kD=PI4CJ0UcnKqoy!69GMLhT`YHPu9q8th77*Xwp)NN zoA!+n${1PVxOyaPaBnJeSztmqFX|=kccpy_A(4(^pp_|4cq`sbq|6ag({ClJlPO?1Nzjk^~hF_%%ysyh_HlH?gP6DK=W51DFU!Dmkgi_A;c zql-f61X4vq4HmfaLLJr!>Xb%2gz_e(jlsgE?Hv=BTSP{rSILtLt>x4A$?IKznFW)r zC>zR|er~p{TyBsRjGp2x#h*@0z;-w`L}HFx1BX~yy^V{t>N{FSR>nHONHu5#K&Xx- zXph+n&(?TiXGUuasA5;}a2;3Llu+~G*CYH_w9Hu`@z$vgT}nU$RC?4G0G=^NAWXOdLHN>ZSXAf)Dd!>Z>c0rAvbenG&Dt zu%Mn--M{i;w}xkP3A;Fs#n^%8dolDME2D(?Z?n+>@ZCN(!fF$h0>k4>HIBKP;~(1Y z1Sh$mQiNif>Rup zYmdvjvnG8R$wXVUdk_Jb3crJm$;Y$)tW(yOK%@yCGRdQ37yH>>huewQ+PpP7Xjox- zJd;m*__=_MaW^qJF{4Ch6CI!bh@^nvq=YekUrOk4)S#4;*PyQ5r%+`*uN zBhkR&K~nUC&GijC$P(-2p3Cav%P52Q3>TS7+d4Ro^U}FfpXcTR1r_ zYqx1tdJ-9c33+U$OMV|naynlsH>(%;aK4{_0!5MGwv)Xyg z)Z1z7xOZ}TuS_tu@$*i&TLa#K=DMxcRBkxWuT?1AA~?yqp8l*i>lwVG?TXY1l9Ccv zYLm0dBxwAF?Vt?LCk+=SICA@G-$W&DzN>Z8?@MrF^kP$Q?S;3Pa7R;uipTHqRJ-X7 z6}ZuT%R(o#|2@o1FhmMcC~V%J5MI-|XNB{)@Apkw(Q6n3xILcQpZ1MH z;wFKRZ@)6ok=duO2L8;9@7quBcxDE?20`g5+5yQ8>6?gBhkojJjL1JS^~-A&$1pTo zT%OA$(FPB7sMM_X`ZQG^Ewbx{j~g#R4_3uvj+Qa97RWL*X_4u1*SG`0`N@>K zr~}`x^6m}wk%qX|LPWlK0ZadUxgAy{e_DeC7cA%oc1Y;%$6gV;cM0)|-in5JF^m$2 zcx4_?gm@8-{y=;NAJxLI2mQc>_70wP3}po-M8BE^()$N}r{{p)+L z-cLinK^NGh-6{g@tlg>tEkMr-ofijZK+NixrvhzrLB)Y5mBwMndO+L@=U{RRNuggIhg>#Sxo>s8{88ITR$Rj)ggL zjs5yF>BSEPg*OVZ&;feKE6H$)~nJt_+7|PMc3_Hh;Tmr4dx1t` zGnY^-`>19EC~!OE`~dk-0CX@+O6s6lb>Jgj{e1l6bNNLz9k+*jKHk3Vz&hc0LrWa1 z*+GYVEzY0RI9C;BtZVw5VK8vOha4fy+hJl0T3YLfVuJxujUiB|;8S2#H7YKMCqP3&hDQI4!?sVN<5qt(Yy*x1^^OhW&_hH-hs8Ps#|&LS z&^)RrMkH_-UMOFw7I0`a&^*B`VjN3YdGL#GtkUFe-02iQsQIb=wp-Co6+G%X03z+) zt7-?YI}Z=bQe~KirEtMzHw$g?yX+8z7wv97C@7jpbl5vk6EG-=OK^TGn>x#p98#@0d^_@~_;S6ngvUNR^{WUS{`JZP$fUu&5@ zNDFp<^rCuU48M)5JrZ3JQ55`uuPzmG247=260j*#zek*v zdbi46{-!!aS7Y^hu-ilA`&6_5kL#hMpBI2^am}#Bn+Uq_Gv*mS9Ho4f{FD{{ML3py zoO$Ey&j1o=^i#v2>pDctR*G6xy3S5S@Yn0V^jGURi4?r#5}9&wp<0EucEc7;aoOYJ ztO#L#oUPQ$BIPBuYcZVPA!BOmvxOJG+_F$?>IywGa3|$WYq=U zA@8NcN{5k*p83??u&q$_4T0(#Zi6<@DkneaJ8<71qWN?-ILV^@;BFgD2%ASP*{d5K zck2{?LxPW9wD&1Ma6W5PQtG#!WU%wN-6vd9_8^;OA&$nYJ=>_{Td=9Z* zD-eDJzP8?1w>^+?WoVKc36MzHp5b%lL*8o9o{IhN8qu@L!(RB?ze1f~2y6BqhCDYm z(Wjk_A8!Wyd`XpSdbzWnWaheO6xAf;gbB0T_gT1IAy`hQ4LW;Idj69=6dzaB^nP*9 z)&Dpr1`9HB0^<}?$~6FrG;R&~f5P9d52zFgZYXqMf{xXHX@Uud1<&RQRZ-iRSJF!M zRHsoW0+Mk3ihYt@Th>EPYZua~S?aHRZ^W>YeQ-cuK1psCjff_Jd()##mLu;ePnXpz zzHT3|YiO$oDwJfGsC6bKp0(zs709vD1$mpiV3Gd)1-yv2<9i!Z*+F$ni?8Ww|JX*@ z0#KbgTW&$MxX=a9x<~HMAaw!EVu>W}W8}=)?~u_BVdF4@2p+Q}0wmoxRS!An;^>WXwP%l-l}WPDvDPOfE_F5+`pS1}T4EoGgwY{2#&(x*w_@n|!f#XH{2f3PN4} zqF~Fl!YeQ1`X^DvhC_h774`s@{@e3!J!<0&7|7Xg86`7#(V4iv!q}PdakC^{B+Ok8 z+m2=drbIB4@)pmQ4hty{HoyhBLUyA)s@0gvTX$W$_BhFB_kmCK1~E6r;X$tsXWXne z8e`oLYm!Q*B{Pe_wd}MN^=|pCtJBB`8HPU6rw|D2i%(oJI6O5DQtczUgLTlHs!L`F zr#kzvpvxgFWj^~VUyKj>I{&LQwA|5lHnR#PgdBEXx?Ah95q8I0PpL#^lh_18-F!~0 zP0=iYA72o^mmS06AACXFZ=;H;c6lHq%!W?o%vbPo1FJn1ZiQ3JWHaIy*rBo9mGkcj z$xGw)yW0wOji)L5D7sMgZ?|pR}cRW+;$>R_+Lo>FBeqlMS!nR#~Pz2)HT^K z6Zv51I~sXvsx>P}!1DZsI%IMd7XafK>jPbal}z^u>`h^aWj!c$4!diW^Jv07=Pr9S zr>Fb#+ckDY1Ql{R!-1WecWUXvg}RkBf=D6_6}x;Ni2*J1FbNNrH(>@ElVVu?Tv=Z2 z20f6(D9Md?X}wN0Y+wIKsc=X(BT(L_9PJ_-rG4{S-Y1bHc~tzIvm!y^bCIx!JwOPf z?PJXckv(PS5+XQ;h)J=@uAl_%bcU%`G6T}1D3Zd^4CBp zN4g1it(Mz^{8-L38<*pl901-`_iBj!|d28c0 zt@)K=Ht0~1V ziUdLNw_f+FP1mcoqqmYRPr~l|$$dGn)chZfLPF`$PGD@t$ieK-T6lebGl0t;@3{C$ zQ@I^|I1j;x9z3>sp^WBP0Asc%Z!4ZN=>72UiYn4{*qjtXr=rae1T=}GU94r@j@SeZ3*WyXO+?qzX8R%+SRF&u~U5& z{Vy780kvuJTT1@rJ^LKbQSoR8F|0ei3W0sn1;4Kv)KS2e(6rD<65yqW&;^$uD|(!` zHY}%Hj#EwbxuV&4=>7a=%Xp@^y4)1MYUKnGyaj^W8;IOULNBp_S4nizF{_~@3&I4d z(syen@&pxpM`-sFE+9Jx{%-8>St=Sd2fLc5KQX|RbU4~QwZ_QLFGyXOs!q04K8)Ha zTWixz)|J7vLDJvaK0xF0;n005HsLF3SdK|8NV<8Y7gZSz(oHbmlCNW9Ch$^a_92{Z zAy;*n8En{qleonQtNGE?tahl2y70{>DYBHk78D`SDaUdu1~~h`<$Z?NWF_m&9>g(* zKi&JlFNrc7t)gDF4-Q7TN5-~FfBv(vEymeIT@+B5{~pN(T$p&C9TgzSX(%XD#An;8;LTHa@4Ztecm@@bimwuM$FKNJ_y^ zxYmse2eu$?AD|u&8d0Q#|Lg@^i#Sz-lOZbalXK&D4upx@5!)9u_%rUn@a$5WEg-K_ zBp=m;5M=*K?=$g?>|JKQZo)aKy3UHRK8vgwK25Pm;p>VEtqZ=B))G!1WJvw1WXzek7ymW6SA26=TWNK2kC*i1quQzcK<0qWQ zon4rpls!%edDyED;y`z8#}Ydqa%?RtS>GqkyHCwJ^-wK@+Hvb#uS#orZDq|fi7`95 zV|_Ih1nE2YXcJ^JELlA4(KGu?;Xt^r+FCrd*b_=)(XAXNv-CO_JXXp%@5k*>}Nr#cownv@#ej97tO`DZPc*^poe7 zGcLc~97kgQc!j)7?n|rtMu@K0vE1wZ1VY(PBv*2)mxPbBBY@9`&i;bZHw*SlcgNmS zXWU4{C`M3cFP9^*e|`YcWe3GHm=lAcR5Hzr5J(Ddt#+blR)ODvJX^QUkNbdJ{1^{W zt-LJB0$0Cc$;vG>oo_1H7T88vh`L4UDi;>VEtBfCBhFOR^;8#aCc?uOWzB5Am1wcDNf&8w3^udg9k9hmxlQux8D*o2rYXvH#+R)?;*kZgcUa;Dm zqSXv)zV{jLt+}>h+pV=E$#lsjSIHTr#WCvwOw$LA-mG6G-X_+QqW4U_E!@QkP>WZScxA z-g85U|M~Np&r3FS;Rg;}T+yX`Lr#gD-j@(rE_IFv2_LfIO>d7DUk~>QavQbyFHjcV zZU$|v652MmG_K{V`mzuz5GOk0=f%B)~9lw@bZN-8L zKYyOlg@A^r@)(Rk<-khIgvyMc1^5bhrTFGVwiykLP%_~3-C$;yHJ-6GfPl06SL|Gq zOV#;#rDPj&z5=Ue2~#I>zF>dY`xq1P!mlEMuWg`w`^;){?%mrf4msxmRVFhU8jBjn z7Y-$77SA#c1snqtU>eQzUT%R?I#oAY*{{=c3`?OV!qao(e$3M19sI0f7htz(B!Y_Z z1#4FH(g}85>uoo67r^MEqo$)B{KOsQU0s5X<<${m1_Oz8J(pA2Lbdr2^C>ov=R#yk zzu|!R1Q4Tkr%Wx)z-Uf<)6PqZToqe=f>I4*HTIEg!}S9bs558QWOA#`J*-$hTeg&I z;)Iu1I&bs*a!?Rr-Sqbm0od|1(S<5#3wlaZINCgDn02c3qL5f06q@zDRH0;_+@+EX zZxhUWp=9eUXSsod_>Xx6=&5;=0OcTT3snr|>?l{3VQfOH_e0;5U~O5XjQO$6$#NGu zeZU6E@7&foOvtxg)i{$Zfk_f^RVBmMGDG*X4jz~Dc&O}-ATO?G5nx_bAVk;3YK7dE zy6)DiPXCK68}X_#wZ6Q(Y=@JaosX22c|%rzqd-X%qz%aw*H3Q%xte*FO-J=fht2ZT z0mkYSGJXy$qv1jpQA(S*b<|9CWaM z@4i~rg%huiF;N7)ERbs`lv6Tb!mCUm<+qFLL88kVI>086)~S8&YqQK!P!>>m=;^PM zmB;p+B#I~%YG9huf2@^!p}AH*?+mFU$BrEAycCxZF10CvknO*?nACs97SK)EIdqWx zH%HvPL7-)(>U2jhw>ER;1v{c?W1jc|gUcr71{v5_lv>lQ0<0XBb)CuL+BBJYJh@ys zaqP^Q7&bLs$G#3s9S;&IqfpmrYj0<{#h}(et-Jhr%=-djps!5lxStjmBY~n)n%OfC z2FXKpbQR!V$YQhpqCy%+@ zlH-#?B<;cP{?Qn>R+elJA~3rv=*2Um@YGW=EI9F9kngG4Ndd)nM7^j@^HVbRJJQp$ zcU%`N#}J$-6B3ub`SnMfT>^c#A_2PjDKHkhzA21H{6I8?at6oa638w|zWua-$x8L* zeEHI!4|x+amY*-CKH2A`I@?>iad0yX@aMV99FLT$M#)GaG?fJHZ0AZ)4bkm(RwUhFBjIB`tk8*CURNOgszc24{4~ z==%K|iQ8RHk4zeS>`Z~A?W80sA%7h+62U5!Cu>oE^xz1LtF}E;(UjiB`#mHrRrDY#wKJ4J4sy;( z&{i)qH+Du%raYzkDdCL-8;?_bDodF|{3 zsU8KChY|JlT02OM3|D^++E~nvYhmQ$8ifyTr?ka8XxKx@u*@rH+kBEBC`l7HT(5y^ z(HXF1j913CIvL1Xlq{3wnow3(7b=hGosryr-v-`;jtQ@ttsnDna{&l!CN`h zQUHViL)A%EbYE>)fNI9*S%k~y-zOkjttkGYBwg{I_L;R|7)PjSlX{MB9X)J8z=Q-A zr#F2KKwbUfu?DF{)d}YZDr7lQpy%JY%=)vs-}u{8&K_OP*|E%(G=v$C+BGcL=mT^6 zKE-0}_D(kR2G%jcOHI##109!R5K*f*1+h>FJD(1J^hQcMgqSjG+{IJ=5QYMIcSc50Yo-;f=~ecu*-h(b+z-#tKUe7>n=jW+xVyEW=5qnP;h=5ED)wE!TGMVZ6uA zOXdmXSNtxrurd2ajGN604Ksirq4^8@!xS+&Sq^VG^64I4_P0;&)We@?AN^g%Z_LSJ z3kiD623TW~sbj*BeEww}_R;{|0Cb87>?Ru3bwd%yQcn74CEki-rNh%2NhV?7{g8>Y$`;KN0+LAL;n>{$jfg`me{9`E>L}uf(pW5y&OKFrNh&($; z`i1>HP+ec$@8#nPF5_SyTlk-#)s=QnajJl)OaJc`OrMytn=n5ityaJU7*&(~0*@cn-{!@1fsf_%z=7 zo!zt<=b!KOA0A{plw_!>(2cz7-J=w9_>DB;UBc+wn83pjwDF)NPJw8a`-$I`{z>EW zdF37+-gKJ&1@~&_EEMLLp&y03U7L6`=l7@_U90l-5#xA>hswSpV_(Q;lowL23XtQR zN#1(c@yzf$-$A<0J5a?kE=`5)eGdDYxbh2Y1*^f@@j2T`*|vLh)5FgzjGy1A%0irk zF&KOHePAEx;y!TJh`~{n$dK@TMmfB6b<-ZAGMYH|sA~DiSy>5dp|iiF1}$jTFTV-8 z#X_#{TdK(uq-7{6bB|6_8+(7EHg}y>w)^2bMo;B2m#5<0dUgpb`c(Xabtcj%JoRiYeq@h}m6y903JABHaGeZ+e(LnA=Sda~vuYGf zn=lq)L^)}Emy7O=d#88vx}AC$R%bgg^=_315VDPj$dTk}+3YP$94H&Nq6Evg$yt?* zu8vGMX?FHHp155@J<}|mc(wGJsQIebt^P+}RG$@4rMEPe;v|7D3Lhs?q%o;pmZ3UP zMut26I-%ZYXAdu?PrTDf>%i{z_imYAU#k&X(0q*T%ewTUK9+feJ19&!cuFDz$Kfu< z-lL$BguI!uGe2ze&H0JKfs4G=gH-Ze|FmI~fce`=JcIVJ9|G8A3HVYb{N(cWz4eU4 z?nxH*4L9U%1>wp!CMc$KDz42l54Pm^tJw`Ky1y%X_yRdJtK;b%aj*H+*0YPRn+wvP z)!k)D9@*ENzl}{pvvFtDZYnS;>o|q4>d`^~-NQt$t(<;&bsUa;+WdZRWy}Hr?q-@>SkZzL$JaxW;Ke@$ zmG-X6VTo+}ZX*4{6)&n$`P3iXMdG|--`U*r9~vaUI^ zuA4G4Siq(J)KN+an{`ofZ|#(vs&EWjqj8-N8z#^~%yzZJS-NuVT7%73iJJl)#VQA- zX?Nzj)3fdGYbqOD5%A1 z^v?_7{MO9cn$tIgloa3mOo}q54b^-U^03F{J2OeBdY9iSjQ691S76PlRVG)F%3elzNM- z3ojsRi{KwhKm^%+_%rkW&I8gPVrf9_C^9i({N(@A!Ms>9e!M(zJb}yz9)q+?;dvke z1bz`hF*;9%1XEMV>fv$qMoN0nC6nwE6`sqk81WC6U+Lek+^#r6SmAjPg$(R2B@-sY zbIvFI4^A=wqLYCf)nryM(Es0HWeph}JUCWIriPaQ9T@#b@<|vq22`sjV}Qq@lV<;e z4nTA?nAt!^cNRZs>=wn}K@c+I4(wm((`Ks25JDIh-T*LTova7}al}Cbk8QNK{~{!K5uRF*ZCMj+F!xf)rT9AmE_mr2{a9lN=#{=MmFJ{Yyau zk(F2mFr6In4F)eh@_z?8fLBzA5ojXx{m1{AM-3cTVlm)HEP@hF0xwpQ|HHuus?i}P z@q<~FP&z<3`0)_nOoZN`z(^(p1>Or_5i>&gzwY=8Si%Z{27a^rwF7n>YzItce1fF| z?N|}M@SOiMc+7@i#5r16&ZvD_)VG&vDT!e&Lzro3q#)=Cqp1jqHK@5FX`{H999_+F z^CrCCF8rBp68>^|BBx1nf-B1My!FiDm7{kdH@qXUUHQ|!{qPlFfs(M>X7;WR6(_l$kY2QFOrNl4)o!$xTrKX$?2~cZ^_pL#DqOy9 z_T4O)b;~!z?V*9~USBtKJ+2Q~o3m+2SiLzs&RIO85iv8ga>q+GC}}RZoj?c?ufQ@J z8-C(wPhg1(tpeNU_R|fJ4`qllwcCva;33i|v*@_rJ8~{dgQSFua&FaZ}#) z93@fM*$t8o?C&OfIxap7X?fah%Q}q>{S}3|#<8qV`xbRCr7t8}ISk1>D2~>Apx*oX zTNZ;x)#HYMxY^Pzz`benv73I|jXn`d3kd{;w%+7R9fjQomN+BVxNav>jHLu7j^~HJ zoc#3aerUCR%rH&(bmxRtO!SjnHN8UN+tuEdlYb6wj-v?|4IZxU9o$*f9W#j%p}uGN zsA7_QF2ki;kfg;=K_f(zPp+w*sc7lTT+!ti89A2pIwggXHf#xC{`{V5id{CLE@!i7 z)kygL&AX@<-8ML9^`)AsOP{nE+3P$;9$F|cr%5i^kgRfYa7`)l;zp|+?Jxd(dEdG9 zJfliey|=Mb&)RNp<;YOPV>&?0#!BYKTtP3*N4hal2f1oLF2#%f)x>%vx_!hXgHP!M z>UQHQCdjjvZW8ee=Ms`2;-3ed=YE=`lJI4$^aJ9G*KmOb4y_X9*>Lvkb^g+XrqK{h zu3MurF+QV%1%%Q=MDlB-hUnp+mgPN$xo+p4M$d`#{iv{iX3Q(;bxueF*tp~DAdyYV z=NBEVC;|8lF^D{=f}W%3Iy0nw?8;6=T=)YyHye*RXQsl0K)z|81J z^_U*n+ddvh4cr#Jjb!0ThM#JEZzPH&=iIw3raJ0GRSRkJ53EB<-t9Id)#Tek3QRN4 zqE+3B&Sm&>)ks@zpAC(92ta`A0btm6%w(lXGDc)7A@Tc2tFvscD5QvxPyJcK3HuqC1IB(^+ zuc}D3o$+Fin!VcRTzi4O%|~)#PeQ|eZ<0^lEeIyLg@(wwmkhg4S<>}$pD!fvhN{^) zc5l%hv!9Iber_%>?cR=MRP@rrb?^{qz7M%;sisCQ7M)Cfa3}hLjWLsGbw;+;t!TbQ za<1B2dC?=dWmM)3Svna?&9sc*oapLhW~o5W_enJ3&Lmf=my~o;WJC)q@}XzVll$>B z)zy^xq@}uyBUe9+qMmzhCsX=zuWi5*AV2a$9VfiSG zvUls-w6c%_{frMAb``a!9y5#y6}j{)8GHJY+_#sz z{4gy#B+tG0Fe^D(@Q;X{I~H7NW?77<#2lFRs4qJpcx>a=Zm@TyYYlqPJ<|N8s`&J0 zzpd6oOw1EZ%C&xXGxxAp`a$-F+N#It%O6O?A1;|6V4SXTj~XtmZN9U<@=3Ht%+=0K z%RlT0mwlhPYqrnHtcL;Bxpw9~-v+tSP8i{0FF)(rI#ttGr6TpPOC&ZEns`!P(bDXjVi*(xWmJ{V9y- zYdD?#sFsJQJYS&%QP|L_`8JKfglZ5WTR!ui0xsg>M2zc=&oUGv1N^hUsra84UIW)& zdV2Futu6?fGH;mW#>ljc_^Jyf9ellAG99S$m8UjI;_yM<>Wt)Z50&A?+$10AD&@>u zFbU*7f%{VU8K=*M;(0HRt6USWigZNc4v|Blt1XRqLdrE29N2lyQS3WW9aS@`{nFI`G z3_E*w3N)Fje`;uCC@LE-YZYh_qz4Q}KIV>2Ex5-z!yV%3F(sss$6J5@nYF3;XQKha z0#BS{Nw0?jTS=FBD0E-J$ImuBH;})R41%=E{A}dv3JO}9Yku?Y5sH{8WRZAn9GDMd z36kl?bnch`Tu(6l(-Ksa_!avaqKM1|G%1{CN%6`8nv zE9Qv$^4HI_o$s@C`VR|gyes@x2~}Qq$D$Z;eD?(hOI>=w*fy1(u1L{eys;PVx_|oP z54v#-& zSlFei5t&#ulm3}0PBJPp44a=O?|H54B@o>m#fctd~RWmZ@&ZEmtrV zUR)wU;o`dl{1OeZpt-Xa@mk5PDD{My zvSlIe4o@DV-=%NY=kKexYL6>5wredvx|zqcHF~LTtWtpY{`1R!a*e*F{6@7;c2_Hu zcH)?q-~OW3$PLQyHXWNw$r8O;6E!Q;&VHI8abi8e&6=19^>l8Pci-R0VrBo_oBNWA z@|~=moYdS*neMK+z8c1BrjRPXvLPRsePsT=Dq(h!X>Id^A9-m{FPGB#s(Ywqbpg0xUtNWh*}DSur4Ov@`~-B{4^UD>EW*1H zu})U5>be~b!+|f8`5AOg?^nwTdarphrFqV{5bblW@$yb22!^aO8U8pQODXyK$LHAf zr+V!s%YDpM*Lgplr9hli_v-qq@6bdoeO}z4ez|QGIC)J}bZ>CmpQzaMfLAS6;vn)m zPO$T9S>`v!(Us(wW=YMZ%R7&nj zx^qQaui$17Wmf;MhrPhITi~ba1Z#<-{wIw(JasG%J=WymM$2ChNP8QM-Njn7Dq2uV zfyB}@2ju;G^gkrFIS_X!9O-?+$v((#tKy18yVCt8&-=Ugb`#7sD5s!!mQyz!K2%zr z#-mOXPbX>I^MUyHG0hYk2cZ9*bh?v#Ah^xb1~E-iRYOj|{Od7Fy>DE|sbOjSa>r$W z?kd+lxcuuvtiz60UI>eUbuA`L^VKID?FmB{mv!xH=)8N^qVc=or4UqC`m43%P+WDw z;nBtA)7&oJu1mX&Cr`E+?kR}}7}s2K7#$vOk1RfmHYL2Y;gK`8I~ZfpJCHr~b0w~; zwyL$?e0`mM*nrV+@yfDbgkjm)W%tOhp7Il4O`lvU$=16nVNNGW$xd^HZgUW5F$m$4 zYBtz42(*r8|7D@U5xN{2;t?6A;#P{Y{eitrepmkt=Wi~N?--!IRm0{ezol!MPq}NO zuK$cARZm6Y_ERv>PJQyTuTy1Rf+ih?`i{O^A%ky|Zg$JXgc1V`O`ni9`q?|u<<$?~ zlEPw*Y)bp}*2ONjl8n{0?ospHh}h6WmkO_Q$MaJWPcF2B`%#*{|HyqZu{Pt3-fvD6?t1m?P&q@jf3rtth8MO|$@|7nL4$fS2ojr`SEtRAjou;^0(Jv#p zVD~K{G~z+*x_iG;Z#i_d=wok#Ag)(R^Og7Q_i}OQDzT)TTv3BpBtI%G`ks2d_m)4O zD8*+?6-X6kYfHp0IoJ}5z3x3VSm41OE@ST`rdD}^$8(_ z8ZHBg1|o0nv3X5gY>p&xmW*|ru*YRmUl@=I9O?V@+vXDg^J6xkc;-xZX+H`_8hKAe zNAiIgvd&(!>C0P*`l_GnQwSO?uZ>VRDlRb#+i+Pn!6s`p$9&oPp#jg}o8Fb)k3$zr zwQAJ-T)A{FLceWdrAih|oQ+7zAW|+5`?DBR&r{Cr5^p0g!{SV2R6g(`E#FYLHPOZ+ z-ncxUCY_&Vg*N;()#K-B(vp24xa6q;rnt9;Qy%{AgGP^SUFyuQPFx>a3-Xr}u=x~p zEqc0LUG!F=V_{uC$w~-<=rXU(m>i<`q+HPo9ic2b81RdhsPOc0e=M_-%b&S89rmPAdAzS9GE)E2bH?y(s8rD(fx8i<8}TmxwZW@|ELRmQxGmX0qYzA*|$%P-8EdSW}{$O2-&8~2&Tj%Fr82Xsh><~l#G?}1{ zpk$MC=7~oWdiad{G zi{+kVuwJ_^+`*|b_x*Ou9VWfUOZ!11W6pj@OngOduQu3-Xw#6pdn)H62%HR+!8~ID{^PL4l8uo8283*s3C=Zyt z%)hSTseV{T{b8f>LiMe;K09n}FZUB$4EBsMJ1)+jL`GJ(6q7mnO$?4%adTZWO$StK z7uOu9v$cNJ-F)?4jQ>%lnCcC$r`LtE^4Su62UX2y)ZY$12W;FoE`<4w0( z5q~y~iffj)sb&15%kz#re>CpkeCBk2$-44Cl4{`4xOilCyAjQ=aH@AJ7x_sdF@vRw zQe)Ts#eBw9y1fOC5sYG_S&vqH5kJ|mCb^=`FxPIq77Y-*t)qBD&@9q)Dk|S(=XaXV z$=hhGlo18MgUNdo!==kDvia;g)lAUt!9Alr%Uj34-nvqBnNBMkeSFzRj>~(@nM|fo zXZ|~|Z#LjrFLqZ??R|&fB3k&>pbcMormlHAdV}1YU;cdY9^Ud+BC=~`%}>in8nm2;U7N=< z%&8UG=Q^-?*!1;2Hbo5!4!RBp=-w00iy|Z^-oGoih&5?!Msu(md@TwIaCbiKJ^yrq|)Ot=ui?+&Z@1qtl**oD3!lVsibi zKwFBpJL{5CWr^6GBkf<%8=PU%%y-6T?Krf#L5wYYh_rz&Ic`#N2#M)mDC!^{5t z?|$#AzThdV3GCdzu@Pm@ySk;OrOx`=faud>z65ESlUx0BQA_E>{VB1IJw^ZDqyDh$r#UXcJT-|_=7QI`(=v7U2&GOd>bd+k>k1i;)@S{y9c&K1ax0c z8NVhJ@jlXdabsnitG~T-MJ+EZA^aT|5Bs>sac057qkNq9fqGf02^Uog>yis8V&wfF z=F3p)^Gveo8d0xZ@cm+n^D~|hxxdfxWn%UY_4nW(=Q#!?(tEXEaZjsMTfX!i-cQ+o zea5z-_2m-xqyZT~({0^x5>y9FXUH11%#9`m(+m9O47X_8rtQuK)5>fc+}5h9iIP{2 z41M7FIx4?xG%6(bTayAkfOGWr`1ybZSts>N#Iw3LIVZ+m&|t%En!s}|g>|}?hJ)68 z<^`)7^F1o--$ZS9WtT|4sa>1+SSuMqT`wIkx6ku#5hb7@t@I_FK>H6pR!w-Zr3N?T*@&8cc_Ep@2k|* zR*LKqt5^~nvQm&8sagu3Rn@e;b=zs*K+>UmwIT#?fU!95Cne&f?|-oNd~-B%R~NOXP| zn3>a{;s}c_n?LRGsqL%@m%kM;>uRkoFF4Efa(Z;SgN4?#=bRX0ncWq;D{VbjEF}8B zDZP??<40~@yIhM!Xg-VypZ=OK+U{KATohAR7TyqNqFHXKh*MqPT)=s{2FUlBU-`UG z8c#p_=1FDp;~z83U$UF7P>zbd_fc+GpCU~EpgzkmS<+B(KfJ4Z3rQM!I#8cJ9_$ez z^2jT>kHsTx3c3N_FQ6=j*QI&Lg!K899BRo%sT5KY%`fOBUH zh?#g34KoL*wz~x@B1<2bHCDV5Tld%vIuoj6IP88_F{?6)G4t&BWS!7qO32vXNG7(9bemo&Gxbx2@Vb}|mU^43$JEYmi#D6x#7ewnBPuN`d_Q{Rn z2Cy=W+UpMAqBdjO9G5r4Y%!mO!Dd!k94r>i(BR1}SM)kFdX1uUImGj$* z!gw}FstZXAxtKE=kD8R{k2)y`e;6`cr2OQ@AHUpwoc$_Wrmwf$yi;gOz8?MstU zLq6`q?}qYT-(QMOT(x+C*wYon*!KFV4#%Q*e@qd4oNC{g3TuXbKA!GFuS&UF`M3Dm zQmNrIf~QZ+2#Ib`7JMEE3D z191)+<0$s#;;@p9$tf;`-#b#+iDw>>@2FfrnCi!@f_dEcVF`2dZqW(bSd{#d-2p=Z z^iUm=%XgYGbVPxn4>ULAr@xDxn%L{PHJNgWKWww0?`pR>Ip5ZAU9V}cK@Sjej9eHd zC20z?w&xcYm}NqUzZ9;BO+ILIu-7-qOc-ffq79{Mu|dugUVVwH9?s#m@|t{WSmmB9 z7?bVbm_jh;iYB!%lIAQ$lAf<3h$W?H8mW96xkuhS7@2$~A}+jfvz~)7SkIueey0~e%R4N(M!!i+qZc_lDNFLg^Qksl|C50<54HE+ zih5@e8fwhJ<+5d8x$-}Z%f-hG^SUwE#=GcIj+d+Bgqhq@y|ahaZJB?(oQ}N`5b&*+ z75zj?pZNF5Q^vL%m;=8CQcf~`u4BFUuO1WfRB{Ulo+bXUV4QTy9a|^VG16dJj&SOI z)0qaN@7Lbq-t-mm_%1n_AIV2KSl|8Xa{jl=w$NWCJ^B&Lkb`5) z^H`nVv$r4c<=g7XUC`EA_$rdk@+D(*Rk3YZC{jX2SKa<0hxk{Huxzt*Db2ued4GTL zAJJ?v?aFKj`D~m{KsCEQ?ohxss+=wmSv|V8F1ND2o=~(T`S4|VNO($-&ZT#Z(-hY+ zCF}&juRoAxn)57w@d?Nx<3zLbx`ZM4d;8KHgWGGOT-N0-5V;tVzvaIM`Ahx1XJ{GW zjxg4<-vlzLPl9)4N+q^Ssl2??0{*Db0xF$_!Vuk7_v6@MYQc{S#FhQ$lYH`Zj)SJTx{d6tO_OiwZLB(G)&hjOD>9*V^AyAV zE)Ff4GgAxGOXY2aw2H%B+(JSN3j$jLCPsartIc=r+hwaP4N(oU$c`P77TfP!{Y)|G zBV7|$aGAgS#{@@r?5?I?l};UG9UziHWv!B3Pm`y)oz)hfpxhYW5lnfs$^PpiWeRP& zCcsafE_Lu>kW@?}W3pBLXICBhVLgEcPcTwDfa2ZY-DZS!MC4tgm?oWh_ZYdZZdc6{ zOR&8nvDYYIB6553 zOsqs*fDB6hy7LM#acP4-wk=FWAUfct+A7Ox_vyNTWGx>J)iGBJpz9}^$o7+2;|`0r z45Myn<@pC$#Zm@$=0}~{2S{693Jys&Na|6IUE-81++yV2w$cG57R%qWHjw!`=s5xn zXxtWWeIr*baH$i$HEc58gv$SZRZ!n~-{Eehxc!NyX@jPwer8-IZya?h=d8wTSo`?e zZI+6#dAHTZM6ovH6+4O`|8Kor-k`zcp}$x_Vy84mrs#hB?6PPteP_f~mk~=DfXI;h zt08}z%mXsBSK9Iz9$v;oRDdMg3u^9^K3uJ7(!!F~CdCCwqV~5$Gnrl2`xpJ>e#O@0 zB134LH(zKjIc-v=ubjC_LDnmLQ?T7waF?DU3fz(S5-P~`LLxgi)0xONwtGIptlB5P6b|3d$uvnmbrzZDFV4W3 zWD2F;$(Oa_of6ryIHX-pA+WFLa}i26E}37vx&F{$Wf<_I}}WL$-XUXUpc9OuF?Nh3D)X*ZSP{--#U|+C)gcbln|XnF`v| zU_33#dsf^)v>PMOvVFY>6~99i_TwU>ddUcb)A4<=4{QU;L zli=uWy-sC7iukUV(hubtg=dTl^Ce#gY#PT^R~UmYNRIs&*b-7}5RXXj@OEgYkIOPl z=WtUKYH9U5; zyV6EWO)=|*L~?U6xwRA0F8(W2|G@R*LFJpGf>=+ihGQfb{d zqt-T~Hj*_)T#9the~sXf)=FE~KcIgQRVTBfVO4N7x`^q(n1<^9vvBVv>35Vy`(6(d zHOv|fDC&|E1Gk3vYdqFzcy=TFtE&u4#G z;{TW_DxUCGN@bCgJ}1SK>cZ}onz{Aed%>5mPe*c;^b)4Mb1Um}mu|Oo`qYyLs_{`r z+DpC4;v$+gty+nX$R5MI@MKJr&A0>oBtcDVspOf#sjbRp3is8pT;0#h&IWDwa4R}e zlSW!Qv~Ob`_bT30vWvO;R!5d`cb#lkQz~Vd_#6LClh_DX3Xs}lFCkx~1JRIMo@Fbz z9(d7{g<#9*VrjJ3=JbHqn)-UzP{mkO5j|aNV})N{xwFZnVQYS3?V)$0o5Ah#5o8xc zn@$KlNL5Pw6_j=QIEK?j$?N#Va&hVCuLJiJ;;OHc*SV3)Cn!y>mDekXij19g(r$C6 zyDcWfBQnNAa;la|fDz()d+F{4Tzkvqe1@lT7i{uc%EiPJH+FYpW3E}tC3y9%@Dny& zS)n(t9-wUpzIyR}9xlipFY{1bnk$>$)2sfJWhKs8b3zffvc-iK=WT9Dcov3}G<@hq za6*u@gL)W%%wB$^wJv2qASN)>LOru;c{wX^NT~6e)T!?wQeTmQ)WfLt!5P}mOXe%3 zDP<#nXMNfYY+@;PFXac4)BKiKh_7pxciudt6oSf$=oRR%{H#NA#jcTA z?EzVJow6MvkoEf@4E&aTL8yVq{=%0w_SRMMvQ`!+&P8I)YbUaVV6PyqJ@!qAuwnU; zh5^lm?eXl61>>r=I}iH`*CIoD_+)h3Shu2tckCawvwa_6n@CU=y3=M-9mKbMJV(F6 zV(P&aL2bkkelGxB5@Yd`&p-6hdZt+OY=FM~Ug)IN_pDvvLs=mZEA@na!3i94ECAV_ zPHOD)ew|bEx?aU7Xk96V6OeWWxr%0Uy;gVjC1Pl}fI~*c)YrT3_+Ogajk#xcC=~9i z?{?kW32I9Dv=_GHvsX}VAMThx-o<_HkA7!zjbP$cj=Pm)M(cemXsN0QCy*QvAnTJ%oj8f_PX6L%EWDtqMV>EvK$ z^NTNQsI#o+*ECVEnOeP_LviD`3w5b3M03_W10NS?eNQ#+{(^p0SB4Q4R~`L3n}sy@;$>b&5pK9&D`hSBZD3g!B#`;0{_tWN7B?Z7&NZs*J)B0; z@-EjkB4U?a(Vt8EcBqP{g+pYUYtQC&iP}px8B@-E8pxcO^(Um4o+S4+WYem}8#)%b z<-bQpOf6v)l7q%)tM&K8J1)^*;^IEXbav^2E0K5>c{@sVM|LB*E{m=Gyuuzm$tms} zdnfteigJwfmIk&{HxBoQfaHYI344;I(I4+86@h9xU@D0EU~b}o{S|Jc`iHEx=d^e9 zfZXlThu*>iwz*--dP>|g|Eq|CHEOX%JHb0Dz(|hP%Us=(*=MO)C4g`qYyMUHyAJ|V z*({!G__p-rJnS3cdETM2VsN9SsY9lD((WZnoTz7-`05VMv(Ov&unYQWmCYp^bJwAV zix;Ig9%b@u$(X&k?syDvhh7W4Ai1iRpA-8g%T^Rn0_rhAL^KfcBAkvDh>lu0@T zZ6@A(ong#rH~Dp~mc6#<_q&nl_nTv~jAhl7Tn@OeK9OHdt?5&|Agn(MP3XXQAiI z;_!#GIm)THz;QjqHWGi}b=(Z044;~Xo&)yx)GP>{Yz5%+th3e#1w0Rj4MGYg)HxvN z0o7V87O1YpqJgYSh*SJI+J~1B^7#Lae9=_EgB0kv?72ED6-aA~NX8$I2BB$(@UdQ# zdk7Z5&>MjOA|nta;F2@q2~3Ah-O>Zwi3n=2-wk03!-3D{Lb4dZ3m%A3SbJL^#C7f& zmI2^+iX{W=ybuF;t*3<0d2+l~5R%;UUwQWe5hQ@R2Z9V#_eJExG9f$Yp9doPV4k#e z$X*!i_Zx^AydaKADi%C)6tK{MWdyMy2xa&P`@fw3g$@W+K4|0ACbh5U;`aCUp83)=B;pIxj60jnIUF!G3{YPyj>Eu*_grECLOmDu*@u zWg%z)@g^)efJ#F2;{6Go3onB`@LZZg; ztRSRt9oFz4H^U)A0Ur5?VLZ_PS_DZV2fDnmq@Z5`VjflloefvS^Wc^LJt5s)hadw| z+aPsg#RyZF2}&}00H%lcAW*-JZyO!KVuex3WGOAz&n zraxS3^3-NPATz?|d1=tRxxa&w()FE(2GL`H(ssr#27o^BV$dq|l-!}rfM=uR@g?#V zH8X3k3z8I79(uM|T|vebxt`T4_QAcXKEM=93$|tnTia1{XB*Z?8WwM*mZP*(y>cof zp0@iW4S0rLd0QR6ux;Q**K%>`x!7!{^rp|}>}l5%b(4FTMCV)VaYvt=jiiPin+$#- zZw$9VU1n}?w_hnOf6G>=z<082&NZhYd-$Wx%FcfN(h{9I_+m*J^O~;OlVJc?Ahu6x z`?N(={6V6G%ca`YckKwye>;{;N2G$+8XDF}(qyeakMTYdb^;e#X z6ot!&w%O0<@=70PAvbs)Hu8LCJd3)iBP@+V(~*c#FAkc{+QN zYu(I0ToIJ7J@KJ^OId~9&dul3#3_`9j=Zb1BGj>}K9_!S`tFHCXs~xxsQd`Ii*|^c zL**WSWua{IDnj>ss?%o8r1>^cUsGec+0iVeOH9&)NtR+vOo5my-U!bD&>JxC3zgT*S z$!I56k4)dHwVs@l&+F(sB(+`}TOx>yx}Ea-`>dY9ehtyJN!8HEbYq_nMjygbUrB;8 zPl^6~r!X}umFdacDA8X`#yovBNx9Br$5ljhGpU+=e_5%T=Q~Mp+p{u->#md+EmYB? zBdBX8r%7w#x`2+#rw3#eGn5CBI81d^PlyRwIx(p_IcBVYg58TEO?TaE@6Oc@nMj+J z^I;rQ>Ke$?7{86HbxdhaV)EVn+w)$D;;KW>Ydv%lymS-x)C!A!6gO+-HXhxaM?G&N zc>amk+xdPRcjxZpA@hfWpMq1T-~q+gB1J(wx+uh)^0yR1T?bzZvB3Qp=mwqi1_T9MdMT&=SN(+RB&3}m{QVqp z<=^uEuV$#i(f~jkq93mmZpBM&SXQvG9ia{@g1ab;5#mGx#_dqmX6{1B;s-&89)uzM z0z&%+-*mv@LBvfaLTxAD)RK%Hpn8hL0(#2`Ry>7FnhK`S1NZ--j3psp3M-&jh=F;Y z79*8_?R+F9VAqYsf}Se~VM6>|ryaBmU^)!7vGp~CDhWi&TD~L*a4uuT0n;8V3XJ`N zh=)003H3c#PT<-%#5??4&P&9CK*kD+571wrq65pnBUA|R^qpU*a{#3{iV;-VMqI(m z1PJJnO7}jXr~!#SNEN}azp7v|@SqPX0+t^k67iEk$v=pABK#CsUt|!H35X0NAOmO# zka(q8J=KChy#Sg6lqW=Hz_MW&-L^;(kPU%cgh}w+^c85^v9t!=Gj@>zc?8oV1qmSA zs8Ec6=?c_yaW9~|m}+Q|X0T=mV+Z`An*mu18}b*zB$f&2V?wUrK|!V|0gw|I!9!-` z)?d>s$Yp@-V`v8@#)V8G{x9?gd(iE2-oua!Y59>KU>9;~qm%&&A>;y{spK(I1z0*n z@`L_ok*{Gtl0Z&FOrVn_Qj-+V4adnb6iE$k$|F@^65gl4k~|Uv`l%sp zV4sy_LeZ?BhODB~Kytt`VeizFqD6slDKt5ltBWKj`!7a6T_iIQISOSSfeBLauc9d^ zc#%g4I^eD)atY7591F*e9UQSjy8exk4btteKD-T)M<{3&*dn#@^TG4Z$T?Us6iC=r zOrY;Ir1M|dH~-`Q(IN;ohcA-vKddUigMMhM2(glbqy;2= zsY$_e~6&@(8F>(@GliwqeJ9r5oggpgD>NEwpHhc=pot3sg z3cgN6rorP*X-In*c272P5C0;ohxy+OK?0}wa2()71*r;=xA6975#;>C1DSzO3lK__ z?|83*P*4Zp)Pd1KDL@8RRw5H%z!Q`tf`H#FRs$@oLz=@}1o+(XV?$$AvymCW=kaI9wQXP;%%fDjBoiD6b`(>0M#$#IDQ61!NN0^DbWy4MHB_#CxxN} z{1za&)(6N7@F47!?ggv{^t-vpwSQp1i359p3SjPpu$Udes~_-lg-Q;@tqdG4V#&dx zV`Lw!9a=f(z*0h#@xQq}v4~{`GTuVDZG=Kq!d!R*@u-0=D#bD0)0SYYF%_PY~cK6RHVT0l5jPvmB@myd`je zAeqqNDK6A7ejME4M+v~SVCM^=AOI_ca+m~&T!nx-2%&snDflG^K z?gQ|_0gLaUs$l;ROhMHM@}?;Gpb&a!IBX-{piUGy9svzlSc)?KFBvb66fVx7bR}v9 zrgx`6YZ7Xete|ZjDg`FNPKW!GL=!3-Pl787yxJ(*P;lRbn+W7>8bE9t>cx8PsAw29 z>|r=MP|h#o@!(y8Z=0Zg7fKqI57!mQ1TwIzALWR*1BCpkhQPmo(!2PtAbeB*$9xQ6 zJdK*c3&R&1C|ZnQzzpg+>;bqaLTi>Aj9Wmd!BgSDK^;;IUj9Ia8WIUgen82>i3S%~ z7&u1>Arm;Zg5vnEK1ebdaC-`Jo9Y_s1wJNlnS}C47_|9}BKeO(xaTqcUDX|1e;ooB zBq&?X0$b#Sq~Ojr>I82r2s!E^9NoV~!WK$E+&;A7t35)k;w{2AMJQa%;PNr*8ms_j zgu0ywSWJZe1g8(41VW?)7%JC4nZXG_3>W}+2sPU!S7KtY3V~LJIp7tHF9e_<3Jt$D&7Jr{a?cN&!)Dj~dPWHx=;<1;5n-9U0Ir$bY&1*>@m83NG|b zSROusz zW`@%Q9;E8WiUF8GsM?Y#py53ZyaM1V4HhV(6JgfBB^B@6Z>La!1Ju#s|B2OkfJz)% z47a4v6rjHjdJ3k)Q1FEdj5I<^!6Klp_jgwW-2M!eD=Kp|5=M=$%76R!C;>GB@UTLU zK;D4s3oHPte5J5}9vl2Z!u!Ya%3r_2sRor@27r=?ni7n$N6X=>+ut4If9Ob%-V-eV zOHlVkTmDCOHw85Zuy~OO0j~R^S76XkP-TFO0jSXK*%0x7d?Dy`7$K~9VjYbIx5Chw zaK6Bc8YZ>hM#GzAcm?ArfSn381E?5@j>Jb5&Tp9fLWPrcwTb{Fj1g2XLlfW&1%BNq z0)LCe4PiI^Z_I$nA0ifzdkr1)ciH?S zhZ_98jy6X9Z{=MGYD!><0_u9H+vrJX41{c9fTQ{!{UpE>N=Vs@ee~b`T4Xwux=W-O zdcb6k9KO_oa|)tx0t_c;m|_%13hi33)CyqE37QKI0hHg+br+Ue1Y{(`j8ouY{D(^& zG^NJ~{^hcP991uXp#@y1sp-I3b_^+O^j{0H)O?@_H|E2C!VI&r0rmp$B_9|rfcXxa zEFq1#2>2Ocn1Ot03=&up!mQx+!3#f~K-qJ#Rdj4);hc3<%ZMh)4#F zY>9K2W_UJ?WJw+K50cBe7I`;}Iw8>s#rq%?1T*kckTYTw}G9bhxN{+XBIUf=QF{pwu0snXzDqnx4fQMli zE!dk-*ku4mPG~Xx$D2=am|8qo&?ye14rlSwPjcw;mz~-iWJ|=@!Q1~^8JJPnVFsC) zOE7XM2x`Dm0!9KzGQv=SJlU8am=3j+e~?pgK}+*E2UGFy(vT>`Py?H}e=WlAYyiJz z3_EC=hpGA-etZr?OfqWhHdu8lB8hc6f+C^hGDjH4fHEJ{#Of+_VznR&) zd*@z~f8Kk1A0IlWpE+~pOxfKArJ>%H6|ypB)F6@&iqW}gm8J+og>Ci8@(^P=vLP6I z9;Mf6nz5u{ZVx97Lg4mW+ckYzgizKdsI-xp!no!i)Nrl@T(zdvdo(XqCqauSa%PFf zg?tPJf3E|YEQQhp%B~7mYN#dZ+M}9Z7^+zn9m!dx@#A{_d0g{5iyr|P#FdRb$CYI@ z^X-e8Dy;WWQB);?<&EV{S$8%2nOK&35~>*el&(hPzNJDSU1i5pqaz? zl_;u141Lg)p-g>ps~8QY#h*0I7!1;5IlKG{MrlWP?P*m7NGWE53YVC4Uk_+S1)I*g zY8_eTz~%sxT!F+yBAwMSYU!qf37Bmd95%+H_%()^?)zy+TIm8-zGV6*#Ow8v+Qt-U zg5mv{yHrc5#^hD7mRf4M6{5YvxUj&6hl`oCWwmvgETxH{NiwaC(1sS)UZIvYlC`5O zW#Mfk)2kc3O?w(@pRg(5d8T=vYi7LGne>m;(d=qMUE77l8XdGIfI{g1_zcxv>p>!F zB6T`<(K@o`I~Yv`iCRZe=L?>$XG9}`qs5I(ky~OD^!_B{tQM=JT9}8-TWBcH8Dc1D z(@lGqN{;NVoyVs)FVu11QIol7;0{h-oD5Cp69Dp5SrRc#E0KcPS`DpDoJ^%4638kWB>ftNJ}j@I%Lx@~W$3z**2<16h|X7~9rauZ<% z$JmM5VXP}KWpPvzI7{nFKGnn6YyOS)02}i`RAs32hM}HsPS--iekJp4YOy6(O zrtpxZ%QUlUT7r4s$<%L$b^_ZgKrJEz(;B1DtiE4+Mqy*_F)gnN+8xr;nt%kEb>z-E z*cuD`p@+3Am@wu^5c-*VoY3A-oW;c7Z-b@c%v0JtW~$;=UQsMQt9`@lMLg7?J?285 zM>S0Zb=M+|1h2Q_3BKJ@??e*f(aB3%>25N{(j3ryPSd-R1M#pTFGlCU+Rcoe$>TWP zG3t;zUHnb?ZFP4U_|PP?F^uP}4loj;MwQivkl2n!i9~fqUi+=1Y&$wYR-s_JPG`E> zS+|X{F-`kIcZu1-W)Y?%5U?AWgMEu-J#_~u(}siT*-9V1JISc4cQ(yT&@Ey#ETc1; zoW4dk(k+SUNtmmks6_IdVeZUq><~5RiZPpuCvmptgyq;hl>p2>3g{4e5RChIfIYzgR$&I|>Px4plT#>nr)lHe>bPHHSBgkX{ zxBFnxIirWMxG8?3t_Gtyv;j1^dN1<22bRFsztOoer7(kr5JMV<&=)<8Zl-{#y7jCb z$&vFi!S}UTliK@nv$$6oF_YDNw(dCXJ4B8fO9tHGRL3)Qbvg@&_n50&#$3#TEIrZa zZ)!AO7r`W;=R?TZLHc7gOLig%%e1BgMfK;YUraP7FfCZrvxtM&CDSu^{SjuY+BH}7dO9#o@Q619v4Kw6 zkze~_jKA^F&tmPWW49L5vvJDe7MQ-K4L*7=CXWtL)9n&^9uq7q-Fp~uRVf9j-TB8}-_puP=b&W1JylLv_k)*qortc6(>5u$HJkxXD$jA665HIHQ%)A0)WbJXlP zEX?IG>rUGDHCB{oa>2uDtbD*=R3Of^#_41f#hHhA+rGlUl>ef`smYH6U*l4F_+wQB-o?<^gI``q->VSiYylWG~1eHr|O%k>@a~a zud=XFtTwr1==toe=>Ed63e$C%T&F;yC@f6SVc&^AR4)0g3HH0K1%c`?aQLJlHK9uLCrtdAZ}fZv z%uMJ^5NA%Nw5j^}3{?#YHrM43M!nl`hJKL>qycThO9$4mk;F%JE@A_5#yo;KxtQs9 zqHoCzFne1|dM?tl8IHD?>Mz!J)YvykG|l@?zqbhfK`0{=-trn$)cimC&R2KSzRh%4 z0RcH8#8hd!z6hIBBEQ$yr#hJs4&#_6OcHxz>XzXsrpoTo*JF8yg&b?g`%Z&Q8&BvT zvgF3@EU@;TBM=`aFX(46MQA274Zo;&rUA>QLcN1QPqyCDvz;{7Z)ow%z0Di29P-B& zvBA?6cU%9PC-noC7QBhf90S%vU+LqSidetN?Lc)WOGjZahQ8BZW}aetQa*$M4WluL zqCe?RP=;(kFc=u>O>v*~U$G8B0dFCQ_}CkMr9MIDR%Od_mX*zP-llX{!(0R9=jdyQ zqJJ?l`J0k_4J&*o89Z{0>B(%|mxGkxUDMDZoO++$`7llHYw%&~W9B>adt4n&XVVP< z)CLpcynHBSjDLif8Z0n8Vy?z0^d}VE6t~K7kae51#&CgMCOOp3C7k$<$11ygo*{(w zZQDbJ3(Pzgr0n{m;kcnFxilWm>~+KtMX~54i92C% zCHY4U8dKnL1E0OYIgC923VX?^Ck*c?CYu~o5v{&9N@T_y7gy8PlZK^C38^#ZC6P^E z8#QFsPn^))%tW{m%>-0s=gt`3fhkUARn3Z$o)fUyQ|g={gQ|_ys3q*e1Y@Y_VZNa( zGhDi0;CoF-z`-N~=8`QFQ5}@MX!zjZ5SX<=2xAFS_o|@+{ZGnOLmR1SVtn@)?`bv9+S%ES#`ojm z$nmR&%A~=4gJZG8?8GL?DM`s`*(rU7wa>^*PE5+`mz+#y6_o-4DdDuImBKpUPSls~ zc6K$uK>gY8K<+#+lqu4LeD;w_GGtPI%gY_W&_GHZ6%+p&>@w#?m(s?DgOXCRqX$D= z^X%-57HNIb$+nV`CnMezIPUN7fvN{_U4eM6D<$@bkBms*-~T$v9>2Od8aXG)&C)R@FDHhe5w-?Ck0b zVt#d}boTL)Bx7UrErOlY?C~oS8^r^dT#J$ zBoS{yJFalFv)iDzvx^W&I(br(qOH?=Cz63WV=;z)>DkYv*8x4xXlEBKpvU`Cbno`r znJH;~+a+gZq^D&iN29m0Q?7vfDu(^Z8wT#OGwD(8Yv8hnaGBVx6GNzaaJ7zJ zU-Mzi-*)dJ-GeS=5itz~U2@A)Y{&S>X35zEH_FN|{PiD-40Qtj4(J{$;QwBUMOf)3 zLX^g3CTAgl60=j%(Xd?a*3I7xd_)W>+PC#x=o@EaU(>o~0Z%>}$}?@oj2Up= z1fG8Ib_0PoX~2v#ipI4Vkl2^Zx@YiW)FbcZHz^IuQRt@_fqGv z7I|dI{`+IQ7IDJqWX&54p!|;K{?K~l7GQ?CD#MJId zX`SOES;i!7Z_5L{_i|0*9Z2g1JqZ-SBqvmIbj{4@-5vvEkVS@=cP*n>Ul9I{ zF)U_?&ne6zFVQPa(t8gYkj!-rpb6Idr>KAih@icQMKKB7Ah#bF%DPi}n@~wNmD$n^ zVsjuiTCi|J2DQ+fr2|RcXL&g8%Gr2$K1eQrq>(_wx5d_;rSL@zyKAhPpiFU>%^-+oKE@i|lh3Fm-E%wLg(d16^BEe)saaS!FgyUZp zsabY?=Wd3I4)BYZIdaA;z2Rc+4RZdS#K(2t{R?wzL&=R85mADPbHB0}5k1DqDK)<7 zp%xo}_YA+00)CxI%qUF4%PUEIsK-?r=5q*0)uEKw)6w5BWIxdZm|F(*&K{JRoYWzC zDA|^2?s zZelLenq|krN}lXO^XA~|{yC?hc|IaSoJ}IzLftA7;=jX^Z`8HN|#{k8Ct3wLb~0 zt>t7u+E$eOU1&mhvGh$jGUKtq+dgA0wI+mw zySaIjlWz^Yo^x(6>0<~atVLIJ6s%wL9g`CB&r%BQ3!h7!HXQ(?2rw1h*?2u;XqCcb zwaM0OV{tZI?}f#U-3SIR@hcW`gEvr@k#H(2nr) zQM-6eTy>w)MJ@z4dNpc4eLZ`2)^2E49&QyAdzbypt>n{dLn&rNYOyb0T*GJ>fl*lt zB(}MM&X{GFGfeJ`3N+ zl(a5n%iZEO(7Ht#zTdnJ8{H3bUqY@Jo_!utxd?|jvE}iw#~<=s?(ewlUOEVdgCJIQ zCH~d;33L3vCTgXKn6$mwVLG$_fE3kKU=#j=u_?4%QkD)?LT7$OOPyATaxv?;{Y}+I zV5$zA7bNjWsIl+NAex`2Ari#?UH)D*wuIWZD_SwL7pLoIf?M|+Hv4DR-R@Nq! z`uBOb7qvlU6k1{g)DC2NIk({33M8^akz#6jccbW)(w9K@5*`qTNv~igQ!6M)0)`lQ z2F=_xWL`rMp0HU)Y%HrpkSC!<6YGiHljl^I`>aPrrjffvD3iRmhLWtX4fs_bTm=EK z6In;}*f_H7y&;$+6c`*^br_bBEEk(>7otOY|KzlPPC_kT74<57Gox%hri*!4HSB{` z0Xf@T&i8e@v~k-20}rA58VTJOU7yi;tAo)Tf9ZoVdy~ND@=7mxrRU~@@NE}Fm&hR@ znsM-yy`bzS(Crvf_@yAd8tULKw?PHa5ExEarN4I@?x`x!GCDSmv_<9ys!6uKhdj z@P<4Hp#sIg-j&Vt##+*oWE2>9v3EG8L9ebDN%v8KG!%6EeGpmkiH_^yl99w|ifGkk zN8j2@ovXq(ZIKT|ziu1J4AKi>-C_VPh|6obA}0sEJ^<47m`BAjs_i(Yo_WNx?N7BU z9X2N=-ar(4U}9`3=s9!}qr-X^`(@O3?RzJt@pV0o9_G1eiO0L{B{LsmVmdRGp_4Xm zBp)bv2>+-Os7qXjJ4ZWU5Eefv4imGPUs34XV7-%_p|&83n>E^U(B2Yb5el4(qz=3O>oG*RM#sfVP!822r&o$x{p~)r+PIB(50!et$)5z`l{oF(iS_Q z&RBq$poE0dN)+(*9*h2D(?7JJSz4cNB#-yaRUJXz8;tr$I5ID@2o<<57_Yp#9_ zDQzJ|43+se%oOI`f>LU&R=oRk&y}$0G;9)+$J;xMj8A@F8H1RVg27*vr&C!G3_o%3 z+COCIg{3l<30W@FjB)dn%g?|k$}Hfi=CY^u8!p`k|0_tb(SolUKefPj3z9cfo*fvl zItuu7J5TJvMSn7V=idQD?TPMLA3i7B)w z$^PdmaA(=P>13=VdE4J~A}>58w%w@+T=CMtmpJ8$3?%f#WD`=D15DL6KN(VXsEs2vFSh z;K9R=@8Pbq=ss}<`@@T=LF#)-Zuaq&)yXR&azauKko30kaIBv|qQtIa&&(k-c5Rn4 zuLHPd=RV-;p2{v#KfMqpH`0d7@qPJcIP8=hyh!s6vM_OOlQ)D zgXvt#)(R|g6H2eHu(MFDMuajtgY_;x*_vteX8kelZi#;DNn#*Q9v7Bj$VKU<4B1jr z;)j7Bt8JL-3nvY<>E0D(89ptrgVj-2@YVP>dtk(FSL=h&N?{B?*U4T>mTToGZ#*Wt zz6ACyz+N16?IIbvx$xjijjpxzRz>4h~IC$B;eG0C9^^1ke znv;u3=Ojb9Q^4&3SBbh^Yt7|QH;MBtExPGuDJ?4&>7)|&elZ;Nx=xZ$N{?4{+Xn69 zu(>BLp@+96FG8fU?iQ62JEfq!dg{Szekaarxn8QwBG_f$!wNq@L)$swac9a)KDxNr zTrO8X=)Re4kM7#wVZGN@v@4Tc&q8+L)&HCErTWIeA+6xdHi9GjC#X)LO8~V9QMP9+ z&J?Lp`;9QFYA;5H@b)D$ewQ?Cc(tnI@M0?&`xfc0eQySLSL+3fV-M%A_xaQ9w-|(v zs7=2lRU2_xYO%3RA|A=RAa(xUI!@lfX_dk#Y5INUE|q2a=$`Jm_yezlv%X|tqitXl z{VN0S+_xCkTg9l|1gPY(W-ud$^)3 zdgBjtY>dz&Ycf?~L4q*#_%oaC$6KAIH@jP_=NWkQM;2ww{sjD-`+7CB8O)vE1~KT6h~3mgum!4a~yY7RiTO*fDJ&Jv+x{ z*+1L4X??G{@{V7Ty-Y4E(H|QmUz%h5izCN`>|+4r7!N|zF$foI&_n>xTmP=vi{jg)rPKHbpVX& zV<3tQ{qj{a56;5NlWr%s@1_#A>E(QTc3d+r`ey>Dpi==)_g#tlNx^ zc89yayq6Rba^Z9>Xm$fZ7%h19%6*2-ZpV2FBi4MJ81za$Xm3*f$-P_f%4=i`u_*ZZ z4{n~Jjub#Hmyjc7&+|B+W5Caa7e%30pQ}Q}B7!d3l}*p;F|A%zhSv3B9!f zr{N(J=pnW3B_`hwDvOe~EUXWK=@@<0R*9*guy z0U^l9BK0C4MqSwTQ{^1=<}ZUI3ttHpFR98FS3=bFw&x1jlJDT6u)=l%z3tC9VJE0# zMiMSHOHwIz1of&_YIC||?N!`**&0iV)R006TN8J=Z7{N7{A>5?30wINz=VoiH@dIt zfXq*pJd|(I6)Y)Lt^<5O0{tZ(xGo7(?I|UMl5iDBIIv-I$8MZiYBmWE#!5Fcobf<- z7|DoWIl)DbU(k3JI^YFnP%%ICug=hMQ?>=}uV!YG{7>?>+5A|Cs*X@`JmxoX_zkP0 zs_7@F$r4N^ai$lInUp_+pE?zYd%nYXw(! z-$1E7E;Kv4?g~slZnMAmstc#Vfgq=;xXl$Wbu@27T$ocW;SUgYL-8SQJ2mXd2yM5I zf^y_*?^!QX0{oJg0m*8X2xwK6Qbh$s5 zt2jtBwz^?}v;}fs<5#ScrGbplJuWjnJH6MSJ`K}`smG3wQxg2>J=xVR)@##JxHwPe z0>!zoGmLd&!4rphOOY6K*dP&iB)=cbXmA?DHUs2a7|WW;3yj+zd#}mG;2U96n(Z0I zh0&N4vkFV*N+haBQo%_X1&^WlFm$ds=^Y!(c(MJW^F?vyA>KtS|4o(RMi6G$tPn~} z6bMVHku-ZyR_;kS*0$bSIYm{xkODwCov~}teAGPz{wQo2h~wtoRL%i@_91jKVLpCS z>9<<5p=D<42TW3-X?(1VI0Gczy>B8pkdn6#1M7k(6GzGU8f&y&ma{OugVP+Xj+e9y>3EXHf$ z9TYZs)cQF!q4xmLeoepbO#&pHpwma3w?IxN9f;H@XzT3 z44qZi!T;QAg>6b@k0^GA?ojN-LQ34%X@8h8b#0eCa8PmY!U++e|=rPcSK%__ZXVx?CGiIWl)|t zYy#zI_(ELzL|kN)LN->a-B(F__R@RO1u(9a&@a)Kxwh;YLFf~C!MwlKn_h#Exr4A{ zBf9*-6^3uS!lKupndeV`b3J(hy2}w6riLKv5INKWo;SR4R*tZgCmj|{o}HBscf7*} zwOEH7e8?oCil$dz*}ga{Pv3TXS7Il>r1$4DhCx(9IVjw0(ac=8viJ#xr0dGaAD-(4IpR)Zly5JW~HkAbXM*hu( z+>XX;A8!r71*%H*WunnXerxqNIv@vxkpj`GcNUtBtS^;h#=RVI?07FCMWOb7^T7f^ zm*P;2e0DVQC$)x7T)%BU^rsJ$h|zG+iQH*xws%XEoQiUf&f2>fABBwM>*YW|om*@nUbF({7|v!LwRTyiDujrawR z6^&uSu;LbArcHw=`BA)~$pM)K(1bqDBW`%t^RpmA1n5Xy6Zr`4muY9~HAL^fLad5) z3JKsufiE4LNWfYJw~3SOKsWBu}-74A3(JS zJuNOTI+wGcjQZ#xk&Hd=C{&xtl*1~nc)lD%aUGJBsOag67L@Q9e>QKAzxHDoBzb~H z?9hvm)`lHihgS&QXf8`idtC9rT~LN0vLb}YN~&rh39nM(`+j3e-rU*-_UwgbVg_7Y z!vY^RvDY>7neoU*!Sz>M9Y#|$(Q!O zD_^P|Ep;+piFY~i%WX*xPLA6V z44>dKF_c5&EQl}&`2G5ON4xf01tadly<+gxZ^!X(w~>qJ=@T^1>8fTwB3g7(t9T36 zu`%))y4&>wkG-M)T$CqbI{W$y3w*?-j`;j#(9py%zcy0p>jVleL)tWz$0v0z>|sA) z@?ZX^H6GZcsBs=fXMMQ%+yZGEhatMo0;5WJHr>;Iv-zG84Unn3mawzyDe%|y zQu&j_4|u6ReOE=p|Fl8==Fpq&>)hWAhZl0YLhrvu zsW@b8j(i26|IOkr^1w10UEER7vfVEG2W?K+3%S4|{IsRSt6C{|HzSiO% zF0`gp#4QMTTQ3nrU7%x2LB|fOR3d$N!>nOxz11j6%#!bbC-y34R|NiCfdtY(pby)i z(mRJ+L?0^!yPUY*xGUr)+sIwKS*0^r$;~2xCFBj%POay96(Dw&BArGHg41@Y3^bg9 zwe*gIj5({|5=Oz6g#4y zn;m5oByO>zca@rjuW5chv+H724DmHntcUr$pEz|`oK%V?H77h3+0m!px0J=#I`TTo0b0v7e0e)C84f1m zNdM{;6KfEd*fOa3_4rBU!5|h45(O=Kzhw-31qQMfyp2S5l&8BNF0Fj984g`wsx2yd+_)J!y#GV;poc51=-lvB$*cdytz?&(lEA0U~7>DnLn352`1f< zv&4KghrH-3)d~=KC1&^T7n_ls$zC?VI4RfYKOQ^P;uQwVZ0xg$E`O+FYLygNv3+N2 zl~~~Sn0h>|Bh;Y>tUUz#`g@WWsZwon;5}ZlO0V6mC|ZInbC-R)x5%sx?&z&xT)2uA z=vsS=boAK{CaP4z_ToPwduDi9>wK{U)7du8A{#mSseQ4#!I9wRkof=^qKhCiyfkAF zD;Ui;`_+CZEO6qxCzDB&o4^6h;Z1SM`czIdo2ql0*x?j3>i>Q6xjHK1rhphrJ!JdA(av1tXMPr(c-npH7gC2@_f zEN_gFS*Pv2)l~9u{LHFGYXu$Bsi^TlXgSV2lc%4I}zV z{08~eTfQSop@`VwXWj3+d;SZ(I3O1_-}LNT1Wy8jr?cuj{Hsqt#-xw|HocFLA90tS zTQ_nRG}sknJ=@G0@GlyOX)^NRq$`IY&vroV7|fX1=2^uBD{}U^6~ltYbF_6G^?3-T z#dp#cJ9?407)K}4V~ji(yzASh#x~^Ti#9X&)VT_gH~B6@zH6%slMd2{bT$FMmEfWs zi&Xrokr9PQ=#a4LFTMx)2^(?uSE}SBaG)&i&CAD=+XFWNDJxnKXIQV`JCQ3x9F3|? z)0Wi#dN+jpY9r*AT?&ymanF>6?2snRqe{)P!FSHHz#lc$(V0xnlpWWlOl|q-}Hd0ROfPe#%3Rzjc#iNs^E)^QZ1N*Vz$5 zUo3h?@ypQ92e^gVEVdV9PW?<*HIuNqh!g1EThMtZtBYoXusNHVn38I-zzDilHP;~*u=SS z((QEm!n-hxrxpV35l-u)(y|piy&A$;k%R^E#r`*b%ZmR11rEXRCIXKc<(YgBl}91u z%iiltu0;>;fC@1J`HnC~?x&KQHxX1e%5r|xh~gC__)w3{i)I3w%T*a0ZNHDgCR*Ovpbx0C|Fh?tv*bdv zeR^hgY(`dWW>RuyqhWOY;C+IJZ9 zZ4v|)g}^L9AfD);GeeXAPk~ks>RvE(p4kZUPQa;|g1n(=OkU&vUwPT-7B8QCosv46 zzR{%^f+$rG*EN%gtM&gVPCia&Q}O%llM7BEN8Lw}ohAq=K9mWm|NkfiS9z2dTF?*#}8Eu-7vRc{T(a zKuH4EZ*%{zxfZ!c*A>cffPY3#0{mJQb78i?dhj~Ny5WC!gPaV4m63@@+1ZN_zm(5H z`#(GR`+7vvT+Dc4r7&~@6IN)>Q)ap<_x^5j8Ki@Qt?w}9ZfE2=t}A9a76EFu9DcRt zms2st>5&S=bF^!R7^OR>v?6m^mvKM?$JjpXef|g|Gst9gi(jQxW`NcwDOMQSZLZ4g z-#Q%VhxD{KNXK zY+wto{-Ev#YSG=@A1TzHB*nbOh_u`PCA}ih3KNRxrMfRT{+L1XH5jUkxnvNhpNFp* zYURQwp2vNqjOIAAx{9T*I0-a=!$oZ0uJP-vKBi#t>|WY`I@cRoPFm`Z5jYlx4-i}y z?&3_^o^-58Ai~p+-2;>(Ru#uu$(RgdKoEVk+N9iJF40hTCDct3nEmdqGV_a58PG@B z{*#_7+qM2V3alG|wYaNv#Lt3tqyNOrJtwzQ3ottXW}?wkD_Ah=pz3LUFzr9F@9Q=E zW^1tj8SFCzH)PbYVBbk)Z}GU{f08irhaF?70Y5=Px*(xzD^-GLcRI+@ZF-Hh{wF!U z?>hI1ft=qVN301Ne4)zm>uO<%<$E*#Th~4>^VdfjYnCfEI1~bqX$pO*mMTk{*(4A zcdl=_9P5@_jjf;Ks5OJhYQ*v&*Q?3J4e1!r^vqMtWX%^c+(^=Wu!I{+NM(#*V{Wmn zH1+kcA*is@lAuerOpvuWs|Y3NZbRU<-jaastuYC!Ggg260tC%$2p(-y2}&{C5uw?i zvw_pET~|c3td2 zEbC+Bf%Mcf?fFZT6*IAgCT6#UtFjoCboc3^{3%2xb$5fE{W%9bqyhB! zB})E}Guq{~o27 zs9B}kGNU@pG;So%RqL)5pUtBWZZRHnCM_IE>sY$?&|grd^8;&Tyj5k)15Q+^V)Fan zeguTXEfVl8r*_nKs7fsJ&mpHwYG~ zv~>oLdScC|n94`IyG@@qVcb3s_32s;+@>H;Ckk##er3(gP31=DQ(}xkt+EgOgTWvi z48)_QlAo*@XjKOEsYrUGmGKywT<_P@5I!F66=(mSobVz^I#y^9m!^?u?x26ji0sUZ zF&#GY<)A8HNN@Iu1$QME3#Kd@|Its+=SqQ$TiM~IFIR+_UL~z#+W{|rQB?eQZi>O% zifw2~&vb?&IMW5MAHj!9L~g#S(=2N=F+exHTRdbK)LRr}Jz|b{S~Ilj1tk<(#dL5i z3my;Alj5k$FKNxgB0w#l<7KYes$H;f0{9#+WgX~KLaq6D6>1!Nc?9E?=kRJ!22$Jo zP-{nR47cF*pCW^vsxhWrb5ATS2k)OkWPB-je|IgJsghoFLV8Ii1#=}{v7WtCvl0!6 ze0VEKU^2Xpg=Q=uJXI^zdQA;~&F!b((9Gb54TcPXRm~>bBLd<|Y-+a7{~VhW|F{ zDE&}(%d@qWq2W_#C@yreTU#*vmwr&jcx~tXQ|aTlTacl}X*fEDvvR^!p?3Jk_ zPS4dZz7+};zJdzfg#Me*&RPZX$jQ+oceY#x4qjPoBJKGS=y_53>K&{pEhZ_;Jis0d zXKI`r+wSfOh_{`jeu=kcW|afzgC~rK|Lby7GBMslN?9LiROoEMqXf;w|J2{?9gd7! z=ij^z(t;on(I`%Nm3molW25(1Pg6cmd68aV*X5ZTRXC>5htTFHRpG9P`HSZK@* z9BILgb@aa^7_mQ&wAfhZ6k=^4821)pZop^@rc6c4Dv7>$h;@Ly>%$TBj+||2d}55u zK$&uk;*=w565nO0j$VVBP_;n*Nxv=HVbjyjV4VyfvwMmzk-5 zcj1y^pCENAx?L>LCQY>_wMs2Y$MhMIygLLuc0zNJN68u1F0d-F0+)Z^LfLB%g3=gT8`C`SaEM!_CFj+A9G_Jy3?ud+mi_7;jp!j5YV5$ zwNQ%LS$OrLOc`l6AAX>Rineujx3w0m{!?aEa?G{ZNxK%I4>lrQHxu-$yiR6XYOLOa zoy9YQa$0`znNEJTi`hn-EwuPwNl96)^-q`17rrD}vc-bmzb7TdN4~zh|K5YKa}Z^$ zm_I&mwcyr{#_hi(rNU#j-L!`7Dxw2y%h{IuESNJ@tp=x3`sAGId1n*yZ(gKzPS+i< z;PF3$RH?C-3^~|+G)8K8DeKYR;gkhKrj*5ELSEgmcl5A+)t>p|D$Ts3V4yhSQ-1yz zKITOU{ZySilchC_zu_&eM*B@3n4Ibf8l)0H6p!C z$V6Xp>AI9I*jK_8;`!mRU#&$KKGu{a+ONrN{-oP;9c}iT9^H1Kd+vODu4lY3IZQsVj2@cYdr)>VYf^5tv%^Kths!iaU|<|NS-gOB4d0-Ut?~bNX3DMB zZoeKaO+SLwNNat+C`3}3#r&IQg^&A7>+Ht-if~SGwLV2^=B+UHBK;=FM@bodzWXi~ zNr*mkES`x?!j~_oRrxKP%8}Fs@|jp-=EF*HHwm`jkIr!<%{n6c!A==aRO0^FN(FxG0gMeQQABLd*huH!2nfY6Dq;l*j$aN}4c9)d9>f*u0Ef0fb4FqhQ!1_WvkuGMceC7Z5hIywBqIXvz zEL#gC#ttIMn7dA1xkQ$R1(tLX1 ztiC|>zP|-gK9QgB8}?#tJpFLoY8xTD(k<|rkhuA>kTM6t7qkb_aU`ztf{?3&InmYy zk`syf;G`p4=gYop-(maFUC?YJ1|jBIi=VGYi9{}>jf1n6=*>fM`J|wJ^mC6nKGx6J zE*`5;x{>Y+5i0?{zM97lpDC~I zq@a$oGkITKegc)Wa_PrmESp}x{K%twL6`!Oe@1Tdau8qH&WJt9e!2Ay zZS~$ExAqzAERit0s(?z1`%Ws+xb99@yWZ&o!n67h>yw&3Bs@87&;Z-VeE0b$MGk;# z=*xVN8ZCZC?{p>SR!Uyv+z_xnH$XmPIgRt|VZrbExv@^H$p0@(5F;GIRIq zuQE&Mz>Z#f4YFW}hXjwil2WUrN@fQ*{B;_Su&t8!LXWO{<2Dm?<8A1w{p3ov$#i#C zL7wM%&`m?YdaRa8Qf^mFXbrmSO4_cL*k_=JtwzI_yup{`t-_c&xSHE>hJp@1Vz>ULpPbnsn@w?_np=G~Nr~}Jn8+6$*89(a)%4{a6$ISx*Q?rklC3ZKt0bmv zgWP4CRJqP1D&0k+M(&zYEr!!8dz-*8Tws{GO%<*oX$AI9q|$bIgjajEW#3w0Kf-TC zfvV#VpxQ3gqDC*?4&m`TWHxZS8@aJv3TB2JO{iPEa1J;3$^@$0Q@Zn2Lig{%@YX&n zxVw5EA|l|g4{M;$1N@5a8FNskg6}nC*mypsbw7aN=sX#O5HON*<6QjJE?$28*^n3L zV%zt*efkkp+wnHh6F=}dqJZ-1c0%Tbj@OcUeYu#HI{@l&QU<{hj^x8+xfiITmQ%R# zvgBT6_1rs)h?`f7`&W%kQUb z&R0}h@ORZFA9{}u{~d?G7xV6#gxGmUl+Ahn;W5Ci#j zi%SW`=Q$Mqk)zv@hc9G*KcHo@CQo_ zoA-j(`?snXJ&F3t$led-why3@A5;Q&60=VpfIs)mokNcf>8pgoAVvLo{>hDu-6z$i ze%Vhsv?}6G`zMq{U3cO`g@XL{0~GG)PN!}!61!h&;!xG-PIC84wH>nXkH|~##q<4A zd4~i1f8|K@0sPO~!=22!?Gi?o9gxBt{QcSgY6yKF&1WQglRsJUP71Jwu|-DF016AX zhHaq>kaz|wPu5?>mu#bPJv1%*)ldn>{)Id%E(ABrs0E8$^`u)Ksy7H9kq0K#N>Ksj z$@0IjI-HsTj{@=sg&Z!!A$TvQABj1HCrJS5cLQA*mv5yh$7HR^W|+o!p9% zHa84RM7P6$j0@us!xC42GVu}KK0%e;IyV16X(Us3tgOX#eyu7DKlc`11|RVwk_JR{ z{t=9B*5r(q|0va@jaO;ox!MYMPg3wnav}APNZu|~#3s8tvq;(@yg;yXeU6lqjq8Ou zSw);l{viwr@c8KncubGt;DP`*ZDreSB+6_3zHa??Lft)B{fK)9eWN*X{!Pi3lyq^` z<(|X}i_#R`oS1M8G;d*|*dL2pahe%-C1-N`H_3x|9Yd;sKIM)dMLuipo>M1Eo;y5(IGyh=yAMQgW^{z-QjC`;NBVd;(>dQjtrl9IOjN4 z1`xdUI0WlDaYi{8q~iPodz4XD>^Q%Zuw$3aCP;K=3&C%F@qy9l|nwJaR}b+S(M~-c5^0Sr#WH6(*QRa#KE^~ zxcah>Y*1m_DCEQl1%fYj)OQUec~9gXj#xYD=4Yf99oD$wW?{cEoMp>q7s01!P@0r--fGm??{<6ZTkL&7D_cq*Vp&XM!Z#t^dg5~kX~4~RH~lskEP7O#n-9{)Y&twRW= z#&aIln^n~paDgneZ+(_@PSX3iYR!iB z%Lf!+I%GKqzNtV>xIr6#+r}F)L_^KkUCsk=Y9|MvW0?CrNklr{QA#zxH@^EmS`q$* zUvZ8@I0xF~n~ML>IAQ0#LesTa8yb10<46%Ikx_9i!FnkN*JeU(FyQY$KbopuS33fDOV zzBQ5)mw1fappe)b9D)RmZ&@iHAf+bNY&)q=V`K_iF^k)kQTI8K+4dZ=)0UrBOVc|w{F5?~kRGE{vR+EM3ly9-HY$|k$+dGbrxbh*-wW!YB zu5flfSHRBavm(u(%E+OO5q2ce*BDGPI=Tjthlep|mbis=LUdy8RY2|SIW(@Hs|#6v z#1-Fkl}Fo13Qlkm!QSNhRqlcU3ceS}!3o1$jbwQjB*vI)^4xk2;Byrj7(wJg_Fuz3 zDz$FX^BtdbaCIVF-9WJJMHuG>O*Oeb7$D0ET%E|%&OG27UI)hkRb+imV))OzF0-r~ zaXED}SiQxsSX7Rws<3n-Y-qm%5%rDx4X~SCO=d@}k9gx+MzMY}1vjd}!Fji&KoWBb zDdXJ@PHnhJscXv2F9YoUH-}83ke_N<6VCjA(1>~@7dMaVH=7ZPy*NMYl!)69MH$;bL&yUSs86%b-Gc5~aPOqe4N#=D|x3~qRVCO!&AS*G3w zOP>x3p6ne=-(DpDHt)m76z6J38OO&hT=7oI9Y8vE;t(|zAH0J%go62X3hvOIg9|>O zBKR19E3@qEf`-76zkDOMAOt=m1ZoQ*FtmrL5ewrjcfoE(lFTl}y)0={#!W*;pOq)B z>rwf)I)L3Hu&W}l+tr5?8J?n)8g&mJZlmI>m99AN3bF&;UKf+(fK-N`d%(??6x@@C zl73&F%Icrc*1rz3rr^?t=%oYWI1w9m*Y5KH`JA$||As->h@+o3q-rEQ0HDQm z4q%pj!a2ofU+6;%9OjanVSnzt4ci_eamENXel?fN3OtP6o6%2;==nDqs2|rnol<2B zkR3rJZq(nN$B8n0;0}~0da~&u_sQOeQ07f82b*(T@|m^(Qt}c0el&3idcvQ5y^KN@QOLplW@gTGBE#pcb1$DQ~WNaj6S~wg> z1xMi4$uD?x%zpuv2VFQ=&6m$!$m_=@XJ!`A>*+Pn*J2s=*}#a@sN3>0{6te9wPE<5 z;Je(&`6{Z$Ttc#a+KKn*W1ti{LUJNmG3UcRHA6`|{{_+$zMM1;>ku;hhMZI>IG=)( zN?38mJfb0S*RTi$O3X{3I0bT)nJ@V=_7rWL7Q`CO#iIvVC|BCGUje!*ROTut2NyE^ z72f^|j_WA+V?_>TldgGI4f-398kIPN4RWRWVV&Zc)U4bU)V=lHt-F3kRZe8iHEty1 zERR|JYw)~V(?S|n1$vV68m|SS9sTF|SrzD;`c`3;+(-zg$l8pEO%p}0$bERzVbypO z`mZfW#2X}!8gLotpg^+B!5!bTbK?Cs-^uvt8@IpQ2t3;gszNNs zM^Nj?ISG&EUVX=v|NR|ws2eBi;NuoVTD|8}QP1~)?C8KD=5Ti*3B}x%wbOZu(z}O< z!gfcRe*h#jfkU9Bfh_#M*=}Z#WCc=%byMBdX@kzd%zE&<)%5(Of*M3dg}GxdGF~nj z#{F^i$A<7vIAW%$;2%R8BVscs`!WFyg%+9d-RzK6#^FALxM6ZMoy*9eHK4FzVvK*@ zy(UCtK{t`6@gOcjo{RYgM~Bp`!-){FA0p}r8oeFNMPQI>$>Lh>Y)^*9$f(co)X|X~ z%7zO9xGW&^Tye4H`|)Neeq>~2#q;yV0`}WvPK1bbA~|i`{mIO}awX74o8W&BDvyOb z#pP4GnX(@89P365?cq~%wKJ>;81J6LaoA`(Q$$Y8PiD8PGZ?n{A!Uk%!o|59AJOGP z!t9MKGq<*<>MvAO)R2YtI17NqTPfu5A`U4?aStVChe+QoHDmnn%b*%!ftPHfx z6mnyu3~?|@EOgfX@gkYNfkTVU0#UE3n>gysqwbF6T)I2|RsmHZwJ13C{lNnKeNiJ{ zx9zPq`bG*|Hytd+D;OPi$@tDj9dWD2!?}(lI0fys;6y)FKxM3;kcs;(Al>R3OH+u} z36L(wEg;A08riTJNg+edT0oQ!3sAy46daXr0nW*Dm*43RaEvp+b{Ax@vux1gM^~Oq zM!%iL3PUWceSTI@UC1YABQLD?r_OE{i4ipb4iKkChbtENJzb2&s7^y&Ae3CU(CMIy zk;X51L?Kh}SkP=~A_cKN`{{D0st<8^&X{kl%|E2YsX zeppb8ORXBO6nrP5b2A1~$q{aleB`wPaU?zWxR+zE|EJ*16#VBq4lZ!x+WNYq@%~2( z8u-?apVWe8G6lc0Cx_Y^eMp|Wk+0s0W(_}0GwyZ#Ru$}6?Z{E{@4HJR>V&(Ne9=-) zTR-n!R$YTSsy6Nvh)H6*lgwXd^dQSL+?YceNG|82urpFKHKb!p9)RVv0RQY~L6~vV zJ(!#`OG_yAaB3V*i(We0 z4SZ3kPc=oTL^kS;tfFPN52ZRBa@$Gc&EC2Xb=Z5D2dIERGRna7%M=53m<-92j5Wzy zgOP1q>Lfton<&g`lKgUjM|D=U5%V1 zI(<}6g-HmhSW1J1I%F_^)A&Iru^(~kc0-aZBuZ0`-Akn62YNufFFxl&Bl32XrZIW! zVPs2fH%~y^`f^AEPh&hqpHCZm_2Z2>-o{46;3XILhUS-^EkuZX!ifJ;R)GImoTlJ6 zCQH0{X5Z%pPG>VLAgzY*UA>mxfRxEpAl<0oo3ydfFr~3E(bv`R{VQg+Yem;16Cpj- zMtY4AoQN4`mag#uyZBKGB+k4wyPN_heWd`nfmDNv#R1trS%Fw<5bSh4g??|NZE5Sb z+mD;diO}UWNP&^>G_!Xn9w0J1Ut?*q*q4XNdS3`CGhczkQt6R?XzaRDX)H}9`x(nH z(@*TWw~D^)YYe8;F9gT$-=g5xBX10R;;dT&oLcWvAZ5v?;Tqijm4h^of^Y2O;Fa5;uz1fCnk~^N$L+DLFSmBeBmOQv^?Vh#`gKtLLww}31RH2N`5Ec)^C_~{7#0(e6#b!+_0@o!T{ z8-k3%R62VZR+C>iBx9GxpG*$oT`)fgGQP8f#4XTxC_d7b0(jw7g)msStxOZp+7p_c zy)peg#?D?}p-+ll<75p=8>7gXB^o1HT80aCD-Et6ZYp5rp%t|8!fmCo8SxJ`^7D=D z{eFELhDA;IoU+%GLu)kM$oo*de}MXVcd46MXEEdxQ7Vfzm2_mdbx6)CjURIY zBe?V7U`XLk7>;xT=8PbSd4bxJSPpXIjSN(c%&cbgB1^0D5qy(^z7J4AjwIo(MU-?d z4|skE;FXN^*(hQfT-xy5xi>OZ6f(P*C+mgExPcXnwW#nfDu6@HvaB_p?bufbTypgCex_Yu&>*R#~z?4Oh2FzQ5<3MwWV-8KSn$7U)V zcT!xn%5wA$1!u*|V3=qiF_A{@lWXfV6AofXJNsL|Vs=*?BZya6G1ZHDmeJ7Hkl6OM za~Byu-%sns_EBkvPpJ&qMZQo~^Ci`O;g{KJrDu5sCrs`Ib9U?JV2mh%3<~ZC# zKOoaha8t!zvMh57ji?GXqk5}s45WUj)=0yMYO$Y!6OsX5qhT@cP5jH^b8A~NIJ|B( zz#k1z;pHgRUfMcfu-fWP-blP8s$CtR52Iz!^y^v!e;`RfsxR2N| zSH_K~X=FPtcSb7SpML4i;Wcj!BG={C$F#NC0)`tz3ThdhNJK48 zP`?&HODsSoNlZ8Ru|W;)$E_58ZlOxb>@AD0KRNVSrnZ(~AFrgYpdW^EII)_6LdlKV zT+AP|wdA*YGPa4aEGd|+)sXsiP(#v$a3;?2F8yT4Cj_myY>V2!*pwkXztTFAn*;E< zG5R?@Mm00zybHauOuu$5u3po($inIRl;QrpZ_(#IxR_HJvrt{33yy7*aeHRtPCxys z9<^a?U1*!TR|bWT*81X|MjZ5vf{q?i^>Qas^*E?aJ%BDBk*S2`>{bd|cnrZ6ZLGvT zgh$2r)JN-@Q_Lxq)i2#q&?E{v@srGJ`D!g+`!Z|Z9*=5E_l>g=mo)`zCZ3fg(2v_u zHeI5?renVB_T^E0?R|o_?!G89*ETSgVSEqd&%Z=-*m3Y}DDdrnUFNHNm5vd7J-6{b zJGlQc=1K7sX39-jdJEl1r>j&>ZK!j>ky0Vo;Zz^ z;V;`heE{w1V)_sl?0X-{RP^(5)bg(Q>rnKms)i?9DE^MAWWOVdbiqSsuQ zN|2^qGr#TJai@pE-?LB*D_ROAtW)8PIWyU{j=_*A#td!~MyZ``bLAs!ldI8_4f)Q+z+b3R2_}w$tyjC4n0cZa z!**Xqx2CYoEqU+eN9P{E2Zs;=r|B%2?kNRkjS)#g{Aj>j@)ni|H8rC#6NHAJh!yT@ z%_1qTVbK1?|LF*H+EJy~u&%czV8@2sLAR%)hJ2#A%MD5KY{1+0?5jQH$ugrtr_y!HW z9x&lqom9{ssmrhkjVSP{%(XsgoN;F^1n8P){b-%Kx3#3{=) zk$SeZT1t%mtR_*EwvMo>zmcry*U)iVH+2T!26fvH&sm$CmL$eF3$dzdB#TFn)*nKl z!hTQePtI%3aL`&C@n4z^{*G^X0eZ2fhiHh?>rH%@_I6^awOkahrf16$pQvwLmHN8Q zQQdgI>DPYD8w1ePS0Jj7(ly%XdWqm;QB<~Mjv7FE_s#*#qw5l;DcxvbH|K}}@DZ`X zZb??%5u@W@;_QRyxY()4GY;TAf<7l%XC>#xN|HsK_*XI@N8Yo7WS0&a-PxbX!u5ui z!Jqm-<3Go`Ex|EXYUM7~BkF!eS8T#0RzI`5{a6#g!Qi>b_AJMYW=-^PWsdVUUmKgF z1y6U(fp%s-f-ou`iHfvzx8q{ZRCurlmTdIVJJiowV8L9OHUBWlY2bOhg%BtK!1#G!g-wtwL`I$}>?G>c7^%0uqvGDyCm#~4_Y^6x-%WAS z!px1|Lk~5hX>EgJ0(4Ew94E2Rw9IVXE291EdIeZXGr)>Ncm2r|cLPyq;FW1NcbxHk zV93DqAEirMq<2aO%)kt-PMuh6y4sIp)m=X2;Rm}+XxsYYeUT;gA_m#9 z2_cI8(?@e^2zS5&b6Z4oU``pTJI9Ui&s0{!#$m7#tikXYaR`q>=+z6y zTe#1;@HG-%RLs5O$`HI&ad@42eO>Zt&%d8XMXliiVZ5*&6TJK0!GydR!J&s$QE~Ej zt(m4zLHseVw<~T@VSYtn^f9D#i?rP`DEOdxxg?LgmnJ-(s$B^?9XK3N%hr z9GN9cII$!PMXB8?i?T5teX%A>3{ek>b^lE%g-DAH=h~UO8ZGD(3?3tZRybLl`;2f=pr!+yg1h|JYva@*}KIiE6)Bv#XQV zuMKORBRat;QK%&Sw58p9(j-2o+MI#b!Ve0PXByVrzEB2#T)0H2RTS^5 zSD`#@A6MQ-Tbh0&dvb6(^j4uV^wXBw{Zen@0>ur#8z&p+0>ErPC|P{!)pwC%;CoYf z?LM%ygwpcNXPAHaSXC8L-w&l!SUzfmcKvaI@?Ps#L_%QEU%HIGe)2A|ek5kks`E&^6VwWK0w*t5*_=uB;Ow&BIO>C1sthMLxg zz&&SqFY#bCi&VZT`3_+fp5s{V%we-)Vm}$hye(oeSkV`?GCK3)_}tp413s(hSDHs- zQlO9PQQvB1G-{2&qcn2!4ixJwz8ImcJ{M}GgE2tiCC+xl@-uF-;!2wC&F_U(CJXwc zUh3FoGYfuG5jnN*2sG4ur|SBJ?QCoq%<{0pM+CTOW(V@nJ4eiBSMpG(rdwvZ8l)35 z<|6?GH8>yC;5(9fxKioNZ};H1)uU2ZUjp7xVE5GFzS}4T`X0b=cqU&ojmv~}t_dEc zTP>;zRNV7&Q0c%t3k2W40DR>)$)8yug1}OuZh4?d@x1>mQSIziejNofED`B)Agz#x znpB}75&uycmJ;<54(QCks0?Zw=y{gm>!q@Whl(fjEEG2I)$|NO#SJ2onpX&fqkS;2`~3E6hM8#F>&YS=?!K2aYZMmUg5f=}UZg0m zEknt2!!*8$U3i46^C`ehs|@nFhK`br>5hK<+!!te1{H}_=jbB9d^u8s>7GOgWCbkZ zA8ZP;`jk&qb+^J~WX;oG3Pa*I&+NIH>uzIn51VDMnab*OW2(xgdYF9JS2snM47b35 zcd}KMXi@u7DA+`V6$@2XWl;mE71R;I@Q%viQdaW7`9Ipmwezl4?FfvmdU`< zmy4#5Py7x0CBI_1+MT3ohlyFYQQnSlS`RC0aoVk33PhKi zv?ZLp6~L;xuF~xw-Yk5N$wS;%0X5f%Rs286@+cO{hZcj{_(Y|9Bs^K-YSn>RibZ0v zjaVn}o7J54E&k(mI3(u$=^HR*0{WvFw_A7fEzk?m6*b(5%sPk zrv~xX$&X|DeOGw~zlgdDtIGjSntB6sUM+K5=j{1WanQOCevj1oJQXj!Tm3YUTUmEG zWC88hKZ9?C?%5EdeD=a>HH1HVyzxR&4xW1#xcX723WFENh2xyr_%$MxnZE`FSc8K^ ztty>)h-at3x1H6oqd2-g^peSe8P=-)wpCUnqw>_EI?GN3AJdOpRH9p T7$e$8v=6@4&L-BiBMR|<9D_4T diff --git a/skyvault/src/main/java/com/skyflow/VaultClient.java b/skyvault/src/main/java/com/skyflow/VaultClient.java index 3dad6b1a..99301026 100644 --- a/skyvault/src/main/java/com/skyflow/VaultClient.java +++ b/skyvault/src/main/java/com/skyflow/VaultClient.java @@ -8,15 +8,23 @@ import com.skyflow.errors.SkyflowException; import com.skyflow.generated.rest.ApiClient; import com.skyflow.generated.rest.ApiClientBuilder; +import com.skyflow.generated.rest.resources.files.FilesClient; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.resources.records.types.InsertRecordRequestByot; +import com.skyflow.generated.rest.resources.records.types.UpdateRecordRequestByot; import com.skyflow.generated.rest.resources.tokens.TokensClient; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.*; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.BatchRecord; +import com.skyflow.generated.rest.types.BatchRecordMethod; +import com.skyflow.generated.rest.types.DetokenizeRecordRequest; +import com.skyflow.generated.rest.types.DetokenizeRecordRequestRedaction; +import com.skyflow.generated.rest.types.FieldRecords; +import com.skyflow.generated.rest.types.TokenizeRecordRequest; import com.skyflow.logs.ErrorLogs; import com.skyflow.utils.Utils; import com.skyflow.utils.logger.LogUtil; @@ -68,6 +76,10 @@ protected QueryClient getQueryApi() { return this.apiClient.query(); } + protected FilesClient getFilesApi() { + return this.apiClient.files(); + } + protected void setCommonCredentials(Credentials commonCredentials) throws SkyflowException { this.commonCredentials = commonCredentials; super.prioritiseCredentials(this.vaultConfig.getCredentials()); @@ -83,55 +95,55 @@ protected void updateVaultConfig(VaultConfig newConfig) throws SkyflowException updateVaultConfig(); } - protected V1DetokenizePayload getDetokenizePayload(DetokenizeRequest request) { - List recordRequests = new ArrayList<>(); + protected DetokenizePayload getDetokenizePayload(DetokenizeRequest request) { + List recordRequests = new ArrayList<>(); for (DetokenizeData detokenizeDataRecord : request.getDetokenizeData()) { - V1DetokenizeRecordRequest recordRequest = V1DetokenizeRecordRequest.builder() + DetokenizeRecordRequest recordRequest = DetokenizeRecordRequest.builder() .token(detokenizeDataRecord.getToken()) - .redaction(detokenizeDataRecord.getRedactionType().getRedaction()) + .redaction(DetokenizeRecordRequestRedaction.valueOf(detokenizeDataRecord.getRedactionType().toString())) .build(); recordRequests.add(recordRequest); } - return V1DetokenizePayload.builder() + return DetokenizePayload.builder() .continueOnError(request.getContinueOnError()) .downloadUrl(request.getDownloadUrl()) .detokenizationParameters(recordRequests) .build(); } - protected RecordServiceInsertRecordBody getBulkInsertRequestBody(InsertRequest request) { + protected InsertRecordRequest getBulkInsertRequestBody(InsertRequest request) { List> values = request.getValues(); List> tokens = request.getTokens(); - List records = new ArrayList<>(); + List records = new ArrayList<>(); for (int index = 0; index < values.size(); index++) { - V1FieldRecords.Builder recordBuilder = V1FieldRecords.builder().fields(values.get(index)); + FieldRecords.Builder recordBuilder = FieldRecords.builder().fields(values.get(index)); if (tokens != null && index < tokens.size()) { recordBuilder.tokens(tokens.get(index)); } records.add(recordBuilder.build()); } - return RecordServiceInsertRecordBody.builder() + return InsertRecordRequest.builder() .tokenization(request.getReturnTokens()) .homogeneous(request.getHomogeneous()) .upsert(request.getUpsert()) - .byot(request.getTokenMode().getByot()) + .byot(InsertRecordRequestByot.valueOf(request.getTokenMode().toString())) .records(records) .build(); } - protected RecordServiceBatchOperationBody getBatchInsertRequestBody(InsertRequest request) { + protected BatchOperationRequest getBatchInsertRequestBody(InsertRequest request) { ArrayList> values = request.getValues(); ArrayList> tokens = request.getTokens(); - List records = new ArrayList<>(); + List records = new ArrayList<>(); for (int index = 0; index < values.size(); index++) { - V1BatchRecord.Builder recordBuilder = V1BatchRecord.builder() - .method(BatchRecordMethod.POST) + BatchRecord._FinalStage recordBuilder = BatchRecord.builder() .tableName(request.getTable()) + .method(BatchRecordMethod.POST) .upsert(request.getUpsert()) .tokenization(request.getReturnTokens()) .fields(values.get(index)); @@ -143,18 +155,20 @@ protected RecordServiceBatchOperationBody getBatchInsertRequestBody(InsertReques records.add(recordBuilder.build()); } - return RecordServiceBatchOperationBody.builder() + // The regenerated batch-operation request has no byot field; keep sending it as before so the + // BYOT behaviour of insert(continueOnError=true) is unchanged. + return BatchOperationRequest.builder() .continueOnError(true) - .byot(request.getTokenMode().getByot()) .records(records) + .additionalProperty("byot", request.getTokenMode().toString()) .build(); } - protected RecordServiceUpdateRecordBody getUpdateRequestBody(UpdateRequest request) { - RecordServiceUpdateRecordBody.Builder updateRequestBodyBuilder = RecordServiceUpdateRecordBody.builder(); - updateRequestBodyBuilder.byot(request.getTokenMode().getByot()); + protected UpdateRecordRequest getUpdateRequestBody(UpdateRequest request) { + UpdateRecordRequest.Builder updateRequestBodyBuilder = UpdateRecordRequest.builder(); + updateRequestBodyBuilder.byot(UpdateRecordRequestByot.valueOf(request.getTokenMode().toString())); updateRequestBodyBuilder.tokenization(request.getReturnTokens()); - V1FieldRecords.Builder recordBuilder = V1FieldRecords.builder(); + FieldRecords.Builder recordBuilder = FieldRecords.builder(); HashMap values = request.getData(); if (values != null) { @@ -171,11 +185,11 @@ protected RecordServiceUpdateRecordBody getUpdateRequestBody(UpdateRequest reque return updateRequestBodyBuilder.build(); } - protected V1TokenizePayload getTokenizePayload(TokenizeRequest request) { - List tokenizationParameters = new ArrayList<>(); + protected TokenizePayload getTokenizePayload(TokenizeRequest request) { + List tokenizationParameters = new ArrayList<>(); for (ColumnValue columnValue : request.getColumnValues()) { - V1TokenizeRecordRequest.Builder recordBuilder = V1TokenizeRecordRequest.builder(); + TokenizeRecordRequest.Builder recordBuilder = TokenizeRecordRequest.builder(); String value = columnValue.getValue(); recordBuilder.value(value); String columnGroup = columnValue.getColumnGroup(); @@ -183,13 +197,9 @@ protected V1TokenizePayload getTokenizePayload(TokenizeRequest request) { tokenizationParameters.add(recordBuilder.build()); } - V1TokenizePayload.Builder payloadBuilder = V1TokenizePayload.builder(); - - if (!tokenizationParameters.isEmpty()) { - payloadBuilder.tokenizationParameters(tokenizationParameters); - } - - return payloadBuilder.build(); + return TokenizePayload.builder() + .tokenizationParameters(tokenizationParameters) + .build(); } protected File getFileForFileUpload(FileUploadRequest fileUploadRequest) throws IOException { diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java index d465ff62..80f8236e 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java @@ -7,6 +7,7 @@ import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.UploadFileResponseV2; +import java.io.File; import java.util.concurrent.CompletableFuture; public class AsyncFilesClient { @@ -29,15 +30,15 @@ public AsyncRawFilesClient withRawResponse() { /** * Uploads a file to a new or specified record. */ - public CompletableFuture uploadFileV2(String vaultId, UploadFileRequestV2 request) { - return this.rawClient.uploadFileV2(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture uploadFileV2(String vaultId, File file, UploadFileRequestV2 request) { + return this.rawClient.uploadFileV2(vaultId, file, request).thenApply(response -> response.body()); } /** * Uploads a file to a new or specified record. */ public CompletableFuture uploadFileV2( - String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { - return this.rawClient.uploadFileV2(vaultId, request, requestOptions).thenApply(response -> response.body()); + String vaultId, File file, UploadFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.uploadFileV2(vaultId, file, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java index 75814065..28ee91e1 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java @@ -19,15 +19,19 @@ import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.ErrorResponse; import com.skyflow.generated.rest.types.UploadFileResponseV2; +import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.util.concurrent.CompletableFuture; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Headers; import okhttp3.HttpUrl; +import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; import org.jetbrains.annotations.NotNull; @@ -43,15 +47,15 @@ public AsyncRawFilesClient(ClientOptions clientOptions) { * Uploads a file to a new or specified record. */ public CompletableFuture> uploadFileV2( - String vaultId, UploadFileRequestV2 request) { - return uploadFileV2(vaultId, request, null); + String vaultId, File file, UploadFileRequestV2 request) { + return uploadFileV2(vaultId, file, request, null); } /** * Uploads a file to a new or specified record. */ public CompletableFuture> uploadFileV2( - String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + String vaultId, File file, UploadFileRequestV2 request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v2/vaults") @@ -74,7 +78,9 @@ public CompletableFuture> uploadFile request.getSkyflowId().get(), false); } - QueryStringMapper.addFormDataPart(multipartBodyBuilder, "file", request.getFile(), false); + String fileMimeType = Files.probeContentType(file.toPath()); + MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; + multipartBodyBuilder.addFormDataPart("file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType)); if (request.getReturnFileMetadata().isPresent()) { QueryStringMapper.addFormDataPart( multipartBodyBuilder, diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java index 33d3786d..fec6c802 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java @@ -7,6 +7,7 @@ import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.UploadFileResponseV2; +import java.io.File; public class FilesClient { protected final ClientOptions clientOptions; @@ -28,15 +29,15 @@ public RawFilesClient withRawResponse() { /** * Uploads a file to a new or specified record. */ - public UploadFileResponseV2 uploadFileV2(String vaultId, UploadFileRequestV2 request) { - return this.rawClient.uploadFileV2(vaultId, request).body(); + public UploadFileResponseV2 uploadFileV2(String vaultId, File file, UploadFileRequestV2 request) { + return this.rawClient.uploadFileV2(vaultId, file, request).body(); } /** * Uploads a file to a new or specified record. */ public UploadFileResponseV2 uploadFileV2( - String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { - return this.rawClient.uploadFileV2(vaultId, request, requestOptions).body(); + String vaultId, File file, UploadFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.uploadFileV2(vaultId, file, request, requestOptions).body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java index a73991b5..3742cf62 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java @@ -19,12 +19,16 @@ import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.ErrorResponse; import com.skyflow.generated.rest.types.UploadFileResponseV2; +import java.io.File; import java.io.IOException; +import java.nio.file.Files; import okhttp3.Headers; import okhttp3.HttpUrl; +import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; @@ -38,15 +42,15 @@ public RawFilesClient(ClientOptions clientOptions) { /** * Uploads a file to a new or specified record. */ - public ApiClientHttpResponse uploadFileV2(String vaultId, UploadFileRequestV2 request) { - return uploadFileV2(vaultId, request, null); + public ApiClientHttpResponse uploadFileV2(String vaultId, File file, UploadFileRequestV2 request) { + return uploadFileV2(vaultId, file, request, null); } /** * Uploads a file to a new or specified record. */ public ApiClientHttpResponse uploadFileV2( - String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + String vaultId, File file, UploadFileRequestV2 request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v2/vaults") @@ -69,7 +73,9 @@ public ApiClientHttpResponse uploadFileV2( request.getSkyflowId().get(), false); } - QueryStringMapper.addFormDataPart(multipartBodyBuilder, "file", request.getFile(), false); + String fileMimeType = Files.probeContentType(file.toPath()); + MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; + multipartBodyBuilder.addFormDataPart("file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType)); if (request.getReturnFileMetadata().isPresent()) { QueryStringMapper.addFormDataPart( multipartBodyBuilder, diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java index 3d25a53b..6979c78b 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java @@ -27,8 +27,6 @@ public final class UploadFileRequestV2 { private final Optional skyflowId; - private final String file; - private final Optional returnFileMetadata; private final Map additionalProperties; @@ -37,13 +35,11 @@ private UploadFileRequestV2( String tableName, String columnName, Optional skyflowId, - String file, Optional returnFileMetadata, Map additionalProperties) { this.tableName = tableName; this.columnName = columnName; this.skyflowId = skyflowId; - this.file = file; this.returnFileMetadata = returnFileMetadata; this.additionalProperties = additionalProperties; } @@ -72,14 +68,6 @@ public Optional getSkyflowId() { return skyflowId; } - /** - * @return Path of the file to upload. Each request only supports one file. - */ - @JsonProperty("file") - public String getFile() { - return file; - } - /** * @return If true, returns metadata about the uploaded file. */ @@ -103,13 +91,12 @@ private boolean equalTo(UploadFileRequestV2 other) { return tableName.equals(other.tableName) && columnName.equals(other.columnName) && skyflowId.equals(other.skyflowId) - && file.equals(other.file) && returnFileMetadata.equals(other.returnFileMetadata); } @java.lang.Override public int hashCode() { - return Objects.hash(this.tableName, this.columnName, this.skyflowId, this.file, this.returnFileMetadata); + return Objects.hash(this.tableName, this.columnName, this.skyflowId, this.returnFileMetadata); } @java.lang.Override @@ -134,14 +121,7 @@ public interface ColumnNameStage { /** *