From 9e1189726d5f59d996d70cccb012960a31a2f68c Mon Sep 17 00:00:00 2001 From: Andrei Isvoran Date: Wed, 12 Jun 2024 08:12:23 +0200 Subject: [PATCH] RED-9290 - Component management for dossier template clone/import/export --- .../service/DossierTemplateCloneService.java | 23 +++++++++ .../service/DossierTemplateImportService.java | 44 ++++++++++++++++++ .../export/DossierTemplateExportService.java | 13 +++++- ...ComponentDefinitionPersistenceService.java | 19 +++++++- .../ComponentDefinitionRepository.java | 2 +- ...eCloneAndExportWithDuplicateRanksTest.java | 9 +++- .../DossierTemplateCloneServiceTest.java | 8 +++- .../DossierTemplateImportExportTest.java | 18 +++++-- .../tests/DossierTemplateImportTest.java | 10 ++++ .../files/dossiertemplates/Flora.zip | Bin 0 -> 93306 bytes .../importexport/ExportFilename.java | 3 +- .../importexport/ImportTemplateResult.java | 4 ++ 12 files changed, 140 insertions(+), 13 deletions(-) create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/resources/files/dossiertemplates/Flora.zip diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java index f09b35fb7..96c6871ef 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java @@ -17,6 +17,7 @@ import org.springframework.util.FileSystemUtils; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ComponentDefinitionEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; @@ -24,6 +25,7 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier. import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.model.ComponentMapping; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; @@ -36,6 +38,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinitionAddRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; @@ -71,6 +74,7 @@ public class DossierTemplateCloneService { WatermarkService watermarkService; FileManagementStorageService fileManagementStorageService; ComponentMappingService componentMappingService; + ComponentDefinitionPersistenceService componentDefinitionPersistenceService; public DossierTemplateEntity cloneDossierTemplate(String dossierTemplateId, CloneDossierTemplateRequest cloneDossierTemplateRequest) { @@ -139,10 +143,29 @@ public class DossierTemplateCloneService { cloneComponentMappings(dossierTemplateId, clonedDossierTemplate.getId()); + // set components + cloneComponents(dossierTemplateId, clonedDossierTemplate.getId()); + return clonedDossierTemplate; } + private void cloneComponents(String dossierTemplate, String clonedDossierTemplateId) { + + List componentDefinitionEntities = componentDefinitionPersistenceService.findComponentsByDossierTemplateId(dossierTemplate); + + for (ComponentDefinitionEntity componentDefinitionEntity : componentDefinitionEntities) { + ComponentDefinitionAddRequest componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() + .description(componentDefinitionEntity.getDescription()) + .technicalName(componentDefinitionEntity.getTechnicalName()) + .displayName(componentDefinitionEntity.getDisplayName()) + .dossierTemplateId(clonedDossierTemplateId) + .build(); + componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinitionEntity.getRank()); + } + } + + private void cloneRules(String dossierTemplateId, String clonedDossierTemplateId) { for (RuleFileType ruleFileType : RuleFileType.values()) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java index 012946acd..3c2def5b6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java @@ -43,12 +43,14 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.configur import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ComponentDefinitionEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierStatusEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; @@ -63,6 +65,8 @@ import com.iqser.red.service.persistence.management.v1.processor.settings.FileMa import com.iqser.red.service.persistence.management.v1.processor.utils.FileUtils; import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinition; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinitionAddRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentMappingMetadata; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; @@ -83,6 +87,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.redaction.v1.model.DroolsValidation; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.RequiredArgsConstructor; @@ -116,6 +121,7 @@ public class DossierTemplateImportService { private final ObjectMapper objectMapper = new ObjectMapper(); private final FileManagementServiceSettings settings; private final ComponentMappingService componentMappingService; + private final ComponentDefinitionPersistenceService componentDefinitionPersistenceService; public String importDossierTemplate(ImportDossierTemplateRequest request) { @@ -291,6 +297,9 @@ public class DossierTemplateImportService { mappingDataMap.put(fileName, bytes); } + } else if (ze.getName().contains(ExportFilename.COMPONENTS.getFilename())){ + ComponentDefinition componentDefinition = objectMapper.readValue(bytes, ComponentDefinition.class); + importTemplateResult.getComponentDefinitions().add(componentDefinition); } else { reportTemplateBytesMap.put(ze.getName(), bos); } @@ -427,6 +436,13 @@ public class DossierTemplateImportService { this.deleteTypes(currentTypes, new HashSet<>()); } + if (CollectionUtils.isNotEmpty(request.getComponentDefinitions())) { + this.updateComponents(request, dossierTemplateId); + } else { // no components to add, but remove existing ones + List currentComponents = componentDefinitionPersistenceService.findComponentsByDossierTemplateId(dossierTemplateId); + this.deleteComponents(currentComponents); + } + //set report templates var existingReports = reportTemplatePersistenceService.findByDossierTemplateId(dossierTemplateId); @@ -527,6 +543,19 @@ public class DossierTemplateImportService { } } + // set components + if (CollectionUtils.isNotEmpty(request.getComponentDefinitions())) { + for (ComponentDefinition componentDefinition : request.getComponentDefinitions()) { + ComponentDefinitionAddRequest componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() + .dossierTemplateId(dossierTemplateId) + .displayName(componentDefinition.getDisplayName()) + .description(componentDefinition.getDescription()) + .technicalName(componentDefinition.getTechnicalName()) + .build(); + componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinition.getRank()); + } + } + //set report templates if (CollectionUtils.isNotEmpty(request.getReportTemplateUploadRequests())) { request.getReportTemplateUploadRequests() @@ -807,6 +836,21 @@ public class DossierTemplateImportService { } + private void updateComponents(ImportTemplateResult request, String dossierTemplateId) { + + request.getComponentDefinitions().forEach(componentDefinition -> { + componentDefinition.setDossierTemplateId(dossierTemplateId); + componentDefinitionPersistenceService.insert(MagicConverter.convert(componentDefinition, ComponentDefinitionEntity.class)); + }); + } + + private void deleteComponents(List componentDefinitionEntities) { + + componentDefinitionEntities.forEach(componentDefinition -> { + componentDefinitionPersistenceService.delete(componentDefinition.getId()); + }); + } + private void validateDossierTemplateName(DossierTemplate dossierTemplateMeta) { int nameSuffix = 0; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java index 8ba734b2a..76e397f79 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java @@ -25,6 +25,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.BaseDictionaryEntry; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ComponentDefinitionEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; @@ -34,6 +35,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.ColorsS import com.iqser.red.service.persistence.management.v1.processor.service.ComponentMappingService; import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; @@ -90,10 +92,9 @@ public class DossierTemplateExportService { private final ColorsService colorsService; private final EntryPersistenceService entryPersistenceService; private final ObjectMapper objectMapper = new ObjectMapper(); - private final WatermarkService watermarkService; - private final RabbitTemplate rabbitTemplate; + private final ComponentDefinitionPersistenceService componentDefinitionPersistenceService; public JSONPrimitive prepareExportDownload(ExportDownloadRequest request) { @@ -263,6 +264,14 @@ public class DossierTemplateExportService { FileSystemUtils.deleteRecursively(mappingDir); + // components + List componentDefinitions = componentDefinitionPersistenceService.findByDossierTemplateIdAndNotSoftDeleted(dossierTemplateId); + for (ComponentDefinitionEntity componentDefinition : componentDefinitions) { + fileSystemBackedArchiver.addEntries(new FileSystemBackedArchiver.ArchiveModel(componentDefinition.getTechnicalName(), + getFilename(ExportFilename.COMPONENTS, JSON_EXT), + objectMapper.writeValueAsBytes(componentDefinition))); + } + storeZipFile(downloadStatus.getStorageId(), fileSystemBackedArchiver); downloadStatusPersistenceService.updateStatus(downloadStatus, DownloadStatusValue.READY, fileSystemBackedArchiver.getContentLength()); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ComponentDefinitionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ComponentDefinitionPersistenceService.java index 1626486f6..2f99c21c2 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ComponentDefinitionPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ComponentDefinitionPersistenceService.java @@ -26,17 +26,34 @@ public class ComponentDefinitionPersistenceService { public ComponentDefinitionEntity insert(ComponentDefinitionAddRequest component) { + return insert(component, countByDossierTemplateId(component.getDossierTemplateId()) + 1); + } + + + public ComponentDefinitionEntity insert(ComponentDefinitionEntity componentDefinition) { + + return componentDefinitionRepository.saveAndFlush(componentDefinition); + } + + public ComponentDefinitionEntity insert(ComponentDefinitionAddRequest component, int rank) { + ComponentDefinitionEntity componentDefinitionEntity = new ComponentDefinitionEntity(); componentDefinitionEntity.setId(UUID.randomUUID().toString()); componentDefinitionEntity.setDossierTemplateId(component.getDossierTemplateId()); componentDefinitionEntity.setTechnicalName(SnakeCaseUtils.toSnakeCase(component.getTechnicalName())); componentDefinitionEntity.setDisplayName(component.getDisplayName()); componentDefinitionEntity.setDescription(component.getDescription()); - componentDefinitionEntity.setRank(countByDossierTemplateId(component.getDossierTemplateId()) + 1); + componentDefinitionEntity.setRank(rank); return componentDefinitionRepository.saveAndFlush(componentDefinitionEntity); } + public void delete(String id) { + + componentDefinitionRepository.deleteById(id); + } + + public int countByDossierTemplateId(String dossierTemplateId) { return componentDefinitionRepository.countByDossierTemplateId(dossierTemplateId); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ComponentDefinitionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ComponentDefinitionRepository.java index 453f2e654..446757ec9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ComponentDefinitionRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ComponentDefinitionRepository.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Repository; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ComponentDefinitionEntity; @Repository -public interface ComponentDefinitionRepository extends JpaRepository { +public interface ComponentDefinitionRepository extends JpaRepository { List findByDossierTemplateId(String dossierTemplateId); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java index 19d4f8ced..2f017cec3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java @@ -33,6 +33,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.Dossier import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; import com.iqser.red.service.persistence.management.v1.processor.service.export.DossierTemplateExportService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; @@ -92,6 +93,8 @@ public class DossierTemplateCloneAndExportWithDuplicateRanksTest { @MockBean private DossierTemplateImportService dossierTemplateImportService; + @MockBean + private ComponentDefinitionPersistenceService componentDefinitionPersistenceService; private DossierTemplatePersistenceService dossierTemplatePersistenceService; private DossierTemplateCloneService dossierTemplateCloneService; @@ -129,7 +132,8 @@ public class DossierTemplateCloneAndExportWithDuplicateRanksTest { dossierStatusPersistenceService, watermarkService, fileManagementStorageService, - componentMappingService); + componentMappingService, + componentDefinitionPersistenceService); dossierTemplateExportService = new DossierTemplateExportService(dossierTemplatePersistenceService, downloadStatusPersistenceService, dossierAttributeConfigPersistenceService, @@ -144,7 +148,8 @@ public class DossierTemplateCloneAndExportWithDuplicateRanksTest { colorsService, entryPersistenceService, watermarkService, - rabbitTemplate); + rabbitTemplate, + componentDefinitionPersistenceService); dossierTemplateManagementService = new DossierTemplateManagementService(dossierTemplateExportService, dossierTemplateImportService, dossierTemplatePersistenceService, diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java index d783fd0fd..37b71d4cd 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java @@ -32,6 +32,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.Compone import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateCloneService; import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; @@ -95,6 +96,9 @@ public class DossierTemplateCloneServiceTest { @MockBean private ComponentMappingService componentMappingService; + @MockBean + private ComponentDefinitionPersistenceService componentDefinitionPersistenceService; + private DossierTemplateCloneService dossierTemplateCloneService; private DossierTemplatePersistenceService dossierTemplatePersistenceService; @@ -128,7 +132,8 @@ public class DossierTemplateCloneServiceTest { dossierStatusPersistenceService, watermarkService, fileManagementStorageService, - componentMappingService); + componentMappingService, + componentDefinitionPersistenceService); dummyTemplate = new DossierTemplateEntity(); setNonDefaultValues(dummyTemplate); @@ -255,6 +260,7 @@ public class DossierTemplateCloneServiceTest { when(watermarkService.getWatermarksForDossierTemplateId(anyString())).thenReturn(Collections.emptyList()); when(dossierStatusPersistenceService.getAllDossierStatusForTemplate(anyString())).thenReturn(Collections.emptyList()); when(colorsService.getColors(anyString())).thenReturn(new ColorsEntity()); + when(componentDefinitionPersistenceService.findComponentsByDossierTemplateId(anyString())).thenReturn(Collections.emptyList()); DossierTemplateEntity clonedTemplate = dossierTemplateCloneService.cloneDossierTemplate("dummy-id", request); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportExportTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportExportTest.java index 4ca22ffc9..e6f90c868 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportExportTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportExportTest.java @@ -9,6 +9,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.DirectoryStream; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; @@ -67,17 +68,24 @@ public class DossierTemplateImportExportTest extends AbstractPersistenceServerSe ((FileSystemBackedStorageService) storageService).clearStorage(); } - @Test @SneakyThrows -// @DirtiesContext - public void testImportExportRoundtrip() { + public void testImportExportReoundtrip() { + + Path dossierTemplate = new ClassPathResource("files/dossiertemplates/DossierTemplate.zip").getFile().toPath(); + Path floraTemplate = new ClassPathResource("files/dossiertemplates/Flora.zip").getFile().toPath(); + + testImportExport(dossierTemplate); + testImportExport(floraTemplate); + } + + + @SneakyThrows + public void testImportExport(Path dossierTemplateExportArchive) { TenantContext.setTenantId(TENANT_1); Path outDir = Files.createTempDirectory(IMPORTED_TEMPLATE_NAME); - Path dossierTemplateExportArchive = new ClassPathResource("files/dossiertemplates/DossierTemplate.zip").getFile().toPath(); - String importedDossierTemplateId = dossierTemplateImportService.importDossierTemplate(ImportDossierTemplateRequest.builder() .archive(Files.readAllBytes(dossierTemplateExportArchive)) .userId(USER_ID) diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java index 232d8cc6d..3992bb4f2 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java @@ -88,6 +88,16 @@ public class DossierTemplateImportTest extends AbstractPersistenceServerServiceT } + @SneakyThrows + @Test + public void testDocumineDossierTemplateImport() { + + TenantContext.setTenantId("redaction"); + + var archive = loadFileFromClasspath("Flora.zip"); + testDossierTemplateImport(archive); + } + @SneakyThrows @Test diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/dossiertemplates/Flora.zip b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/dossiertemplates/Flora.zip new file mode 100644 index 0000000000000000000000000000000000000000..21070a8cb97182c0c7a39e2d7c606db84079730e GIT binary patch literal 93306 zcmbTdbBrj_*Dct#ZQHhO+qUh#ZQHhO+qR9{w%v1o-^_dS<|Xg@V=AenlD*GP?X`9# zr%u*VkOl@p0f2yj0FXBs)d2WkE|h=ICic$GmZnZBrnU|?hAyUbR?hZzx(c$&gA54Y z)H&HMp-jtYP}^@foD4YSUJg7qS+vNKNpgvWxMROJqePJ%J#oJFP59B))}Wa%Ra${V zu;$8abRLQ1M_u*PNs{Tq3k=!ELliP&Nj!iuVj~Quyruab@DT-pQsk}EZ&Ds0bMOD;9OZ@RgBBzg1@o12j?4+!B zE%E6stXgcoe&^r(JG%ka5=Kp;t)4oHkBAMsDh~a$T=}vGiDxO^g80gqy$cZZj?~|5)9YE*Z%g*yh#r}D%|#I8bZYW%&vw%@v|($nAJ~^c@~>0 z2C=x`@1P3O;1D6md|qOJ006K+000XAM;_q*@!B% zY7`V#mV47T(^&zq0rUC_+@xMSz*|jPK(`(}l(o3_P`$coqDv{4g_T*c(8t`GYBm!* zeBdzOfcq9H&y4K|O+VG5w&F63@mCXA2W2njGPJWt5^qug3_`L2LQ-JhjzX<5&00kf z9DcIzIWnaI;s{Lm`B@E!d5s-+1gB1{!OoEgo5wd+XrDfS|LOAP+n~7SUk`ErkorHP zg!V7v|Cv^07eg0UXBkUpm;WDV5&XY(1YKO5ER9@UOr3@8?aVCA|9@7*`B%}*(#G_E zmiynTnZ`?70|_Do|4N-b)*7s;j%qW2fkve9f{=veW}snv;ZGCS(|qpPA`tF3^p;je zb;|VPwbtuwxfgDxYSc976fl=m$f_1PN3nTHCvM#coKcqFcklW3`kt;< zQVGl_cFz+!L>YcbP}a{x7)9}%djyuH?$ElbhdPsHFR*WwEJI>tyPz{8?ce=>9t+}s(f<$l;-+?{PKGxB8waq_|MgLT z-Zr}GfUFLeiV7*jQ{nW#*u|6n9tTq$-c;+c$`^6|xo8!=fj&*$o|O-zP8T>^$X>o! zpyG+s(yS9_#k^c#)Ck{k~$fBy~f^_;ieTo1Tw z%E^fI1#ueyU|0AfpFcp|8oGm+PHWU7GHvoch}8$qhE2B1T=bx(Jdoo%!qC-)&Y&SDfl zZfGvlHWn`O3EAyM5}_}cSWOk}zxgz;I?nl)xewN?3UZFBSOvgtg_<36wnHd@-8GqOd<0y{l;bbK?and-<(;}e z3>hO)8!u~Ma^YLQ(x%t(9tH|lZH=YTLvHq&aJGFJKlJv#!dNHazNzhTlhHlv5-{E` zc#zEE-a$JIY`=~J$-wf((<^hC>#vvJy)z055B~|s%Ub=aVfGU^`mVW-=EH8`;yIzh zz#p^+fgIs6E~De)W^L3;czD)MOWTQ(tJ}c^2ERukY|&yNV1bT}u(`sT z&5ntSK`qdwF>hODwQA9QP+sMJCSmkz#`nhl4#vEfoqfr1zgz-w8}QfwbU+GlrWYT6xhQAt#-j-NVAB;9koZ$tPs%#|!gwz%t;R8y{=tZ{ZP1fgwka>N3$iv{Mr*`X!rU$baUHu^Eq`7JWwe^ zouEKVDF*Z?C*-qMH|8;SGzEQ(|1tuhe?UIcm$OiQsBPA z3odp-MXqVJjteu<1>Yn0TJ64|n#TEC_sf0d{xO;_#-$73x!Lnk_v^lJ)3QI&ur2y^ zRmv5}p#*%R*Sbvqk(TB-Angd}ZnKiZO+2LRZay-dnC z*I>_2*z0JOv{G^z zedYlvW$|oh84v*^BPmda1rA{Rb>4Pj469MtfQZ`S zA&D#YaB+t?%KCG?k2v~r{V7I7g9*MKCj_!`;ob`QxHTBAlQTB9-K1$uo2ONKitPwS z;>rL6%YTOKc`vO7>}v1Hoo_JIFN3IBzTzu>XDADr0m&&8a~}M0z1TQbZh0xgjlsC0 zP}QW>Z5NX!E8KQNH^4KpL2Slhs7-*qEXz|j0Y$%P7lU&R=0HS!0a?XmnQ6M`*)-<- zBA?AJtu0{LgAoM2S>COfqELtpyu8|8sj0>W$Z^=uKv9t#N?3$6tb7ZwyL|(TjYE(n3>}VACGlOZ^QlV)-GnWw=fMmL6hvOvxT0SOgT#3 z%BZZ$Vk4Ks1&YN8M)U)%HZcNxaG_8}EW>+&g7U#sWqw$-Y7`FHxNmqg2iG90j~Qy{^SFUYO%xdPO5T8T`QLXXM4lT z1apNaaISx06SyA-LZ-$L79RLKU~Y}4_R%b4I&F@btl!mft5@;D`haib&G+*=>Q@Y4TIC;i%@)`SY+LN5CTaIJDTN-jN-k= zDYJB_uq`Se5`flqLp4@03~YNIJVpc26WL(oEw}tHou?mX^a;MS-xtpUslVD>X({^f((~1R?)N+C|uO~tP~KC4b)FViPsuWF-iub`=UR7_mu%c$r+j*v4%|NXm50wDj^4aX0e;Ro_Z6Re`lAoO zOrYm$pFMe>FKt)9%UE4~D?ftUS7dS@)|=bOmBXbwe}8RiJ=bMmLsrsTK<*kR(G5ib z!KCCRg6jooI)gba`%m>6!{3YBR2^W&h*sD72ay8(e>}em3mPaqhB?HUP_+x7Rm4qwUJWinnKCGuM0 zS5arUtXn2lQR`(At~e5vM+7BY1~a|&l-lKW6+BEK$ivoVGabnJ%_eb$eyY@4Z;Dgy zm3>fdlXV5h{W&^5X*Kx^B1o>L)D|p^$zZkY(I&7V^MJtW)J~S3+zR8^ELD`YqKR%4 zlA8rCy^06&vEGuN5(V6 z&xDO@;O9jqQ1|Lr@sWs5km^0=MQ{hHd*0Ak02jgatDCyq$2bZ*H=Bfb7(VbXY>c)F zyLq%Sl?4PH;%94!x^EI*82l08bK-TP@3wigG>$r6&U6U)&!rul{t#>{n;FcZaoS|N zL8nU@Ud;N?k(_O2e=1=K>I3#7T!=Cdf#d_;u~nJ7+}=xw=t)ZJ!`6+##jgu}~s zu@YFrcpAkBD9MY-Dz6oP)!q8#zH&kO?iuzn9z!~#udOsM#WVOmJu)-yr;&-}ZT3Bz zrKqBCMiOa0=!?~!JT>>NXw}RTD6{h#IXlK>yhs_(s9BPN-;Lkzo?ZxLKtqsEosQ{s zM=FmwrP*DkAJ;$>(P2jv^}mX{amx%MHU}$8UTk6L=G;`s!#2V`oj%;vXVKw7OBEGr zuh+YEXm@>OS|~&R=)r+vpLFCj^;_$Zghlk39#F;$!*sLM&<;LBzdT(dc;D zb4uGA>};kBu0H^|qhTC4f2^o?hqK1aM4W6XPvLdBX&9o`XknQ<9DLxYvkjisrSkIvlRlv7`M)HZuhi9@8s(kWwGTA+ zg?&1_socOh_nH^_tHU@s`=3$U`M|7^h&6>{qmTtrO6pGg#`<+JKdw5;?m6OzI~vYf*yhMaOx>(l{$6yu-^Yr4B4gWfng|3B zY#D~xpUm&sD(|zd`CCO>+6s-g+nXHr!sh$D7L>v~<%)aS#YH4PshMWBed5!Fs{7MB z@Fo`-7*&wEicgznpYe>9 z;QxIg?7tLNp`EoOmMa8`ox*99&_X)yf>%y8NyfiFCKF5cx%OViL>mO#H0FD)@jDP$sh?8H3{G7E%v8~;7d z3GjC>wy7N#0kmIsZ*1Q6D_EtLd=diB1lrK-Z6;Y&m20^jH2IraR1ha!QIArztlK(i zSGU$dPQ}!tCwjR~9HAYn(VE{Roy#T1oMVnua{KWO7a=Ouyg8)TCB6CmIMt+gS(xM6 zDgLaOo{I$=KTyv)&HX2NL50iLtj%{7=&gniugKz+9)sOgE2lOyFQ0xsWfed=O!w+J zDO%TUSRj$j)%QkB5%*mSKYg-A8B7a}5yqlSY;&i|@D_!EX*>BWmN~U$jns+zWT+N~ zo^UGuhY}emB1a1yckzS4Ck_lex@4`7!Zn(dIp%s;Z@d24z?CnE*p4|&soSl77F&|B zTX5tKtu6sl_>aS^1$PZ=DU7dsX~WWB6(E4~qLquSc=0f0I&~+h9qv5mvNoQ~dC|BN za$ER$<9DEx^|IrdRrszNr;fBvN}&rPy4#pp%eQNl|3>lk23ZQfcGj}nIj-vlS``Ec zjb@%bJdHi?9teTy*Fz>Cb%EmWvlzYHaeI^Jm;!1gsWArvN)Ii-2;p~2`?#lL!msV$ zG)HJ~Fo#l-iNeWNfwW;uArBWwWw6eLT&$@1r{w!kc}&Oe*e0->hoacIY#yYl81^&c zgaI2@xA=|>Ty7i_2WCGPa!4?UBi#D%%XP$g*_VEdWj!x)yCMuAV{qZzY)*t`lQoiS z#mSXfl+nQz@>|-2Vynrm0?tyS! zepS8)BF4*BvDza~+cCY_6FsrLr;~63wtN?w1?-#ZwWa4qFZB}Jy`-j{dhH1T`RFUs zQlh(YXs1=q?JZJs+b?MQ8;1=Zr4a-bB*d|zeW{VY0q|R`Ll$>rnD|q6LshyBgKzC>Y z3r;8)+{)HWw5kK$t~bnPwI+%hs75I5Wq-MbkQs@k#xg_t(uq2g-{3k{t`O9)GF~8( zT<4Wo2SV%3GE!C@g0`t{wm3f5HCy;~^}Wf%ys1%_s!4tjF#TTeU^C9BDQ*M$y9DJS zi`J+}Kpk(?fEK7DUTknp;^1HHK$@o?S2y{Bo6$r}L$33S5jxgJ6q!x$JbZnvvvG#} z3n3Y2wdex#IUL3&AFM!n8-J>W3fDXqQX>7A%S+1X3joYmIT$^dNK;7;SBSk?vUK$O zfg-bpD^3Vl%In1gpBp=1fLXyKDULW=AU&qU2AMD#?6Wt(QU2-=9t}>=TUPyD#-z>a@&@$6k_*u_Fh_Z5PLB8H2D(iwc*@`%S8s zxtKAZ`xLm$tL1p3=Xu~FPIBV&!HfT&i9S{MRCyIFr)hU$p>6r((0H0 zYC5#jsRt%U76PRmsuwCiozR%qee%r$yKYfK{k_HryXq(y(bhI(u@?_Gp6pLm-1$)zgQ5x8qY41*g(L1&}<==*efcvg| za0BfYp80XXlgkNh6@s>akqQxS;Z2!}k(#4agE+}_^<>{Mv7)+rC_Vy9bjcFc;jE_X_RyX08*8F4QsnTDhFA zl=HEv)x(&&T>nbc11DvDRZbhTN-R!QwV=O~Tw$Q7d+dtAa2CN&;?K@y;aZ?rHrmWX zG&n+{Nr4iBD21iRJ_P2PR`o2>IssCjM)LherZ7tF=Vi7XlUaU|F{y8YW3J)!os&w_ z0BrVRib3xtYenw`K6w0CGLnl^8N^sLuEY8jtQjB2v^kltsYi(~$vZo_`+pXNKvn8Y z?gJzxdP=UT7t>Mfb$7Y`RMFe~@zQou0-fO%u2yUXbp^Jr34FpxWcP5Uw(wy_VyTtD zjZi@hObS#Bw1g=zMB644S60M1g1r&L0dhUv6)e!b5)OA)H1VTKwvF9qhfk~ zsGtges=_qEq=~j&3Yk0fTzsg~?Q78h=+e+<2T16l*v?&^0qw9C>Rm}=Po#DrVi%;q zD4a=5B+Kiy!5Q%ZpREb|44+O?8X-b7k>O7?mpzB#-b>@|8%UrfWm*ke%j&DI;nq@p zrNf;QA4;5!Bq%Krs|vuWSc*!RiTA3ROkC;X1%%~gV}w#?p~NG_VRyo|hN||VY8;3Y z4P6ys*ixgfF~#*$%+v5FG`S7W8$6cz83h*S|0@K?iNt&~KGkbWyG>+VW0ge7@q)5o zPn&8n>6kUsV?jyoW4JmkG-ey_VLsLZ6TAkiH5~a zH=RzLw#aD*d*pY=mI9*>6ZxYy#5=?5NjolReJ3BSj1`idc#tsh(j|shPLPWa{JX)L z5K-nthMnT4xK^Q!C!GU+m2PJ-m1$s1b&(w+(rB^B>K9!$PP>*|RFDblhYzW(3NCI8 zWFH8q)FUlWelW-P`3UyY%}3x*L@*VJW2ik|Tr*wJW69-DB+BiMgHWEHH+iqh z46y-)k&i(lB0c;nKm0Ax6oF1N)Mlbk3NZDc zDYA(FmxqDnov3riwCBuLHdRxksB6Gx$V-h2pf3X4oOrKRv2K!N$oBoPI+=TF8)XOV~86`pZX52ypOG><9&G@6H(yUYZ{ zWBFx2JOZhmJ?9wA8>3iNcHfhyR9xP0YZn>(NP9`a1T9w74GmOP>Rw^Ts?T;q_d?6&4Ep|Xmjd0I1#)z8-B7*?i3)VEL!}6)}K4UweiKGqg!UilnzCbFx{ZL zHqcVYDSieN6yJ`M>LRWd%zhTR*aGmX%gZ#@K*#qOVV>g)8gy2QVKi`{Blhrn+h7e= zV?>;8eG&`T?=FE%CkgSS5Eq!UH7VL70tNHSf4eVAY@0~aJ?^G}zcRL&h_`xV3;E)G zc$dN9!%ANn6}ZiVT<$80RfR*xR~RVKMQ%hldcVPm!HfxQV67K9)gF(#k_2iDHYE(U z9wyE2QkhX9G=j?3;B;(%>yyZ!xep9$gqR#UG$&TIA}r3yDMU^40r)G1OKn`-L=VZ4 zivL_^dRM8y0hH;9l}kyih&Eb}wKRL&Z(U<|eZ~ct+#~LAxU&z0w-TBQmPG#51=<;aDy4C|RJV>mqNO zcFBd2muXU|KwnY^_(-!21+u#7QO#zX1R1KGf|>6=xPotP1hd{JH;*f(N@zOoZbZ)A zoD_o2{HjCwco=5vvDy_gLW2c}E|BM9fHX63_Ycv*SLY;)iv{_(+mPhYi=X*)I9wFt z19}U}$!_(sis#)gw^ANPLQIXEAZ|UZue^BRGKSjiY8y{?Bg+Cyg}~;W=A93rkKvk^ zaz|VG;t1dMS4j6MNwz#99bpOag+?6km@_Y67%!wX>*x@jU`24-?ityMqP1p?_1oQO2j_j5GJshHo= za_HaY&@j|y-PQQ^&o%&p2u$Wo-<=1@$O~L?5opdw4TR}bBr5Uc9CXMN#c-qH zPGuoYnCXjDeGrULb?PPKcHPE2p3dV&-Gq*Ho)dw=(yHB*g8hhH|NQvK<}nuy+Difk7N<9nO& zQ`)c>o$~?;JszxzcXOp$fM8Sx2`vw6o=rl*$KU;o+|RBTo*F5!A(IOVhp2Do@2wA) zybj+eGQa(}g-sR}uGw4ra~L|?)rDVxISCKeFaG%+=YjD#!pmTX0;89NS|^cP00wiGOI z0tJ4lJaHiSW#t`@{>gn*f( zl&hUyb!=1xe+QcLtt?QK-0Zh~Vh&hwK8y)^UgZ=Tt>`{fYDaL8Khl#@ih^i{u-N#+ z>|ROrXCKIv7c{M+#w@>f_oc@e2Q z0_IXJc6XaUUS0r`1}Q=Gug@b!6)SVzaMb{Px91lWeEFb!)-3tYa(O~u{E1!%sbfaS zU7N-a7&uxqX7dz%Rn2)=8aRHB>$2b%3DywD(|!qx^8EiGbLNQLQ5R=>HO`Z`nMMdLVeoNX8j>rgHLL8XTTH?9`dQ2Rb=km*#QZ)o;43ZUlCjnm+8_E)8ch-%Kp$&Cv~1HT z3rLH7_!A#sa);_M=CTz-=lL<}S%81K@qlZmC`-=wU~I`$Z1)8J`j`_*OUGfvM8z~7 zj;Mmnk6W0t$8>-FP0+e{ghrE9>8x(Vua}Y%S8!}h-7d_!p4HjxMLTi;42Mikd_6F< z5xIj%Zn#!Ff|K!ytUwz(=!CNP*$r%P0-SDG0m9G1z8)6P8*2u!%mAL2J0*bV{%J#uQRr)B@E%DL8l%<+Ep|6 zZ22QQpww_H$g<=sFC$KshhA$WN>88~@Q5<+bhhfs{CJRv=}PXwWa!KOxF`*a&^yg@O@HzE)!zX#;8 zYqA--o|4}b=4AYXvW_{UtB0+Xm$}=)BaSJ>2c=#6xQm68!fi8DiNd7nEUiH)PWeOY z0`wKr1#l=b+-`%zu*Yw>9P#?M*_G{V7bIdMk%d>GM$&N=Vo>x^0(-2jIRn|=Ic-1i zB^S%`kuhtsL9RU9)})nAp+U>k{m%E+NMp$ih%rjF@gd=@yyCE^@kylt)xIKiNa>SM z`r5o{S+#A4pZ`|RWxZ!0LpK6_$&4YrO(TCt17pOxNweFRw5emmwj_gYx50>)*p*@f zRrV*+UH&lsn+Hxajt7&hmgkU1*9C!TR*-XaKpQ?HN`m0Z&YS+&VJgpTmUCuE-7C~F z(6mwk?(Z7~V*0?Cg+!&W*C(w96~p1!(Tz{w+AG;av@ew2$dd{gJ6`f%G2Kl2@uV<9 zdA!skN$U9%qgAsU?KI#%-l>os_;(t4O|_aVxGAR~tgXKm_=ueiFV!jB`ZZM!%?rH) zS15}d2R+}VBK9^6gsR-AJ#ZZdEhH~jIBizHf9n@i6jD)P*%j6^vBH4LuR-}QzF$(< zPB0)K4eN}Rh+O45Qo`$;#(Yp>-zjP?61mXXoiPoAA56KGJx+NQggavPczk-u9-Ayl zc#I_9x|MEo^k3>icVZJSaRsuw7ErKg&OHGCW>0>G&@EQ?R)mjtk|Ewplw7R#w;Hh$ z%*}OgL|by2AgM`}Ajd6oDVDfLX$UC)s){)O#Yru+aSc`}r^h9+L?j}uu@~B`2YxwS z2Ib4(%(b8T0gCQo`7WvIo;&TZgbjSPWPNU`E(PmxN3S^utEv?un41PSr+lm2y_i5O zP7&t!UhBJn-OIa;EC5R=3*|}GZB*x1vQnss7wKScgaC>-8`tqFSJ1VJMczeUawDVD zNN<8@VO)UD6I(PVK};536+2e7W@yXYCvWv48DP|lBV}nwX361yI`$MtE@+{329+!$o@rD~(R zjKMgHz+mm50Rqu3bA5K#2+w=x{U$ahQ zv@Q#c&+TXaBzit@KYD4x;Kw8kYrv*y9W}m`K*bX!FmpgNOuBnnQp50w)F+j8?LNjH zVDY;nw5+P?33ZA&8lH$az4|A^GyJ_uJiQtoX5{A}ytiNXYxJ{l8rIq%J&1@t1#VyBfeOCZ>dZok_-v0`~jK=jfuJa83ok9-Nv&}*&eR)3p){Tky4p||tU z*#ugil_}9gdTkN(hs?lJtYV3pV-s(jV5*ovh#YBWL<~dH!?LxZgn|i$i_;vE&rM9) zrtGdf>M&k+t3i}(xKCpIJ!G0hCLu3{Hz~pMqTPlDaTVbbUaa`ePjol7hCeWFTV>ty zyue4ooF`Q)1$sr+{%%8y=B(X)?JxltBPu>e^1JW9#Gv_HEdH-#002*@fd7r^59yy; z&e-18!QRf)&PC~e$mag)Y}p-&A^Ea{{Zr~C$thZHimC>)P$j)}W_mc-|_MUPM ztfum2dHanA#)q{|`2CIRzIAY4?1T2j{)y)GA04`N9+9zMZS#i?-g^yM3G0h%rMzQj z7v6IIj1!g${-S8k$@j-T-G;o$TAGWu2#ex#M_1=zDWhNR_6SuWB}f$jGphM1!7X+> zpSTICr((Jl(X>MN2%P&c&pm=*e)`HUj-CX;t-@|E;wOD)cdj1KS&sgInBkG;@TK5? z)j0^w5C3@n{;<_;C*0pIEZ~@Xn6^k=xPT#umr;sPMVkx32T&ah*>l7SKXC5Cm*GrJ z=5iLW2PDO{Uqmlv{o%?Il1Hb0(w83&;cnPTLqq(C;>O_A7nm*^`7$lhab!Q7MJG5Z zLSJ{{uoIi~-a;%Rl*xQWL~3Al?DoE?uZ*3Uj*PCU$;oMB{b|@EI@lsIaD}qBH9QBs zlo3f+WI3~8e0#mtkmoVXVA`>zBG!?%Cu5|sBVs%wVb!YBTB^n;#@-KR95VCa3nLBp zeC->Y)?AX4PKT>cWOF9fCgk0=aHIc1CR<~Z(&~>)_@^pIU0No)$cti(%Vr26Fz`EG z{`Z62IID}H871#_7XFjZFTnLhV3OQFs&}k~^iWpea1MTeZ}fucPP-LYLBL_y9_re* zvHof{zh&`msLN^UE{rjD6^5@7X64#SDqpZ`pbCB+rE-CN07G3 zl%8FjU`^pU`0%Ir9SlkkSqEdEoL~aB<2sON?XFvQ^)N%l%(6(z(1Lx7AeC6sa;g@+ zc10;J;F0FS4 zy*p5@*G_#~!yKdK8b;xK)D>-dLa;k>w^Ie~qezMhkjHituHCqZdtetXYT0nZ<(&i; z@zTkgJ(P-~4`v1Khy5hh89r;Q@%&RQAKX=Ts;bvy!lmU#jb67`t>+$!j2c^M6pLDO z7pz&c6q5bdrA>uc?C`$f9Dbme(ivC$jx46CGS;@rwak#LfT(Y!Hch zjnPTN=(weAdlbowKY~DJTV|pGWyFqdcJ@dvP8yOcqrw=IyH(JR3jDBylc;f63Gxd~C7vz|a|U=%`4GNz9u&XaO$Oj>K4<&?9?tJ;v0>p=`ULpm58n z8TiB?=EO;$>)((HOd8-{TMkdvHkzlujO>^?IS_iGq0v+@4EBpAbZEU|;NHN%#dnI~ zGAkZA2wOE@3U+~my1B!r7X0M-e<}Y}LgIGzK&Yoil;f>pefAc;cy-!&3%cDRJa2S9 zdGAHfSEKC`ptgL1kT^guW7Qi+ROVb_!PQcG;%b+dl3C9k~Y;{aN%PC}JTCa@t!eWJMF z4*$MR!Us>rzfZezUz>oj;De7 zfCI4WZ}8k*egp-lx2Xs&?up1Z%1k@8Im(<40K6yT<}7`mc%U8U5b(wW?P3zHoce9j zg}AIjXF@o9bU~{s6~=E34^;oJF^3E;>UdxKkn9|2VxATPhh&!;>ZR?D*A?QBGLxK` zq^a$XOy1m?+SX z<}`o|rBvwxAj1lY6;_d|^M#y?^OdZ#^KUjOP-&?JQqUy(BU|VKE>v^_Ie;-=*4dD| z`MO^0>kW#F=4GV!jeWcWca}O~b5>P1P|f94a<6Ny}$`&)0idI+<7o>P%>ms&YkZql87$e$TZWdIfCy09B=}9 zm6TL1sSjQh8#wI*WO?O5QqZE$I;}74lMD#x!dS5DN;5-SR`M=?jL;su*wM*ogM2`i zU}Z2JMLD#e6H=)-DufGvmUYjw@K zR$+*7&L}$fXhb=kJx-|@j>tpTPd$DQn2jsk+4l}*QK#k+UBtHVGnB8iWJet`C6!`8 zWHV-A?B`>`BNvM-Ib)IoyHdz~a^kZb**${>sLKlbs1|hTM#V=ox9^02#zYx%qC+VF z1C}iL!5Tc2NRnUu6t80Ima#_$e9#1<4dFyg(Xn?E5lP#-nZ9YJ+cREv9pI7c z4Y;eM6=2*m;rSX;dZaPcDRLzn(>~dWQ`}T1GA{rU!+S(7f)Esg-jJVLY7R<`(#eG$ zz&jy=N-MPi1Davm$TO=hemh~O$u|LP>-rOIK17cwm)yDvXP{srU$~IihBIi{tx!tZ zAXK6OD&IyFo~cdlv@;({y|CXap3BqrcgpRFDXl` z*h)J7*MVSOGB&}4aGX?1-Q_PcxJmkUN5@!OylJ+!5$-92{M4q8|L)4bs_4qjHw7zf z&&{Y~>;QvHHiD(Dm8!j1o?Yq<-qG;eQO5U4KnFkHeur`aeBH@Ic4Gbv;&=x z9rqg~Vjz>JNSsoyC}>q-=mpqLCTv}hTD6xgK7Z|eVmOS;1B47|KC@?4{}QI8YV`xv zNKwXYe5=){WBC_k7n=?%hr|fIdL!25zRz>mVwq z!*nyG3zg197zt}J$Fn+cXPFIkStwh>?Z}mD5;GdTK%9*WrJ&T!D1{PHlD=kUa&zK0 z(}5#1U&&demd^^QSSN+>L|rmBdzH^UT_MdM^cN5(ag9=31gb2V?d2#?%8<{5DI{M=2qu(9#-H@3?%&+t*Spsb}TCtVxO3gduJ%IDw!v6k~A0pRGDZmL_altigXlX;qWlMsC@i zb0TGMAH9{(A71+#HV=b~=r&6et-m~Rhh_PR1Zz&H`>OT-aw4pr``mbMXIEA=#1FPh zDP1z>o=>17-M195^MB~E_&;h%mivP}qc0bgsxx1~Ou#g17<^?{4>A!BEXSaQGu-DuT^E;If7#?ifO zWUU@ji=5F)J{P(6NyCAkcUM}PD}ITKi?b}E=PyV}N1nH?*ml%7t~8WL6S>C?{(61N zk01&QH^WtXdW$&Hp}=$P=nTn8ExTOE5Pjn=HKx&u)A#{)Q)J!&0GV6&VsvaHw zQ1;*1s|jUsGs}4+QE!*wGeP9OphGP4fYX z>1Sx&+!hyUWpC(Bq+vcFPP;raTMJkGVvv zuxuhS9WO)Kj}n*Pr~3ZR9NxCQ7)V0am?(~aT9sD4ZpM+x@r%p-RH%o3F&lH<7Ushu z`_!M_!2W|*GD1E|#?aF=|p?Ynf`O z*tX$yCV)YnC)$yamSB?<<7!#`0W8K2qdP}Su){Dc)M#aAa7Pu}_rLDnUtV$$XVz`TS1(Jvwr)h)_OBluFW%>9Xv-q;AIqgg6? zL|zcK^@&n7y{yoxm4}6$X|0k?2fd5m(5U^{UV^u6K}udR($skh0aqp2QFHmKjal*~ zrUD=Q5vGGe9N7TN8`1uS#i+GKHfO%7>c1NJ zvb8XC*aFr$J>9bijB50~Z#Kq1wmvE+TGf;6qF}^GB&hAvxVkh>3WZ>0sxPkWg|*RS zkAOKyZ@(?x9as?G*P~tYTi)DgM%P2Bp&+l$Nw3#JzU7@vyvsa{;<{_}%^;8uPzHMwPtC z-05yd{FG8p04`I8h6HJ>G{7uT^XmCS@b}$2ra@Fj1^T*r8N@5OfI=R~5Kvv%85*f! z3;2m&4V0Qdgyb+$%?qNZRIb#|gh%n-@G)?NpT?e&RsmPX zNF|#izK-;5_&XUX>J8QvB*R3k-Z8Ipp>RbLbuqd6rfo7j(=6fZ`dD5wV9AnH|Gu~g zui|=;Spr-@tu>sg50LyL$yv%*w@dtmRjuR32!`)uE{7}jxM?$@?z^3(5!?j>Bx3fB zpZDB+mLHPE4uJ<__Wm4k;DQeSjSmB;fL2%J16Q&?>gRl!0ziNi48Y;`CcF(9etl$T zVRB^TzRW@OY=(0#0_iPFdwVjvh3PC=Mf4mik^>aA>Ab!F8(&GJFH()lr&L{J2j{-4H}YH+D22Eg?HV(%@ZvfQ@+Z%GO1?vxG* z0ZHiw=@OCdZYc@rZlybDLx6k_gIIFmZM2K zN*r3~8S{byUZrJ*3C-e%$0}q3R=!U3K8WRZ!qhu>g)mV(tS7TglcMbaI}d$G$m2dMI}c}B%isI)pFLoG zrT6q&^1X~N%T1$TzrUZq)G>yrd zwkvvRLbOe}TQp7Tc*WozA5H_!07==0Tz9-p!bf5bCwQ{HGxdOzy)vfK*M;^CRxiDm zu25gbtKhDs3RKfsn5DwlI=GiTr8tl0B8ZU-2qEn%3&B4H=B-n_*XJJCu^O+KTdo3w z&r*3wA92*PesSKZS$^U#j32~tUMBJmT7z#<40Jp0!8>-jiRr}62oaw|E58lC$#mN@ zx;ix;k@duAOvv+6mmyX)iYGJ2HHoUqV|@pl_h1UYuyM0U+P%@;cQV`Or*{=kf0+|G zDr}#2VxP(f{ZXKrWT*jrrO@Wwe2=#pg&_TA^3#c12n?R>XZ#nSn0=C@^laS$k%)7R z%|-7UtP!k>++Bj-yda!)@LQjAl56hI<)olP;=UlcdXdF<`ktbNJOMYO(D#{(U&3+g z;B%p1p=Xcs>lL`696f|2%4+K5uHo+Upa?vO62qSDd5Cmn)z;?BQq29}S)e?4bL2B7wz91adA`(pOrClg@AvRr=?tkE-%t6V$N0K`-uaPCFJfbFifgPCrX?;^gd&g zEAUTzLQYIa?q6g@-)n$<>uk?U-d6KP%__!;^4?8^6R+LV*gV3* zh-FEyc*QNmibt5JR`fzu71^^mmN>}=s)Po`-I+ehzOaLZy&{u&o;wxFqNTal=u_Dy zZNgDX+hQ%UJLp}39ZeXY{$Ov(!Fo)oD7#%hKK&V{`4wi!#LU=Du8>D6ngDi7uFi>s zr?wk>uWB)0~&f%*ZN_ z8L7UET{ws~^h7*nqIIoG$^5LrDO&u*DD%^4EtbYZcDRzWrfMy{@Ofq#roc7mmWMiP zn~u;5PNtSd{2Gv#e&KMNatB@H0xZ!8-F!2&yk2^*PUU3hc8I6~;so9$QH_Miqn_siECgbYlaNyqPEE7tllPKEey$t%U$STZEu^Q9yW=q zf=Q)mL)_GAXLsKp4~-DbHf(|M4P)1*Y<^t( z40=#noz_7g4;0g~GX)n$$$n4MMvAo0=Q0`})K43X=fqoR2lSKT)}5a68sMC16$@_e z#ThTzX?M<_a9l}6I<2snTSBP&(4w0aJacX9A^=$kJA~u$3MOsJV7-68v@R`tdND!t zKTo^jerAdV)jmFkksJIkm)@m!-HGK8s_&1=w$5ql+X zUM3c~U26p>bXcB5$DrD4q&AwMZ5$cOyK&e1xK+t>qkvZv{%+ZiJ*z7#1Q!ylYaO@z z{8AfK+IGzQ6F0=?T>N<()adM&)JaTCN&JqzsCaquxKL>()cz<#`#oW!70ZZfg{+`hfs3XqDpgVYcS^!PWag(n;G&oHg!?MWr8yJho#zjLvP83K=A~} z!LOL3WVN8&mHSrM;+1l(9YMCe=ph*{^q=)DCBO_BL=p6Ik#4jGikPewA;G=S@>^3{ z*XkkJ$jXFPmmptoNRtz7jJ452*UC5=N=iz!#GqGrxVu!t(u-Cvpi+xjk&&fa-UCr? zJY`!VGpEMx#C%xl6J6yzkD#d0Bt7oy3%c3&7Vw7R96Q?JloweCf)?Ws%+FGc&|SS3 zlA8+?;4RpDo-M?f_sEDP9VKl($Ejp(oFN{E_D+vx?)BYDXD3&lH&mBEE90ITB_LD7 zWn#_u8H#N6kzUz=7!eqluh&rgm=moT^J)a|t@go)oj!X~%a?Q~)uXt#iU-AM(X}N` z;^6iUX<(S_;^(!-)WHr&tn!f2E!UzPAcf9K!b-iNygJQndLbGxh+cWk>9y=*0q>u9 ztBitbI+cB4YUgwpT}0+>(Hcx`56((;Q=~<6mTNlA^^0j>`}~P`B2;X}r&6ImS#=mq z_&O2_Pr6{SJ8nlKgn05HSV(1GP47l>5Q0JiL#(asN#=a7d0}BEM(?C~y*YuebAk@n z>bhYAJAvzzs}rG}Y$>~R*FodW?yfQ8S@=z7rXFYSChlX&bNlnvi5&&%kqa8c?w6O{ zV5DpD_%Fs2)7!n&USv2mgLUYU*-WY@KAx#w&W5`fm>`|NL)tM!NS3g~`s`nBa4^E~ z0`+C_Qc2I;&WyVCXY}xp{%&=F%VT{Y8(Qy)J**zyHsq7{*>iM+>SLR89rFR}+p_JHq75s7 z(e|T_IEY7PY35_WYEDWkVVp^bz4to~Y+X-2_L0*la7ygg7mkI{-71S^M1yivqaa0khF&5`lhu7Biloy__sGgCsCQblu*d6IK8zd*YV6oKm=iTl9dyd*rGTuaH=>$v^KBjv2J_~3fGssp?NQMBZK?sLM@ zoYKi|#yDuE9HZH6?Y1z>na&UtET2G@hFPL$KyT>t-iir0kn_ko&9Z4ll_DOaNrwlJ z=4Q{R|eVipwRTBML%L{0c5R^Ah@x3x?szi&9L zyp+)vX79Y|A_{7>5sUmp zBI?BQX$h%bg{GeGgJw&FX3PAoQHVBwGn}zndJ)k&R#zJ8k1WKxdb-3W*>WuTqBATy zWv%j>A$k<&WU#f}Plrn8k&**W1_W#E4=i`f=shV>tr^-JKDF;RIr4WXv9$^h(FL7P z>kCNj8}sES%Ws2D7N0=jp4$@If_Fl6Ai7=bJ-_};`7lzhr21|7}rNEmqF z(6%%9bFh86M3P_F?iZ>)7?-T9^WYKl(?<0)a74@G>EA;3FF0o_=;Reo@$1;68Jmk1 zq31sX8GeqKl7J1GGU--KyXNwNYc1^Zv8*#*;pH>4lI=O16=OKM6Dnad3hu$k5V6Uw zbRO`Gh#2Y}l7?!TIH8mG=dZS^AVH)gp7)B*m0~3Nr-t8G$QuHCLJ-77V7;Ba7_a`I zw^DNaK^Adn(q#8oWIR)? zKv{jWj*7?<<>MrS`9NcobMn~P!F-%p<^t=wr4M3=sha_U{$l;waJ#M?t{}{U4@#i- zlEiVLt99K+ABv~ag|9lkyDh~z4dVs;97|BRN%o_l)Z(drtvS6YvI~cL*vAW>kY_Xl z9ZpN-`cyfH$AY$d$ztJqKE5VSlMR$d+Z)o$-MBPnhc^y@v%6U#xR(W=FIm~(f;thL zCoI!2>_otM@7|8aKJ5OkC8&ohjCsEtO7D{w;je4G)dH+LZO8qDT!=;rWLkP)Eqju8A%&bO{2DFZKc0 zSR!QTeW5#AeySQpkEI>rX~=#?O|YJYV(+kSJlZ0H7T{FBgx{hBQ$4RAe*BttWt$ap zp!t4g@GxRKwFH73xTp^q93$m^EnjTcaoYz)@isQ_a+e;25e*Q>JEfQDThoz2BE$*NlV)afJ7 zE7jL4I^+?Ag=pAwp@VO>t4d|iMpA~Fu84h+$xM}Kz1U)q(A3d|vgl>TZK7&v>Wf~7 zGosYP38$hlT8`(B=+!goR`wx?>y^5^=qw}7bH>{WEIZ*`@?F<;;21aTh2MXfA zmE1j{r4^jTG>BC^Ap#K=ZJ!sEXGq);;A5gzMbi)$O1#^hSdFA}58h*3jfSY`4em2J zRS`KNIgw29QuVNx)c)7vB-czqXadh}9D0S(s^MX7*5>thPZ*CBhU=Eb=?B+Jk5{ed zqs>*OQrX)+@A@G$MJEOxf53w%GjDx6))q0d3%Ap@-y>ETe{zv^VOJFoBR)?oFF2S8 z9{eKuNq`KlQipP-WJJRJ97!tH`M%weH?5zYi)f(67YvyQ4-_J3`5C#J=k!%qs@zr7tJz zNk7ceCM=#|I*1;bRBCV6mZb9LvViLtjcZ&D!SIQ*LjH~^ua&@4IKj)9(dfui+Az-X zhvCCn)&pnhP8CSX{8%-~lxiFm7MXnn#Ms`_OrKSW&6&b`+-f%QPz8BzoLNDqio+LY zYD-IP?sJbGSyb9rTzR_ULnlyCID;cy5M6+8&%V;|5Fisp-fYe3M&C1E74>Wa_2aiF z@&&Ev>uWT09eZnWNpziZJ9Qfe5)UU`Z)j zQ`lJ`f*Ojp)g$UDF(Sd>sh4K>MFbypnRb?6uWi#1-9uTc3Mh}R3840EpJ>H9-Ld<^ zgBHutvig9de-F7V%v@Bv0xm+nghKOe$AFg65{c#s#nWYdmU9{`6qyvsH(Q)NTDHs^ z+VU^e=w;UHwqUbK1Q?s>CgqbWK0S)1Q5$>zSx8kt$1~E?z3#c2Pbmyiqybe)gZy~P zx<9IKb!W_gVMmKZt25bQ_}Zg2C??ls^#Eiu#ru#|u}vJ$Be-P!?4SEQbs6S&)^&QL zv`1vVFM`C#J{7Og2=OG_qd=vKNE7XGE8+tx!U%t%I=|3Ci3TJ})r)LcPr&x2kfS zJ4fSeX*x8B+55j4eSac`1vcKz=Cj1=lbF0M@lyK@Rh@r@IF?Vpd*JwD&g1&6uySIX zc<*yES6hCW!an7t*{9b}iFg)D;ZsT}1ryv}RnVa@Op?|^DGU;Z}EcbXjxV9QXq>c-jm!uLL2li}c#0#GJBu5yKc}LBZhey~UB~X8GFb1(c9H7#I9F z6;dgcF}!>j_U$JdZ!HX$g&Lu4^c^3mPO;_PWLEF#9S_LAbYePhztQ0$)uH?7_6liE z>2kT;O9St+PWxObedcOW<2LM=l#}W_G$xDy#eVLXIl-ogEiB9@^f9V?%l%! z%+CDrU`>Q?Wt>0C%^&6Fk8<-zx%s2q{84WHC^vtUn?K6UALZtca`Q*I`J>$YQEvVy zH-D6yKg!J?<>rra^GCV)qul&aZvH4Yf0Ua)%FX{T$_?;7!LQ9X8fLbpTDn&BV7Iyt z;ID6Q5(NJD$GQ(b;Q#*j)Bn07($V7U{g6Rn-BQhuPzBrot)#?*;R9qG0$~#n2vOUJ ze5}W@sTtqIyz_>1yL_)f=O<=}M?@5ad*J1>dP7 z?3ZQl^Ri=OC?m_$BS7?4TYISgpmaPiwp_&g$Lqq0bPrhtm~A>SC2 zmsf>}s{|2BRwzItC)1rxPu8w1AVQ_sD)tdbe}Yl9a4JzaT>K24r&kyvEQd^O+Tw&- zeWmCSK7&!6lEwXN9UCVpjBFf9kW#aJx9tOzEn>ZV+oqQua=UrXF5+X`SNa%QN3-svG;1yA z+W~@jPQA9~&482hHR0lWM^fXNXH)@(&8`>D!{klECIG%s}uv>ewx_}Wprn+W2nl^^!X21L^ApuqmO*Qp( ze+f_EHIQGQ`UXoGb?K%@s8`hDE>nT4uT9N`L}nWeB3T!j)tzAB)N2myyjo9Zwjdu2 zV4T=(pRIO|W5{`+NhlPx5ibza4sUXY>AoXhYc_~qTylt%D6N$M8HOg1R_Sq8Tj)ed z_C~h-*iAA$d);ZY(X^I{szt2J#=cmQI{>xY^{({|DayWClc!fjZh_2ms{ywJyq;(@ z$HaCCLd&dmIx>-Eg{?^uifK&?(@%*09h1IlB%iA-F^{;w;NRNdl-R9ivxaCv^5t!s zSn%xg=YdONCYA`mOucnusJ`kgD9U~8@Z65$+PX2Vyfjv5BQ|AEil}&gfl1Hh`u)SD z&+sd5v6b&B3s2z&sy3fRs_rXuc|vn|VbmEnAz_0lc=Io%G9fK-dd)EriOhZYDqF_L`qtCwo0b-nBLlz zgJQpg4)V-Gegrpk#!st*5nU~0rONBUCj(@sSBdJqAtrBX?(07n0hFtOnmKrYyfMZu zLr%4`v(f_rm#0!O$gdN2ETH_HqmH}zPC>AZG#qNeK7^ECwgS_@?ExdCEZrC70I4?v z(*d56?nDwY!s!h0hf2m1GwYx@=7jTQYO6^#xM}JwW`UiU6PV1%@27bfE8N_cMTF~G z+j+VsTOVPZ!>r0z(2LOun!NbfgsdyAi83W19#0^|S(V_g&5S8SXXEM8oX{R>hSPXB z9aT}x1CA&~o5F>G)aSMvu~yRN?C$CM z1W>#}E%1kg=H=k1E4l|tg+^O8VjHv{P8nt3@2Otual)PuC`vkKo3Jb(?WJ~D=4QhL zpmj15l9zon3a9Zt6ezzX2i=BK<8{9qw|lU(4* z{5>}A#xTv#tlp7kIDl;}O&e{4-|AT#VrwXqW#kb5!UpVw`C4#x3&)=pgfCeuH zB@tyGMfn@!}-t23=o9Fy(*3c7G{DOprqR6H+JHB3=}U&;aSOKtIJ zU3048_hUcXN?)+OefYjahD9va3q#8GienIE4!dtBm`0OysYxnom9lCpe{9m|Kd$NF zaXj6C-8<0bE7cp^Rn`gN90Ha=>K4uJ6C8>~|*L0dS$?_4+TF}_jGB#@2@o&Z5H!3;;CKk=SVetHeXo|!gXa>(! zIG!cgk(X~k!h69=W>3ye)!+0SoFBjf{e%%io*GU7zYag$cL{&A9KXpi@M7}sF7MrV zrv0heJ8}&SxNHn6vGKu(T#a5einnjM0o8b*E`F?px(pv`QB;Y)A`-QIZ`K0*;J64(3*^!a$v z@!@(Yz22@)gLk*#|AoF5X$fuoOn_yRh;LUP+74yab|QgRc$sjX>JHi$KOUSZ^Y(b+M01IegRS5x& z4@A^^ACl-H08!DOA_|PBzP{++WD>YXe>HG72!Zj`-|XCxI$%6yZK!XiX=7{kYvcjr zssB9r4Sg~k=1q?fuc^ao$j~T3_$qP<8=sX^nJD-KxPZX62Rp+P=bq1O>_WNI9ofxn za3?gpMWxXuWyOAO${=1PvQO&b@6Y*GsPhrN;IK2QaD>e}^4FcQA!IZ<1vy1K2caIg zQSFLcCILPefK76jpRVNt1*bt+T!{efN6|D4E>SA~##krlEgglFRcj09e7wV8-MyEO z9=v@zuc&AmJlfOU_1HbMHldM)SCRr$AJoi-h_zmJ0PQ#yAyb&(gRpq}Yc?IimWiHf zFMU^kx~E9zw%#JCb^GS3k54wSyT#m_b)ClC5)VvFX{!~fbg~noL})H9Va6G5rb2D3 zLJoL(+IzXoPiY6rO_Ue5{lK1ZO~vviE``rWi&lIS2A`_T zbp&2MYf5a34jA&kdzNIRF+17M!{O$78}fIbLpO;55cT;fqQH~!KP&Q^nBL9@`Zo}F zLzVcye$cJ0JK_rTPi=IqZ2;qoZasisI`o15>3==^4YXm>;>}M{TN?cHM!{9%uDd1k z2Ji)Ps{A^{?X+Ud?3(LM4G|k^;wsWJUvSpX^w2bK#ypcvZ}PnI0oy5Cu~FkTaW)cb$Yw?{e9JblTDy|`dIuW~i-cqG7IOt!riXH39oer~)I$?_2qnSv7Gm2B3r5GOE66^lFmT z@XawV>Q_|;`lO>(4W?3|SF1*;!bHtS0vJw=$;{JPU(cw(+U0zDAl< zo7iT?4-D;)OjgvfF=}{0=e{6SyX;BvxGnKspFse@)iLE^VFK)^jz8T|iGH{YzezB~ z4-MW8WxAi+y(80KXY73qxirmmG_=jlv`uWS0kXm`LH&2H{2yk%rCP%npcb??`0EtX zW*c7(SEhiuVB+*uGAy!Gy=`QstjbYttG|$?{%rQ(*rER{A+Ea=E**E&4TDSa;jS~`nHtDbJJ|6${3Xd3*-ObAF2 zOd2zHu0(WzLmSIMX&o=+u^Kv=`jq73eIr}Xd!S-ii0s)V0>$gCIF){$Pl`<9;eC(* zL03-6I7;kG{K15zJ|QG9q6)hlhXs%K1P%eB171W%eyG*&Z%k~ihNrY-jCMbmRbT2G z#u%V5M2#TvFC_43jZZqY^j&DsP!lQ!Oy6_|Tpqyz>E33PJK_M) z?ebH)fyeW|qNIPU$8X|I`D2TBgBJiL_PBZNXCH6z);zKn++9PE>N)x1wy z6@ckOou603#EU$JKCcK+-q;QJ%+j1xG#-(MtnUy2kuKH< z-32CaO@4|r(8c?98Ge&yU|RlLV|N3Y>c=+k$S^d(vW}sNEl}f5RkVWu&$~SD{OIQvD%FEiatCf_a&>n13Y2WYhJg48esvwWKR12BznlSy5ckokJ)(EyMA6G0!}aifGsv9qY007VSh z?({m~h$x0r-KD%8&AJo805>p=Ad_Kwn?{JYv{J(|G646DGGbu)VsEj> z;(oZQPL0y$d7DPi-jiu??uxj)x>Xp8WYjUp0D#K=6i}dC^zWDbn_S}j-NxN;1UfkX z{yDd%?nvQ%fI({;D?nQImlyei3zxMDP7yg)HZ%5@U1MaXgv%}A z#MLAX;3hevLPbLXU{LI*3<6KPzh3s=2(*>qmGXLoI(35T2JP3vRgf&;;};yE#W!Ej zWS`9v8EM4iBs~wp=_R~JTJfyM*YYT0=49G!=d+!b2xNwh)|*JL$GzSshU$v;hzb|o zv13x05`nUr&FF1XX>c5z#3_z;QfK*#am8?pg_S3M(iAmPY1M(&LUsmo_*IK8u;t`n zF$k$j@QI(an4cGR%uQ)v2MI{#@*Xt9l0j4=hdhP#&6b+FytEJs!0dVtV}(u+OR> z0&bswz0JFQi@@mi?}qO9B?1Fcb6ss64Sicf9bG^~s{1>d9xxF7zLjsj(=cgifKt-h z0Had4m7;omr1u)?ek%p5c8ARg8jFd2+!WwidRKcje+XtW{FSTexY{1)N0iD<4?ZZH zi%}-0x2eWB!o&rB@Evxr!O=71gkPx1CI}vOMTHk$U?yt;niy7rQail7$SMnK1mY(?pStB3!#HcFptid>@ zbZ8Gg-%n!Y5R4O(H#d<1V_8L9_f@>B1J~w(cNbsM@o;=*>@C;X5iv+(IsBYg@iOZv z8Gh_5vr*^4ae$FlV_YpXYy_ix?0IP&C|4E|n=k_H2`$xFx_(8X3CQ#1EAeja9s1N> zsV-y80Iq_^3pfWHE&V#HC|b2cbYpLjmEouprxd-PFoU+JKE}ksSN)I;5TakPc6rHI z>?>mfkH|HD>~K65gK@dOMf|@S1;E~_uAq`or>%D zAZb=Tz)UI1q6Em}l?0o~5jfYbaI9Ea9f*RHKxj^+s;jen&Mi<}YF7x8i;gyQMLA$h zXj?N4Zyjb7pBLq(mHTKTQ3~znyP|gGR@}YWvfrV0+TtU5M`I6qKTdy!LrGF1sC}Z1 zjP%kZN8bYyKC>pRF3htG^G%Gh`*KH8 zIt@1}YI7~<1g>E*r3>+UkH@qDRT5iy&C5ur@*R+9EK>at&7;?$!j;Qr-pF_*83q;x zAB+c2Ri1=;+S5kjK*FG7bfvBbAe^7+<1ZGP1O1*+S|?j}0GdA!4uMpBvk zDNd_yn8d=OS!~-dF;@b-!MdR zrij`M9l&j&Wl`z4e4p6JHJz?g6|5y=vW?IZOANZt^?9-ka0b;fh#|M~y|mBT^;_UC zG=d^tZ10}>)T+x{H;yizYuE6rFL37S50!bW%1^vviUHke$9Afuym|nGuSH31gRyNq z_Q+T|_n;u-cc|o_-J|s_PrzW zw;hdpM4x=pT!{DLI(Vb_S-M(4hH5{SmGyF^PHK>B$j;+fv8fm!_`Phul5P{FKZ(62 z?pJEBn#ZwPDN&bEdJ-}p#+*;Y9%VP(v#wuT=EGSdxlR6T7g1a#+1PRJKZYi)nZE|9tJt;KI5{GBl57LU7;46LO5-jDoW zY`Q?V!Q!u$4xnISV`XmgOa3a*ZTQB(wTi_oix0o5HIas9Czlo&aA*b2fGP>-_Ayj5;N`{U;weUi zk}NqbFGHV?d@PwtDfOy1Hx*M4;K`Dkz9Lg4o@_cROzQx6vdm1KfJ@w_cI)zqmXOlg zoS^L&PgHGr){yfRP>V#GudK89nFSApasr8hiRM&}F2jopPa1rxuLSY?GoLI_@3)t@ z$jqF*J`QHC<2|G@^#IhPWnBddR~j}wfC15>R6B&TN2i-+4_&XL&f#|hxUmKZb@bC4 zD;kcWJlwaH6jsQdDYO83jebfm&{O#4-Tx-KKu_TtTX*9Y=qY^Pf9&oBqp2v5G7edM%bvAwsQ=Na1O&~H1nkr|w)GGi}yJ^fhlzFI4;o$o=Z&3Y% z;mhVcuAJcf^jmKt7w_P@JDO%n`i^Yj31f28{v=s zFUxlX9hg8c*Zwv4;?_k0Jo62}GF-q?w<}<&o5Bzz)OfB3IKSZM5(PZEV+a~tj{PUT z+3RkFD1=XIK26q~SW2(Z1O4AQpywOF?Bv@;oFKHO&FG)mO5sN~UM2!E%s?Qi-0@s( zVQ|jf12jtbJ-+GQu1RFEtA!F21D!ZeS%;)T3i@pNU;wo!S(igkotIq+ps~$*prH@` zRr@|^@IojwshRH7l0$E8t~w4>C&z;dIBY&7HWZ6A@hU?a$oh0)?(l7wPx!P)Bc!)w zZjd`DJl@gCP*=qKq=PR`qZGHy?Sd5YKhBkK%<_cTm)N0CQJ^v2)(N{gd*}7LJtj@~ zvT%uTU}xQl;|gm-$$^>?jjKqXtm)~RRvJXWx6s1}z$Q#Uu~1H-8t4b; z$v8mWI5YNAFQ(P#v>5*=T^-)7n(`5J@IJxLSzlEZ*OiV~QMh4t9+Lg7876F51ZK}5TC{ZisP!DoJ3GI!g#l1C*%$|4B+g~ zUJAW#*J=|~%`6qA>1GZYp0q??(PatFx@|z_NR(7*ah6+{kpoRm5y10peT`|`vMOP+ zclxs27Nok9DU=gBmEY|B)B8dyrMQHzU&}&z*#UZxA8=8sRR(#E7i)!+-qsLR;>m&Y`TCIQ@qUy8$=t!me&o8ZB6y#RzS3Zr=y%5YH3i(WedHQtlebI?s4tRZ{QSE@@ z`4a%~BXcjVyge_DHWjgEc-RmN9;7^>o!%JD;_Uv~5#Lya%KZ5M$)otuQv411Uy&n# z9>tGL-VJS_NAXk3cl0QLGN6SOKxZ>GG}8p^;{R1x`YW&C*17+Yp>GKnH~v~s^sJC& zagNhGgOb!|DD+%WOj&I~NFX{;5gIzR!nSkigHi%MQ3jMKPsI$zMJXJF zW1Rcb#{H$DbP+Uf4;P5VGc6fc;T8;8Hd_}unZ=WwdxXO%;b(*=~WRc`E?qcCH0q<#|INGf`bqc>2 z@eo>5SRNm59|;9Nvbkap*wVdp9J}{{=HBs`fXyIgw)grtX7p&~_KM*}2a(r6(arOx z4hJx=^uwk7P0)cm?GJ6oHr>v%BY%l|e*8VBczzU+j`6;(6_&1QP z`yO-_?poT&?tb-FbRs$NoQm@&Cdt0cs<< z+W)DM_@xvb&_nyLhrgw`7ch$l(Mtp3tuZl@h+8<05%mP1e9jyyC5X!q*n|hH_pDhc zduTe>WVsSoJW`qjNHjC;hA5CgM1JaMf1WPLULVv=+&h0rht;COATmG5MlH+7zUYYr z&_;|e{UH@(K+qP)7uV+`UTCv2bd5bN5Ju#efdr(Nb3K6Rx%|&yh zsV=xy>1UV_v`M?oXIRj*}te7G(4G=vy5mkwe* zu<#t^_p95MSj)OiF{fx)C^dTnQp|PswB5qT_fLOD-G-^0jA_O=*r$*PsS-{aG?r1p@fa=40-ECgo=t|05Wo>-DdBhfTcV* z_)NERCSU|CNaIK6`3&B1DJ{X7WU%TkJ4bA06J#nUD|g=F8q`8O;2Mn3+v7gvkz=GjRo&GqDdz z+!sf3eefd70Hs(>o6(yEGN{GB@+1)Nn1^FXW@mQ}5GJw#%9O!ubthBhRCwNNs(M(~KA-P;2GI4s*4@+3 zNihKZ=AVz|A^g!g{3gJ_zKZXz>)k*Gc02#r>>Yu={do2CbhUvauWlPkfdBa0PN`qo zf^WmYAK3X8>%V83D+)H^OgwK(EPTI^Wzhi>%|U1YtnDVQkZu#r)3{RHv8Z`3v#BiT zD;*YutPRXN#nS@f1Ii>0Ha<`dTgFe5s&LYklHxBdFg{GL!Y_$pA9U=<2`>vs1a+ zAWjDH$Pv+;^4>mn@%43@WyyQv<8DXxoaGjcFb*#~4?y+(r<3$GJgsMjfa-e~&K+aU zfy{k5K!Q0VkAd{dV_^0Dr;i2c$IV~mYVOnIB-f?Nza&3WOOJ%`Sx(HrK=+VICHyxk7wlGJwJ$7JrAg%QEazWHK+L!VRLAbYWtp z)^vpU<|nZ4$J{54q~O~BM54yYX_OOme`kI#(t4fOQ(g&;3R23Tyf$1Xuzgrc%RaRr zOdZfsoq+c#7*!NEgs*8pmSml--56bAYvMKZMDNRqBXTQXVuU>}k+%`@N=P3Yfp6hZ_K`CWo-3m9 z_A1TysnDRIVsstNyuY0!+>R zYdLx+9~&MEbv*Oo5H#zvfN={ic6B{tdBVy=DMu#7iT?s?bkh z!Ykk1*}QwU9^(E+_1W5EL=^_VrlC%-87Y0(9wQ{K$tG!xI+V z(NwfUd;HJQ*GQ!ZB4`p(RgeMdG%P_B~Z%2qroois<{RK+3Fr&XE!?56s; z6d??=1>TcsIII~0WK0b2!Fd0Z^CJzrzd|@-X#PV60GYZ!^?rd^{p0QbCZI&$TDlvj zK!4;PKke4w{{UA2V7eOr9;x+9J1Y>^e?0yzu8qKO4LCX#7_J$-!$}p{O8F~XOZitV z@Qmd_yR~yJ`H$&&njA z*SPx00KIvp7R9(Wf)C~ImEJ3e)_)mvl_t{$X{R1OtMVW9xxXJU06+mEV6p=+I#plc z^PpM6p*LD*FDbB=ZQQ26h|fIAe++&EuZ>iTw56+ubcb#H*!`pp;2wOsYWmuocO|Zr zjU$L3P*CPpVe@=T@mykHT8vGx)=gk@_d39Gs2eYlu45xR9tqf*_tiNNA3B6!$Syn5 zql1_}CzdvoJHtZdY!Ms5MBc_3d$eIu)mRfffdEDhY|V4o94xDAP^2;`OnxQOY31o#2S*G6?w7qVQ6 z0?x*>T2<7K3C!$qmSKyXo9tBkq(R|vgKT04dlc{bhB!ea$ecNKiL6b7++Z9s35A#D z)}cI)uxKpZj3bK^HP9@P4#qHOt>hH4A#BvUOQYXX%tN2hmPOeH&Byb)Ra*|IMQ2=l z0S2v7Z@8+pdG|IxH(q$<2=g48&Otb!vGOLlC=4!H-+0rE5=u!% zMz%y`L_|gz$yT!W-U%flQdUM;WtWw`D?&&{A+sbxAw(hkpZ8F_=NvwV|9f3soxbaP ze&;#A`+o0d-Oukf8ELqXehlvb&a-3qZTL6LzIx^9?mQ~;ym60YHp6_3;%tz4#uHLr z4ZCLx$9sDXc^;F;i}a_e-hP$&HPnA{=H9KiApYW6v6lS-mw)UX(6#4~Vm+BMa=M%x z=&qb7#qm2X&G=)`f8HVdT+hCw28O%8kC?LAV&LpO&XxlV7r z+qbxzX6Cx{y%O;4gf)G8QQ;KD(i`+|XqAq}=$rF#XuEke&`tU|be;}7SOJp5m>=sw z34Z8NP`o_=%9P(z^}NPAoz*nU&TR2eFB=@{J6YFaE78Yzgs+i!o->Jq2Nkr-O z&KB8os4JbT3i8JN*_oU`E{gX|kk9Sfo*mRu{L00#pW2;Wn`jO1y$2%K18je)2c{TU zpP6&b={EQMu7CA5^^$L!5ydgQ3dWx)j$m8OYCa2G4isbqN%Bt((|%+9(Q9*+2U3EQ zhyy)kt^MCG;9e7~aD0}!%jP|qT(E7bYx&E`s}8Z}1}F~+q}@4dqgI@*89lBsznCMG zKt)r}2|W3~^)Ap`VS~<$a$5V(IX36d(Dfqp9sPgIG@!+sjisIr5ckGtiUBR&{9{-}t3FU^K|#zKFx>OU3UQMa z96eLewVoOeV$G+}Zn~QO3G0usZLO4K`)*sm!bXye?={l~j9(4+163h#kfEV0K0Owm z(K~GcWG|;2=S90M9u)MDkC$hLD*tZ5eh*z_ef%-X{v})Ri=m6!>CVjMhYoJlPBs3C zfB0ZN??d6jU*^HMb1$lOj0D~ojn)q5EjZdQO)L0cU-5thhR>}TdZ9t~FXJm*)GS;& z@H?-y*jE*?J8|;Cs%DQ;CJ!WW8|J7!oO~lmBcbcR1)u6>b>~g-_P}g*3I{5haYdnT zu9K&#@0HKZl(a^=1=Mx*H+*!lKTGD~V}4FAuyK&n5_21ZHxzw3SDZa+og$?Nrw)%mR}{fFnXY_)xw+(duAgcUo~9;h&Dn~lUxisQy+4|6-@j} z>H2YQiY`vEC6in?_mEE_hk(*CoAcOCQxl)_IQuNW66|%hxP9dQ1u4EmXEQl3OnttU z9e^!VRQ|DoK%m*E&_|zBfVU4Tq=v}+A^(>N94lL+h0j-`MkiIBa02`ZeuS}zYzRp`^m`!%O;E?Z^SiXLv{X>`9t?K%dPfh2chH8mMh)Z`Fp0uIdmRag};*lBu`?-wu z9=jx?Rn&t`u#;J3B;JqhG*9e0M?)3fI4pg3%)sb+n1W|zSeiACz$3TtKvPZKq|R~? z#m>5~hVrg^%BiqXaw&-1R15J^-ge(_qC%MO<&?If z<f1 z-lwj%eh7aNKcz6!mzgXQp-#Qs{1c1IQBRMzuIHsQ_=GDJ8mhW9%5m-e zU7Kz zF>l|`!KoB{fq>IG>A^V-CGPx-m*ae#w>Vy%Fz>pr#21-Kh>fk9 zBbp`$!br)VBw8fzC!=7ArL-=*CpeYCa%MksUShHTjr>99Yu2>KuNE9Ew{R}K+0?{9 zDsbhCa>d?ua_t>iQvO-v2XB*$r&G~LyE0f)Ylh4;KWwLZdQ`!Vki%?1qciVtOEYEK z*957rGE~8LP2Q_VZTncKp_A7(Cc)*MHr!xRO*M8@%IEBy~bl#!P!lGpS&R5hl{HI zRRNRh1>&}Y*V-mh4;(pj=!x>5du=kV_@r#iEjknBIhjobHt~jA2RXONc|JL@^BnF; z8*U3ReGeRBo+Mh63>Wub1Q9$HLdhKdO-y@x%>`zD+Pk#d$n%`hjF#YU?(gO|xH+Af z>*6KB-!}S$F-J^en@Y|%i5cr|>V4SZhqkz6r%;wAU=v=K3Y;Y-xc%!f$!#7sUp2DS z8+3|xrQ=>Kz6V1^^}HRG4`h`JpW^MrYAW>?X0Mf-&7F&;gXrd{&HB>w@>4`H{bJN=QE zwpQ`X9f$IqOHMIGr{k!m@L0XoWJDd=pS~MN((TONclG^#4~r}Tk$e4HYh{v8JoI3a z%r`d587{ALQ=8_v+0;9CKS@9}F}ZcpR`Qa_nIYWD&=eW0I|5h8aCFlAUOpY`_Y3s( z)O~-tK26}$AI@hjmp_!{dn<%albrVGoqxt|Vl$BLHnsf$@eL`?tqtdF9jA4VdrIwk zAf!V!Ml8@WS0x*l)H{zyIGGXc{ zJf<0qzz2DeO2%|yIUh+{85aC!dH=Sho~!ktbZ zD+9tV&ao2JrQT$(YdG?SNKWG7=ZB93j=Q$SJxZr9I=?&QZE@4BjLJZ^Bb-88>aP5f z&-(JfO6mo}x9?l2{SSS@A+dbEOMt7B$4Jh{P^2y0phVq9@nLLia5Wckg z_<_sGS31h5-|Tfv9!RebC)##BpVYkaAfENxGbX>T-r_Ow3)rhd>c2}a-=LS3;#!8< z+~J&r7EgM~8IIv^?o@dl7qm0tk4+sa|GHB-D*vn%(R^dKqEQRA)iaNlt&dg9lW<$R zcRxMRE0M+<6WJF$iN0mwlR0F1 zO!0^>)q6Gxebb>G`a8Dh4;BYA@Bj5KMR!NJdjx|liKW8iUc-ukueI;S{3+z$HQkjk zepviId}J`%G+0E!`}*rJ!H6DNqPHfz`1M=u0{*n*Y_+7kRWRkLB(jrC!ttzX_?1*} zUqW9VTj$Z~7&WYeM<`D5s5F-iaC&sSnl4_SYA&&fKPKy1mPP%3qc_zR5}PBE`K9QKK(27Kc8!ZI^PwEB%&q>47G- zx;Oj$yN>;z?lCrn^Z!gLGgmX|PP99*yf`?Go$s}enO5_7na(oDDoytl-SjmglOb?YqUrL!L2lnC&@V4VHN)SkB|=5m z{KYNdqg`N3oTSLOxq{%Z@70&&4R^ou z4=UljZ7X}~PpJ2NeEyGp`h{+Ve-4~zRrpdH{cP)z-eaZpE;C^* z8&Kb*oo!~;$Yj(z(PpeB8~Ze)l>QE@Rg6r1TSBr`XkL~x`|+{w?V?(nduya{}$8p3x{PK10y=zYu&_PSrTpPF;s^y+A18Yk0@ z8Dq9uxU;$8Oczmd2C*I= zTlTlou{>g@D``!v)*VIt3SLG$4EhO4<>IME-)OP;FV*dda2I7HJ>sF=wP%Q|TbwJ2 z*wtuaw|l}RYw1vi&bpFq;+M{GIyHLx7+$gnu~Y7;>DSm>C|+fm(zCncpzfujk(>-g z9r4?xzxJ7j+~NrRWZ=7LzCeG}FZWf|4r`#3S%jcwGaYS7rE?@j;8?%u%T5&RB9BE61-xW)_% zy;xfu1Em*a%-Z-V-aOF-2_T8FBPPZlMe)K!!`1rjs6W|pc%3viCSCB=AbMNvkL^j4 z^RT)_2Jh=v-pbitn@`ate9Y+|PioIyZXM-w;S?_Y8f93Hdo$4GeT-SXt9!o$4uQZI z;(N|jSUC4$&Y3wFXbPT}TzE$r`rKJS{t%m6*2`E|!R)$;^t!f=E532@bbX3_KBszz zIj+%5|F{*$SNW*HPh63(osY1$utv2s zk^wZNo-{QBmMHgG9S?Wf!Xd;`%LS$-H zBZ2dRb==Y-A>WDa3Zo2G#l`KejXH2RtY1nu}-VN=>+~_x!Dp z@=3ATC7r#C8nFnGvpHo@t&d;eQb69K&Yp_>QG{H7(CwSPrx$hhTqCS()erQ86j$cv zD~9<|?CP0KA&opABE{$oW6{azztSL>%zbi6T2ta(qo`~=zd z0WVxUt-mgUIIRzFHlBLO_)-d-xl2542vJ}gXNvAl%&ajmn)fFiOkv8j<&0E3NliJS zUAA{$J65?yFc+vBsZNkhKqw2^^c5XbjEy+kc%!5677x9^Qby+-{MZH;U) z`n5GFWO@j}y@U>8L81|`P3i5AxFEB*OZit2sp!Z4*pBB*Ta;2W2HgL)C_%1uUzI`G zU7+y>2_jt+?M^EMItb&TIB)4re@i4pjza7f`h#kt``Q1hG z^gp*F{4lZHd2S}uV95{9@~ieS0zXt*(+?4en}5rLZS=|_blGs(YMb*#8dR)JdLxuZ zvM8CmBru0rRD{muk(#6N%av)=?Ob_2G&$I=J4&cMPK^C4Y3fjA^fdd?{=57i-(1a} z*AL8c4+!B-mMuw^R#E;!DqG9-+)pfA1|(8ff0hiV8{>@*W~8Q2Yzq^6lSjZ-c3SzO z$WD%~n@i6R)M4X_NJkHc;T)7r9^6~Ga30grU!r6(4RS5#5>5%9Qcq{ z`%qeD=3vVX=_?&SzPsZ1^J+c_PvMiwja0&ZNY%IJF_cLCxn3>DZE&w$EKrk+{2tB2 zCtl>;eU$W=p#|L`=58UH+>Z;|5kIYcz3|8Rcf`iou8%9fgV z7^XbPC1U{+pp;bi%8nb|zYy2U_t4)vKds^;xj=BX`_Js3*4e)kVlxv>zK;S$FYL76 zWU6nAjpV*1+|YiHo2qX>gopRm<(2uF4)@68Z?_ZlUNn;k&}}8s%E%!yQ|UbtHGJj! zXnWS7lId+z=DBAXR!u|JJhY$WSP_Js_c$|Add`HcJ zte8fs_w-~zP?N`)|62n~(&N!9H>LAr>UWe&YxXjx7BExy zya;*x(z2)2b4+czo;=g!Q74tL@iFCnPlT@hV1GVtxK!~(xc|)!NbcEYP4`93=~*=9 z27MShghprA%{elpGP5e`CSxyDOj^s*(%M1`lbDYd&AgOToO?k8L-Ng{q zDE-zT)d!(jl6;z9^svIZezZl@WaNKxRVm*93g~K_O*j`xn<5yZOs#h&( zBo=l*>H;0aaUXEpVhs>+Yofek{7Ru z?%9{YS9YqK2VYmh8r`NYc3M^8PQmNiYuE1Aa7M>X+ntbL=%bPbmsi4x$EhjrsFaB) z^p5VQd4Eyl?A3+y>Y9}W2kyD~vtm*8PY}9D;I_9*@AfCyoY@{=HoJr0_m^W^t0P!dAubLo zKKcl*TvfE~Xex1tKR19abJ(U=YYNmrpJv=WzPPHQ7pbFyviSZx-l8+X27MRuHFR*B z^I$06u8O+Jc#99P5!!e5TBdfGO&Sn)E+G}h#ipoU+X&K{$X+dw-Uew+XF_KcU5%mi8mqX``YN-kq#vt5^X*)*Z6f^uiC@<4I8aE_n_)1p~nK+O>U@{cnA9kf4K#Rc5?~3 zoFCE1Wga^CRbDVKLDu_jQ_I5w5=X(ej`k0m>SI1phh&PhT56WxQir7Iz&$}i#67`# z75v=`HN^9amC(7dTcsfxMU^!t2~dLC3Y%@vSO4i?E}Cz1E{c$AS@wnhM}$SF;=ts- zF`5cMGby+f9;(jK%4Gic**)xecyc{*@;RMP@XWsBs_=r#tU&0fsCDZ>VU4Su)A}is z-+6*SNuKMz&4nS`q>Ob%*_s3>PF0FU-TnNNaj+t`IP}%co};o$0$ruamc)dGj}I|j zudo#;a4y(F{=Ev^ocb`g*i_}Sv;Bg)Gg$_O z&OmaBPp87K;F@B8BV4>XMIV?KY&!Ag-U$m6k2outvZyhUr?>QWGCCwk2j8c;=hX2* zh?!5U!#nN%V(k*WXiXyi;st%M67w1)aC&as?_=>gGIVa%(zC)rWc%t z7H>miH`_feD9s;s* zHG9?kcc=AvdI}%)xnjkys<@~2bTOn+dslDpJR-Il=j}Kv?EIm(yzMAR>aS#>wP0-P zk8;R$4;J-4_?7m1I22ps$RV#)?C20Ofq8AZ1rh&<8xW~0r~(ytI1Tk*n}Ct%GCwZntsT zrGn|>3rsUm!l==jJ`3$kp%`F;UJC_96s*npEu^J_9&(fO07StkJ#Zh}(#C0Hm$7L; z*UV86P<>ZgcH1$8U{^=@tC!;sB8iAqetTygztw4E@#xXJ6D6J;Q27&KEV=z`K(Nb5 zMn)(+Bt>_hm}S%h&n6|~qBv_>+VtN^p-+A8*|@6zoUm$UAMY{Luo6DCXO6m7#Z+Ma zzU*sZPx@zxM~e7#m^-_`HSDt1?MdeO657H&LkCkmk|HCcRJUxsFSSq2WK=%tc)VJB z<;yfxRg#iBlC(tG7SZ4ub}pHr8_9v~j9<+ki%C;+IefmNa0N%Mf3FO?^T_Y?k!Ry`M|5U?X&xF(%KQDpxA^ioo0rPMi9n*(_^9?A z&c2YN{G=xu&*!|#E5E}4u3@`_YuE*8&rI?s$ePTKguN|lI$`g%r7WB-+Y3n4f{MP= z-^igWDM@|#b&&6xt?9eah>mK34LUEhI6(#5ocBVvUsu80r29f?vmoT^gTf%@I$$eI z%Mq%0hS7updRx&zpgQo1;G5(BlY!?wO^z4d;%aQ=)-6z|MFd~tY{Y7;w?%^P3U4=4 zd$N!1vClNjS&iqJYE2{b^X3F7LY;&t?pErFzs3@v1o_VimC^V#@4#Y=ckom5r?NEyR*0&d%Lt6tB7fp4!izUrg`{*;cZj=ufIfv zv}j*7$&gww7WChxGzB%O?=04&ChPhW2kMEuKKc2@YgLA!)>Y7*Ys)o#7}~)>V}%VmF?96=4cg|s z7`l408tDJQjkPUwot896H=}L#qh&pIoBE|eN zzJdFAEy3JZ>1o?;Ao8hVerAHOfNhSPT{68VlX1UMluY_(8d(D?zH{PZER=N6Btk)i zuRj){bpNM-ibL$=#p^s2#RFQm=TgDtK-ZHA*ZdK>0g8y(ua!2K{nDs(innmTVr2FS z$+c=C523rMwYWlS1&0v)Dh_0UK|1PO~m;<7z4Xcml~0{kIpRF~TOi z7!BIyy?8ayO?okOnyag4t7QagG#OwNgApgx|5~E)S;XaQ#A$BBk5F|*rk6l2!20P` zaN{Jy^84!(h~*jQqU5?kEXF*ayoM0ny#r6mxg7P~7drXSt1d_kBW4q>pq=IAMc9f;^ zT*bgtUZHrGA)ZS7k+})3P(z=vl9mIA@;2kW$8{3t(!u^0q2o+!aaU)*_{YHKA;Ug1 z;KE70uHp7Z`F8B0i`z!O@?Qq!ZFWNCZJGxT9wtZJH<>WMj|(a?=;#T&DR8W^SQvL- zk^|uEb#q?dY3{PAHt3(woOu~!b8ZREB9X8*>5V%9qN#;}1xAhtopK`@q4*$FyiXWt zBiCIuBWT`cW+5&?)o2*}aEzlXvh3Edc~%x3SLMP;h{)EG{5+mfoy+>q!$?>RYEsTe zSqG3vUfq9REKsc4Mc{6x_Mx-yxS038&@HP{*vHx0;+X9i7bD!)qp+JN-;JwAMW}$$ zBP=+cQteB^6FGd#rhy7iTGBqlvJ#J6NF3SP(lL_aXGq_eA&D2_HY$*;=m(M&!V=wD z8DlEG*kUl;(Dd?KmazBzaDsm9?nFo&nI4EEM@{cfZU6Wk z@2T32ay^GvZr!7X!z_jJOu9*t_a#^se(!3dUTF5Wwf342dehO&nEsofq2Rk*u$r}s z;LTgy&|Oqla2FMy@khz?8C6p$9#K!i3MnOClFn8`!4|^zF>IMR4lP(Dza_L!WZBV2Q znj*nlqc~~6@*LF~hjy+y^)c!2R{8%_X?y?knR(pxz=PA?zS$CI9jsL2dU;D^GaWT_ zB?S)o`3CzFI-bxanlSVG*ha<76yttMUB>({`%i+Y-C$p}v^B2YTc30wr%jVwM|V>s1Q}B)^0wf1#l3kon!%Z+6q43kU)o zcWrs1=OkGZIf$p23K9&OC+pp18ri`8=%pGqKp&QHlpPw{Ic7yKr#(Q_0nu}F?NI}p zuK@|%XPygkcfTnoxO|Ups_=Mxw8%@*6kSi(mo5b4`oofw-G1*&DS1z_WZyhB()F#? zOQ3pDB=%aa;5$gAO>@l|Ds<2Vr+U3Z||bDb;m^}HN(V*SbcN~Phu|}`hJ(R zO*fF^Hf^zap}}Li%}?Hy~2-;L`J z&6C~ICWwb=>@CifHDIL&sEo~oWW1Y|y=&WmtuaSkA8RCDyzL-Jfk}?PKDk}xw{Y9j zjNRs`bfpmnhdO0E=??BXnpap^+Vku*r3LwmpWRX&4V2q(ctRSYz?s%>X1ArPV3mZK zzo9Fn>T5bE6!BKFzCrhd!pusT%{eEuoq&S2$uNowFb(yzbfHq97>(}GEBvn^s#E?; zTn&2k{*l>&^i-naDr zhl_JKZ}h!1>s9x!s&Nd{8F^_le~)3QHnhFXZh30piEHPqLa9mrc;28JLZ^)XFgE9d z)F@D!bU;XJb#XUVR}Ye#!pI4s83n8{sw1u(#q+tU3FPCZt_x@Lcr;XA&I95-v${tqRleJt@|q(1&zJVxk^NQoEr;&HaE|6mT!Rd)B^SB{=|Y$%rOdW7lW_jeJH)| zNmmnBMxUP?!YdRp_Qjs*T*DRNf(F)vTSbH}5oTM0ikZzs5AN9WmgSKkiR?_D^5MS4 zOcj3eJH2ecEC0I+9gO%5dM0$j2*cT&cS3trsBoL~P~?44BlAt~i!MQ+dh2oxIy0Jf zk-@s_xQD#O3l8Wc6lHO0EpRQCpvxn{Pr|-8;W~Q$vi>PDusS#QqrGvf_aVLL!HcSv z0g9?tK{ZSdy0Jy+UZo{lr=lugZK zJDA3_M}YnDfWLZbBMy#k-Jdsz^s3(k&D=gV^m@`AykP{)XIslXfQpHHSK956*Y*Q{ zw7mC#D(45rLflP891VhE1S*pzqZ%TA-;@V=Dk7Jdaq2~sKHAm*%W~>xqyYl!kcjlej9hy`}{H6{+ z&Mw>XROOKL=`d%Z!hkE6wrZ&MV zwRo&nC3`Q-+<9hNHE9ysML1U<<8gqY?ASuv_wh)($J%;_25@k3u69y7Ne)gT>T_NA zK+;FWQZdG@FWydemCe!|M0 z=**$cKIs|7n?@G`dA%J+bE({YXD6a2XiFK$n?#tyRF05pFf);g;=N!IYsO>CIk4+% z9JLEmh0duS-knML>KBHu8pZe9W;Dq$hCQxi66ZHd*%6$o&=sL%+d4quvHcFO0dYTd zUt?A6$?NA27}wnED+_g+9h0w0R~vRC*%vx@(Z$E@;w{G``f7285J4iFmLFL3bH?a|J?M_mPf;t zCO~AnEk~t89(QH+bnQvmFRXktO%64CMl$Tgue7+okW#q4bC}{Qo|-w1vH$sa$JfMf zq~%E8Iy2qTdw}a6slWGlyA=!f=ntwmeLNM5-x=|wZ&`znVnMbj*zEzrsfmbv3vTYqXQD;7XzO%;K*r>&oZP@7k5K%7RQvt?KtpbdJ#W& z>o$@tBwKKBaJI&16-tuKX~efdcPKV+%f z3btCdb~gV4%~}{#%K+fh)H23tTU%=*Z97nbMHD*YG*}f)_`DMFE6{ci=s2|aUVbFD z13^P0Q@wvs|AFN3Zp$$!N#+Fj1MSK$KT04zn(7&7nTlxH7}+dE(p7sD@a*SP2hi99 z{DETe@>2nDU_CmkXRc?hW%?f-i{ayP`vtZ-ev)q80*wmGk003SwYD?WvtiShhzjx}wYVCtb^7+4kM&iIK&;on;VG#WLhF)Cq&{fHZ z^-6u>0v4YXfC;#Hluv|XBh}IKcBZyQtPn?x$UkQ#5|k*n{2W$6 zK|*c}{mC@`oKoVC!P9ku0$(H6N=2sAV^o3${pmI1*h zH-HIdZYx4}oNNKj zw6Gq1TLl3V!lCu{@?-0azEA6<9{y^VuL6dd5x_vQ;yG{)eFrxZG@y;9<;M;nYirqp z3sUBGX4-nzD0bMtv#0^Ou>%EZXac$XWFj}k!~pOZz~YM3i*+)OWJY8Z%qWLe2g^@6 zS}+Vu*4JNF^2hDpo|6;6@X7~%!@UJ;$yut@fGBA@~{P7zJB=A8~A7DZI)?kGKPWF(= ztewFvlLBOV0W#r(W(=$yCWOLYF3wvkzki*i!Us(U7zAd-(ky!`_*9OHgrS$hqco`( zFqEE+Etu0I!Uqb!;?j2Rf2Y#$D18CBDJB%dovzj!sTb>H86KsHZzG{#Ml?JgYNG|i zkZbtcod+QQ6=<-~w$Zb;M_k9WK_Ok&Oy~r3#t+Fx)5GjPw<-oE>{G)qJ$zT|*E-Dr z$xSam&8xy;W)HSyNbrgE&T5_9NQ8kej(q|4-{DgW$f$$7Sshb58>nsoa=01cRG5TH zm%0GUz{jVi)j=>Z4g7W2zPoDA)@d6?7>n7f<6&kTb{H(dy;Zxp5$nLWK1>1l;uKQT zLSJ)Hn*#Nfd8Xz{mqEcNjzF+iXk==KD5in@Qe?#u4fHgB(*$flP;Y+)gpcUV~PNtzF zjOFKG@CpRX2!;nsJrp1edBtAt6!?@2;A}tzJ|omn^HG(FhT;hr?L)EF~D;j?~$$i)sI zFfgPKzNYgANPq}EXmxL(X=0$M?SQ(rZ)J71;{#kmBOu)Us?jyagjo3Rx)6<~H|t~> ze!3Ec4hb{L;q#lZRRJ;NAHGVGiUG7j!T|=>deA8yiXU6uxr31Xf^vG`vjs2YrkL;! zUnOmOjMR&Dat;r;QphNn@eN-kg`)+-kZbshKLQ}(m)fTR&jB(>sy6ytFxb}G!W6~* zt@qx1#0qR-3~T`pJzEmcG{?jc@X&KD5e?irtpE=_uhAi4W&(KVAx}cnH3T4r{KH>* zTL8Os(NbH_P|M!P!dmn1jZ5Tt_>B(S(Nn+-P;piGjG=f96iloE=TPp+>U~?MQQ)hW z*fjt#vkg>ec=?(8FI)^w1fSeodJ0}>9n=U#^-$jyIvlkC=77hzfTb3gP!FHn97tXK z&UMlZpWLV{HO7om_?sBD5(7i}pnT8eX9yrIr(J=~7dudr9QAaRb<2DOlz<3LZ{Tjo znuZqOzsP;daLxb<^U!z=-@VRGM+>-4uHhpjWd>R-%&2ExW($0>T>}zBOTc4IJphK4 zcLRs0Af-zeOnFd3{>uUquD`{};jw1_v(-`l%O=q81olNda3ep?Tpe|thJnYL$u$5m zvkpAg$Y!nHQ3NiACW5cJ(*e4rwVtUF$X3*{cG6sP@BWLU#C2$qdlOI!AFO__1%ru^ z;QLuVIcxN8omPVTdiPq0n3?I=l3y+UbuxF2u5QFmdtmSn0Q`!eX0Bz1`U(xi#(#ru z=|hs0RIt|VXj=c5Rk%~`%R<{k(BTz)?@J>ewJ+;51`VuR#b|&qvjIF(5Eh_zY$MbY zztr0h@GwF~ z!HjPBP?V1r48w2)KN}?|h7#9-Ad`)bg{6_svL+KU=j=T)$DrW?N)&_l>cVOem~cvj zifk5ItqZ*9M{)Y+tD|6I8Tcsv?8WM+>og906yNc3bwJGQ10TgN{}(QXCc=SPzZ9TD zHxBGfwNNHjuby>1kpyoFw1|Tnc4|c{OiTcuZhMw5fA=~mhv!wiUIBm^#Z)j7_P$!~ z2m%K~O5qD4ZGiUga2-k)K|La*!4>@piS6nEX5nG>5o%*h2!``RS&7nKTGNdOqOV*XcX9oZNwE5Xyl-t&=FF)*$e8I8xNF*2#?+20p?%1MI&Q%8^a6vc@@lgw0yf>c7ZeSxyc9deSv6fA>1+ zhL0dydX@n&BN#ryN+IK57Ml-^hYuo+5gk#R7j6mRM0E&fIRWkvQq%E-C0)D_%86k+W!p%uP-tL$6({p%za zz7LGwzY+p7YH46(D5D}_NG^Ovm<;fcDj6ZW?aFFR@EPF%YGX`jhMP-o0Hr7EG2F*FAuthaREk?YDJ8)9YQ9QdS82c<10CV=l-cMl`?W1Zwv z!F~?I2r>+2w8Ks5fF2D)!r}g32Qbl+LK##ai6TnI9 zT?Gs?L%{w2A3wHhh@npF+XG zjB)rdduJ6m3|S|F`E@SI+(wK5UlnQqT;Tr5^%Rh;uu{_>?rqWN0WdKGe9A;OkG4nav;%w}%mzIc zW`fDpy>X)*MN+0lCUd32H9WjZptQw=Rrrdu3J19#>!g=znOpE_4=yqcW<0|eS69%Z zVMzEcSPydn=1NgxWV%=CHN#)Taio@*kPUZ2LwtB2)=4$o`sqj@m=O)1GoJ&}*wA|BRJlrEt@q*tZ(Se{^f5ASgVzaPQx` bw&tmv^iC}3SJ7;x*(!VyTv8+33jXy!C%DGN literal 0 HcmV?d00001 diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportFilename.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportFilename.java index 905b4fed0..8fab80050 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportFilename.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportFilename.java @@ -21,7 +21,8 @@ public enum ExportFilename { FALSE_POSITIVES("falsePositives"), FALSE_RECOMMENDATION("falseRecommendations"), COMPONENT_MAPPINGS_FOLDER("mappings"), - COMPONENT_MAPPINGS_FILE("componentMappingsList"); + COMPONENT_MAPPINGS_FILE("componentMappingsList"), + COMPONENTS("components"); @Getter private final String filename; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportTemplateResult.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportTemplateResult.java index 6f20e791e..aa59e3f28 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportTemplateResult.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportTemplateResult.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinition; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.FileAttributesGeneralConfiguration; @@ -66,6 +67,9 @@ public class ImportTemplateResult { @Builder.Default public List types = new ArrayList<>(); + @Builder.Default + public List componentDefinitions = new ArrayList<>(); + @Builder.Default public Map> entries = new HashMap<>();