diff --git a/.gitignore b/.gitignore index 6bb4bada..2594dd52 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,49 @@ **/tmp/ **/.apt_generated/ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### maven build ### +*.class +/out/ +/build/ +/target/ +**/out/ +**/build/ +**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +.gradle + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ .factorypath .springBeans diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 822c03e5..d6ba6baf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,4 +3,4 @@ variables: include: - project: 'gitlab/gitlab' ref: 'main' - file: 'ci-templates/maven_java.yml' + file: 'ci-templates/gradle_java.yml' diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 00000000..cc02e636 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() +} diff --git a/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts new file mode 100644 index 00000000..ef31bf1f --- /dev/null +++ b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts @@ -0,0 +1,75 @@ +plugins { + `java-library` + `maven-publish` + pmd + checkstyle + jacoco +} + +group = "com.iqser.red" + +java.sourceCompatibility = JavaVersion.VERSION_17 +java.targetCompatibility = JavaVersion.VERSION_17 + +tasks.pmdMain { + pmd.ruleSetFiles = files("${rootDir}/config/pmd/pmd.xml") +} + +tasks.pmdTest { + pmd.ruleSetFiles = files("${rootDir}/config/pmd/test_pmd.xml") +} + +tasks.named("test") { + useJUnitPlatform() + reports { + junitXml.outputLocation.set(layout.buildDirectory.dir("reports/junit")) + } +} + +tasks.test { + finalizedBy(tasks.jacocoTestReport) // report is always generated after tests run +} + +tasks.jacocoTestReport { + dependsOn(tasks.test) // tests are required to run before generating the report + reports { + xml.required.set(true) + csv.required.set(false) + html.outputLocation.set(layout.buildDirectory.dir("jacocoHtml")) + } +} + +allprojects { + publishing { + publications { + create(name) { + from(components["java"]) + } + } + repositories { + maven { + url = uri("https://nexus.knecon.com/repository/red-platform-releases/") + credentials { + username = providers.gradleProperty("mavenUser").getOrNull(); + password = providers.gradleProperty("mavenPassword").getOrNull(); + } + } + } + } +} + +java { + withJavadocJar() +} + +repositories { + mavenLocal() + mavenCentral() + maven { + url = uri("https://nexus.knecon.com/repository/gindev/"); + credentials { + username = providers.gradleProperty("mavenUser").getOrNull(); + password = providers.gradleProperty("mavenPassword").getOrNull(); + } + } +} \ No newline at end of file diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 00000000..8faaf13b --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/pmd/pmd.xml b/config/pmd/pmd.xml new file mode 100644 index 00000000..22d6d4cd --- /dev/null +++ b/config/pmd/pmd.xml @@ -0,0 +1,21 @@ + + + + + Knecon ruleset checks the code for bad stuff + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/pmd/test_pmd.xml b/config/pmd/test_pmd.xml new file mode 100644 index 00000000..56d37d9e --- /dev/null +++ b/config/pmd/test_pmd.xml @@ -0,0 +1,24 @@ + + + + + Knecon test ruleset checks the code for bad stuff + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle.properties.kts b/gradle.properties.kts new file mode 100644 index 00000000..15092839 --- /dev/null +++ b/gradle.properties.kts @@ -0,0 +1 @@ +version = 4.0-SNAPSHOT diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 444a00f4..00000000 --- a/pom.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - 4.0.0 - - redaction-service - com.iqser.red.service - 4.0-SNAPSHOT - - - pom - - - redaction-service-v1 - redaction-service-image-v1 - - - diff --git a/redaction-service-image-v1/pom.xml b/redaction-service-image-v1/pom.xml deleted file mode 100644 index 67948b41..00000000 --- a/redaction-service-image-v1/pom.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - com.knecon.fforesight - platform-docker-dependency - 0.1.0 - - - 4.0.0 - - redaction-service-image-v1 - com.iqser.red.service - 4.0-SNAPSHOT - pom - - - - redaction-service-server-v1 - ${service.server}.jar - false - ${docker.image.prefix}/${service.server} - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - org.apache.maven.plugins - maven-resources-plugin - - - org.codehaus.mojo - exec-maven-plugin - - - io.fabric8 - docker-maven-plugin - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - download-platform-jar - prepare-package - - copy - - - - - ${project.groupId} - ${service.server} - ${project.version} - jar - true - ${platform.jar} - - - ${docker.build.directory} - - - - - - io.fabric8 - docker-maven-plugin - - - - ${docker.image.name} - - ${docker.build.directory} - - ${platform.jar} - - - ${docker.image.version} - latest - - - - - - - - - - diff --git a/redaction-service-image-v1/src/main/docker/Dockerfile b/redaction-service-image-v1/src/main/docker/Dockerfile deleted file mode 100644 index 1b63dfa6..00000000 --- a/redaction-service-image-v1/src/main/docker/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM red/redaction-service-base-v1:2.0.0 - -ARG PLATFORM_JAR - -ENV PLATFORM_JAR ${PLATFORM_JAR} - -ENV USES_ELASTICSEARCH false - -COPY ["${PLATFORM_JAR}", "/"] diff --git a/redaction-service-v1/pom.xml b/redaction-service-v1/pom.xml deleted file mode 100644 index 34978ace..00000000 --- a/redaction-service-v1/pom.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - platform-dependency - com.iqser.red - 2.2.0 - - - 4.0.0 - - redaction-service-v1 - com.iqser.red.service - 4.0-SNAPSHOT - - pom - - - redaction-service-api-v1 - redaction-service-server-v1 - - - - 2.0.24 - 1.18.26 - - - - - - - com.iqser.red - platform-commons-dependency - 2.5.0 - import - pom - - - org.apache.pdfbox - pdfbox - ${pdfbox.version} - - - org.apache.pdfbox - pdfbox-tools - ${pdfbox.version} - - - - - - - - - org.sonarsource.scanner.maven - sonar-maven-plugin - - - org.owasp - dependency-check-maven - - ALL - - - - org.jacoco - jacoco-maven-plugin - 0.8.8 - - - org/drools/**/* - - - - - prepare-agent - - prepare-agent - - - - report - - report - - - - - - - - - org.projectlombok - lombok-maven-plugin - 1.18.20.0 - - - delombok - generate-sources - - delombok - - - false - src/main/java - ${delomboked.sources} - - - - - - - diff --git a/redaction-service-v1/redaction-service-api-v1/build.gradle.kts b/redaction-service-v1/redaction-service-api-v1/build.gradle.kts new file mode 100644 index 00000000..570167b1 --- /dev/null +++ b/redaction-service-v1/redaction-service-api-v1/build.gradle.kts @@ -0,0 +1,14 @@ + +plugins { + id("com.iqser.red.service.java-conventions") + id("io.freefair.lombok") version "8.1.0" +} + +description = "redaction-service-api-v1" + +dependencies { + implementation("org.springframework:spring-web:6.0.6") + implementation("com.iqser.red.service:persistence-service-internal-api-v1:RED-6725") +} + + diff --git a/redaction-service-v1/redaction-service-api-v1/pom.xml b/redaction-service-v1/redaction-service-api-v1/pom.xml deleted file mode 100644 index 44f6aca7..00000000 --- a/redaction-service-v1/redaction-service-api-v1/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - 4.0.0 - - redaction-service-v1 - com.iqser.red.service - 4.0-SNAPSHOT - - - redaction-service-api-v1 - - - 2.93.0 - - - - - - org.springframework - spring-web - true - - - - com.iqser.red.service - persistence-service-internal-api-v1 - ${persistence-service.version} - - - - com.iqser.red.service - redaction-service-api-v1 - - - com.iqser.red.service - persistence-service-api-v1 - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - org.projectlombok - lombok - ${lombok.version} - - - - - - - diff --git a/redaction-service-v1/redaction-service-server-v1/build.gradle.kts b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts new file mode 100644 index 00000000..01554a39 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts @@ -0,0 +1,90 @@ +import org.springframework.boot.gradle.tasks.bundling.BootBuildImage + +plugins { + application + id("com.iqser.red.service.java-conventions") + id("org.springframework.boot") version "3.0.6" + id("io.spring.dependency-management") version "1.1.0" + id("org.sonarqube") version "4.2.1.3168" + id("io.freefair.lombok") version "8.1.0" +} + +description = "redaction-service-server-v1" + + +val layoutParserVersion = "0.18.0" +val jacksonVersion = "2.14.2" +val droolsVersion = "8.37.0.Final" +val pdfBoxVersion = "3.0.0-alpha2" + +configurations { + all { + exclude(group = "org.springframework.boot", module = "spring-boot-starter-logging") + } +} + +dependencies { + + implementation(project(":redaction-service-api-v1")) { exclude(group = "com.iqser.red.service", module = "persistence-service-internal-api-v1") } + implementation("com.iqser.red.service:persistence-service-internal-api-v1:2.119.0") { exclude(group = "org.springframework.boot") } + implementation("com.knecon.fforesight:layoutparser-service-internal-api:${layoutParserVersion}") + + implementation("com.iqser.red.commons:spring-commons:2.1.0") + implementation("com.iqser.red.commons:metric-commons:2.1.0") + + implementation("com.iqser.red.commons:dictionary-merge-commons:1.3.0") + implementation("com.iqser.red.commons:storage-commons:2.1.0") + implementation("com.knecon.fforesight:tenant-commons:0.10.0") + + implementation("com.fasterxml.jackson.module:jackson-module-afterburner:${jacksonVersion}") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${jacksonVersion}") + implementation("org.ahocorasick:ahocorasick:0.6.3") + implementation("org.javassist:javassist:3.29.2-GA") + + implementation("org.drools:drools-engine:${droolsVersion}") + implementation("org.drools:drools-mvel:${droolsVersion}") + implementation("org.kie:kie-spring:7.73.0.Final") + + implementation("org.locationtech.jts:jts-core:1.19.0") + + implementation("org.springframework.cloud:spring-cloud-starter-openfeign:4.0.1") + implementation("org.springframework.boot:spring-boot-starter-amqp:3.0.4") + + testImplementation("org.apache.pdfbox:pdfbox:${pdfBoxVersion}") + testImplementation("org.apache.pdfbox:pdfbox-tools:${pdfBoxVersion}") + + testImplementation("org.springframework.boot:spring-boot-starter-test:3.0.4") + testImplementation("com.knecon.fforesight:layoutparser-service-processor:${layoutParserVersion}") { + exclude( + group = "com.iqser.red.service", + module = "persistence-service-shared-api-v1" + ) + } +} + +tasks.test { + configure { + excludes = listOf("org/drools/**/*") + } +} + + +tasks.named("bootBuildImage") { + imageName.set("nexus.knecon.com:5001/red/${project.name}:${project.version}") + if (project.hasProperty("buildbootDockerHostNetwork")) { + network.set("host") + } + docker { + if (project.hasProperty("buildbootDockerHostNetwork")) { + bindHostToBuilder.set(true) + } + verboseLogging.set(true) + + publishRegistry { + username.set(providers.gradleProperty("mavenUser").getOrNull()) + password.set(providers.gradleProperty("mavenPassword").getOrNull()) + email.set(providers.gradleProperty("mavenEmail").getOrNull()) + url.set("https://nexus.knecon.com:5001/") + } + } +} diff --git a/redaction-service-v1/redaction-service-server-v1/pom.xml b/redaction-service-v1/redaction-service-server-v1/pom.xml deleted file mode 100644 index e063363e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/pom.xml +++ /dev/null @@ -1,217 +0,0 @@ - - - 4.0.0 - - redaction-service-v1 - com.iqser.red.service - 4.0-SNAPSHOT - - - redaction-service-server-v1 - - - 8.37.0.Final - 7.73.0.Final - 1.19.0 - 3.29.2-GA - 0.6.3 - 2.14.2 - 0.10.0 - - - - - com.knecon.fforesight - tenant-commons - ${tennat-commons.version} - - - org.springframework.boot - spring-boot-starter-aop - - - - com.iqser.red.commons - dictionary-merge-commons - 1.3.0 - - - - com.iqser.red.commons - storage-commons - 2.1.0 - - - - com.fasterxml.jackson.module - jackson-module-afterburner - ${jackson.version} - - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - ${jackson.version} - - - - org.ahocorasick - ahocorasick - ${ahocorasick.version} - - - - org.javassist - javassist - ${javaassist.version} - - - - com.iqser.red.service - redaction-service-api-v1 - ${project.version} - - - org.drools - drools-engine - ${drools.version} - - - org.drools - drools-mvel - ${drools.version} - - - org.kie - kie-spring - ${kie.version} - - - org.locationtech.jts - jts-core - ${locationtech.version} - - - com.google.guava - guava - - - - - com.iqser.red.commons - spring-commons - - - com.iqser.red.commons - logging-commons - - - com.iqser.red.commons - metric-commons - - - - org.apache.pdfbox - pdfbox - - - org.apache.pdfbox - pdfbox-tools - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - org.springframework.boot - spring-boot-starter-amqp - - - - - org.springframework.boot - spring-boot-starter-test - test - - - com.iqser.red.commons - test-commons - test - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - org.projectlombok - lombok - ${lombok.version} - - - - - - - - pl.project13.maven - git-commit-id-plugin - - - - revision - - - true - - true - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - original-jar - - jar - - - original - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - true - - - - - - - diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentData.java new file mode 100644 index 00000000..11933064 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentData.java @@ -0,0 +1,25 @@ +package com.iqser.red.service.redaction.v1.server.document.data; + +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPage; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPositionData; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentStructure; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentTextData; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.experimental.FieldDefaults; + +@Data +@Builder +@AllArgsConstructor +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +public class DocumentData { + + DocumentPage[] documentPages; + DocumentTextData[] documentTextData; + DocumentPositionData[] documentPositionData; + DocumentStructure documentStructure; + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/DocumentGraphMapper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/DocumentGraphMapper.java similarity index 61% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/DocumentGraphMapper.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/DocumentGraphMapper.java index 371e0f35..5f3444d4 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/DocumentGraphMapper.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/DocumentGraphMapper.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper; +package com.iqser.red.service.redaction.v1.server.document.data.mapper; import java.util.Arrays; import java.util.HashSet; @@ -7,26 +7,26 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.AtomicPositionBlockData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.AtomicTextBlockData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.DocumentData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.DocumentTreeData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.PageData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Footer; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Header; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Headline; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlockCollector; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Footer; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Header; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; +import com.iqser.red.service.redaction.v1.server.document.data.DocumentData; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Headline; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPage; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPositionData; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentStructure; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentTextData; import lombok.experimental.UtilityClass; @@ -39,23 +39,23 @@ public class DocumentGraphMapper { DocumentTree documentTree = new DocumentTree(document); Context context = new Context(documentData, documentTree); - context.pages.addAll(Arrays.stream(documentData.getPages()).map(DocumentGraphMapper::buildPage).toList()); + context.pageData.addAll(Arrays.stream(documentData.getDocumentPages()).map(DocumentGraphMapper::buildPage).toList()); - context.documentTree.getRoot().getChildren().addAll(buildEntries(documentData.getDocumentTreeData().getRoot().getChildren(), context)); + context.documentTree.getRoot().getChildren().addAll(buildEntries(documentData.getDocumentStructure().getRoot().getChildren(), context)); document.setDocumentTree(context.documentTree); - document.setPages(new HashSet<>(context.pages)); - document.setNumberOfPages(documentData.getPages().length); + document.setPages(new HashSet<>(context.pageData)); + document.setNumberOfPages(documentData.getDocumentPages().length); document.setTextBlock(document.getTextBlock()); return document; } - private List buildEntries(List entries, Context context) { + private List buildEntries(List entries, Context context) { List newEntries = new LinkedList<>(); - for (DocumentTreeData.EntryData entryData : entries) { + for (DocumentStructure.EntryData entryData : entries) { List pages = Arrays.stream(entryData.getPageNumbers()).map(pageNumber -> getPage(pageNumber, context)).toList(); @@ -154,14 +154,14 @@ public class DocumentGraphMapper { private AtomicTextBlock getAtomicTextBlock(Context context, SemanticNode parent, Long atomicTextBlockId) { - return AtomicTextBlock.fromAtomicTextBlockData(context.atomicTextBlockData.get(Math.toIntExact(atomicTextBlockId)), - context.atomicPositionBlockData.get(Math.toIntExact(atomicTextBlockId)), + return AtomicTextBlock.fromAtomicTextBlockData(context.documentTextData.get(Math.toIntExact(atomicTextBlockId)), + context.documentPositionData.get(Math.toIntExact(atomicTextBlockId)), parent, - getPage(context.atomicTextBlockData.get(Math.toIntExact(atomicTextBlockId)).getPage(), context)); + getPage(context.documentTextData.get(Math.toIntExact(atomicTextBlockId)).getPage(), context)); } - private Page buildPage(PageData p) { + private Page buildPage(DocumentPage p) { return Page.builder().rotation(p.getRotation()).height(p.getHeight()).width(p.getWidth()).number(p.getNumber()).mainBody(new LinkedList<>()).build(); } @@ -169,7 +169,7 @@ public class DocumentGraphMapper { private Page getPage(Long pageIndex, Context context) { - return context.pages.stream() + return context.pageData.stream() .filter(page -> page.getNumber() == Math.toIntExact(pageIndex)) .findFirst() .orElseThrow(() -> new NoSuchElementException(String.format("ClassificationPage with number %d not found", pageIndex))); @@ -179,17 +179,17 @@ public class DocumentGraphMapper { static final class Context { private final DocumentTree documentTree; - private final List pages; - private final List atomicTextBlockData; - private final List atomicPositionBlockData; + private final List pageData; + private final List documentTextData; + private final List documentPositionData; Context(DocumentData documentData, DocumentTree documentTree) { this.documentTree = documentTree; - this.pages = new LinkedList<>(); - this.atomicTextBlockData = Arrays.stream(documentData.getAtomicTextBlocks()).toList(); - this.atomicPositionBlockData = Arrays.stream(documentData.getAtomicPositionBlocks()).toList(); + this.pageData = new LinkedList<>(); + this.documentTextData = Arrays.stream(documentData.getDocumentTextData()).toList(); + this.documentPositionData = Arrays.stream(documentData.getDocumentPositionData()).toList(); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/PropertiesMapper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/PropertiesMapper.java new file mode 100644 index 00000000..d6b0fa31 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/PropertiesMapper.java @@ -0,0 +1,52 @@ +package com.iqser.red.service.redaction.v1.server.document.data.mapper; + +import java.awt.geom.Rectangle2D; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentStructure; + +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import lombok.experimental.UtilityClass; + +@UtilityClass +public class PropertiesMapper { + + public void parseImageProperties(Map properties, Image.ImageBuilder builder) { + + builder.imageType(ImageType.fromString(properties.get(DocumentStructure.ImageProperties.IMAGE_TYPE))); + builder.transparent(Boolean.parseBoolean(properties.get(DocumentStructure.ImageProperties.TRANSPARENT))); + builder.position(parseRectangle2D(properties.get(DocumentStructure.ImageProperties.POSITION))); + builder.id(properties.get(DocumentStructure.ImageProperties.ID)); + } + + + public void parseTableCellProperties(Map properties, TableCell.TableCellBuilder builder) { + + builder.row(Integer.parseInt(properties.get(DocumentStructure.TableCellProperties.ROW))); + builder.col(Integer.parseInt(properties.get(DocumentStructure.TableCellProperties.COL))); + builder.header(Boolean.parseBoolean(properties.get(DocumentStructure.TableCellProperties.HEADER))); + builder.bBox(parseRectangle2D(properties.get(DocumentStructure.TableCellProperties.B_BOX))); + } + + + public void parseTableProperties(Map properties, Table.TableBuilder builder) { + + builder.numberOfRows(Integer.parseInt(properties.get(DocumentStructure.TableProperties.NUMBER_OF_ROWS))); + builder.numberOfCols(Integer.parseInt(properties.get(DocumentStructure.TableProperties.NUMBER_OF_COLS))); + } + + + private Rectangle2D parseRectangle2D(String bBox) { + + List floats = Arrays.stream(bBox.split(DocumentStructure.RECTANGLE_DELIMITER)).map(Float::parseFloat).toList(); + return new Rectangle2D.Float(floats.get(0), floats.get(1), floats.get(2), floats.get(3)); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/Boundary.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/Boundary.java similarity index 95% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/Boundary.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/Boundary.java index 835c08b3..31116bc5 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/Boundary.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/Boundary.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph; +package com.iqser.red.service.redaction.v1.server.document.graph; import static java.lang.String.format; @@ -6,7 +6,7 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import lombok.EqualsAndHashCode; import lombok.Setter; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/ConsecutiveBoundaryCollector.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/ConsecutiveBoundaryCollector.java similarity index 95% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/ConsecutiveBoundaryCollector.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/ConsecutiveBoundaryCollector.java index 3a35bbc7..aceb9bd7 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/ConsecutiveBoundaryCollector.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/ConsecutiveBoundaryCollector.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph; +package com.iqser.red.service.redaction.v1.server.document.graph; import java.util.LinkedList; import java.util.List; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/DocumentTree.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentTree.java similarity index 85% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/DocumentTree.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentTree.java index 674a4ded..91432036 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/DocumentTree.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentTree.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph; +package com.iqser.red.service.redaction.v1.server.document.graph; import static java.lang.String.format; @@ -7,14 +7,14 @@ import java.util.LinkedList; import java.util.List; import java.util.stream.Stream; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.GenericSemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlockCollector; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.GenericSemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.NodeType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/EntityType.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityType.java similarity index 54% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/EntityType.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityType.java index 362833e5..4db81e91 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/EntityType.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/EntityType.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity; +package com.iqser.red.service.redaction.v1.server.document.graph.entity; public enum EntityType { ENTITY, diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/MatchedRule.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/MatchedRule.java similarity index 95% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/MatchedRule.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/MatchedRule.java index ee1767e2..ee87c15d 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/MatchedRule.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/MatchedRule.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity; +package com.iqser.red.service.redaction.v1.server.document.graph.entity; import java.util.Collections; import java.util.Objects; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/MatchedRuleHolder.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/MatchedRuleHolder.java similarity index 98% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/MatchedRuleHolder.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/MatchedRuleHolder.java index 44af7bf9..9dbab542 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/MatchedRuleHolder.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/MatchedRuleHolder.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity; +package com.iqser.red.service.redaction.v1.server.document.graph.entity; import java.util.Collection; import java.util.HashSet; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/RedactionEntity.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionEntity.java similarity index 94% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/RedactionEntity.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionEntity.java index 5ddc15d9..ed30acf3 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/RedactionEntity.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionEntity.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity; +package com.iqser.red.service.redaction.v1.server.document.graph.entity; import java.awt.geom.Rectangle2D; import java.util.Collection; @@ -11,9 +11,9 @@ import java.util.PriorityQueue; import java.util.Set; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; import com.iqser.red.service.redaction.v1.server.redaction.utils.IdBuilder; import lombok.AccessLevel; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/RedactionPosition.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionPosition.java similarity index 74% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/RedactionPosition.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionPosition.java index 73981a1f..726fb32b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/RedactionPosition.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RedactionPosition.java @@ -1,9 +1,9 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity; +package com.iqser.red.service.redaction.v1.server.document.graph.entity; import java.awt.geom.Rectangle2D; import java.util.List; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/RuleIdentifier.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RuleIdentifier.java similarity index 92% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/RuleIdentifier.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RuleIdentifier.java index 137bcf37..776a50a9 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/entity/RuleIdentifier.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/entity/RuleIdentifier.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity; +package com.iqser.red.service.redaction.v1.server.document.graph.entity; import java.util.Objects; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Document.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Document.java similarity index 85% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Document.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Document.java index 6007f411..60919d36 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Document.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Document.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.awt.geom.Rectangle2D; import java.util.Collections; @@ -10,10 +10,10 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlockCollector; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Footer.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Footer.java similarity index 77% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Footer.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Footer.java index 5419a070..06bd3bff 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Footer.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Footer.java @@ -1,12 +1,12 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.util.HashSet; import java.util.List; import java.util.Set; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/GenericSemanticNode.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/GenericSemanticNode.java new file mode 100644 index 00000000..3ed31fdc --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/GenericSemanticNode.java @@ -0,0 +1,5 @@ +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; + +public interface GenericSemanticNode extends SemanticNode { + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Header.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Header.java similarity index 77% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Header.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Header.java index 57e89e12..28f82e08 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Header.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Header.java @@ -1,12 +1,12 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.util.HashSet; import java.util.List; import java.util.Set; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Headline.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Headline.java similarity index 78% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Headline.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Headline.java index 8eae571b..1b495d6e 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Headline.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Headline.java @@ -1,13 +1,13 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.util.HashSet; import java.util.List; import java.util.Set; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Image.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Image.java similarity index 72% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Image.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Image.java index ed5b64c7..39d610c1 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Image.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Image.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.awt.geom.Rectangle2D; import java.util.Collections; @@ -9,12 +9,12 @@ import java.util.Map; import java.util.PriorityQueue; import java.util.Set; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.MatchedRule; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.MatchedRuleHolder; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlockCollector; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRuleHolder; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/ImageType.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/ImageType.java similarity index 71% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/ImageType.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/ImageType.java index adf2d4ea..5db33ec8 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/ImageType.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/ImageType.java @@ -1,4 +1,6 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; + +import java.util.Locale; public enum ImageType { LOGO, @@ -10,7 +12,7 @@ public enum ImageType { public static ImageType fromString(String imageType) { - return switch (imageType.toLowerCase()) { + return switch (imageType.toLowerCase(Locale.ROOT)) { case "logo" -> ImageType.LOGO; case "formula" -> ImageType.FORMULA; case "signature" -> ImageType.SIGNATURE; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/NodeType.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/NodeType.java similarity index 77% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/NodeType.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/NodeType.java index 78ea7c49..135acb4e 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/NodeType.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/NodeType.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.util.Locale; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Page.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Page.java similarity index 59% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Page.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Page.java index 28e2b60c..a0abb47f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Page.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Page.java @@ -1,14 +1,13 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlockCollector; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -48,18 +47,6 @@ public class Page { Set images = new HashSet<>(); - public static Page fromClassificationPage(ClassificationPage classificationPage) { - - return Page.builder() - .height((int) classificationPage.getPageHeight()) - .width((int) classificationPage.getPageWidth()) - .number(classificationPage.getPageNumber()) - .rotation(classificationPage.getRotation()) - .mainBody(new LinkedList<>()) - .build(); - } - - public TextBlock getMainBodyTextBlock() { return mainBody.stream().filter(SemanticNode::isLeaf).map(SemanticNode::getLeafTextBlock).collect(new TextBlockCollector()); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Paragraph.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Paragraph.java similarity index 72% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Paragraph.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Paragraph.java index 01b78550..bc0f26aa 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Paragraph.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Paragraph.java @@ -1,12 +1,12 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.util.HashSet; import java.util.List; import java.util.Set; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Section.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Section.java similarity index 80% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Section.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Section.java index 106cebf1..3e38c156 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Section.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Section.java @@ -1,13 +1,13 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.util.HashSet; import java.util.List; import java.util.Set; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlockCollector; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SectionIdentifier.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/SectionIdentifier.java similarity index 97% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SectionIdentifier.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/SectionIdentifier.java index b1455c2f..12c3f4e9 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SectionIdentifier.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/SectionIdentifier.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.util.Collections; import java.util.LinkedList; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SemanticNode.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/SemanticNode.java similarity index 95% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SemanticNode.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/SemanticNode.java index d91756c1..6d398921 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/SemanticNode.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/SemanticNode.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import static java.lang.String.format; @@ -7,18 +7,19 @@ import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility; public interface SemanticNode { @@ -371,7 +372,7 @@ public interface SemanticNode { */ default boolean containsStringIgnoreCase(String string) { - return getTextBlock().getSearchText().toLowerCase().contains(string.toLowerCase()); + return getTextBlock().getSearchText().toLowerCase(Locale.ROOT).contains(string.toLowerCase(Locale.ROOT)); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Table.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Table.java similarity index 96% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Table.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Table.java index 4a7c2cbf..a33ea6c5 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/Table.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Table.java @@ -1,18 +1,19 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import static java.lang.String.format; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.stream.IntStream; import java.util.stream.Stream; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlockCollector; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -66,7 +67,7 @@ public class Table implements SemanticNode { */ public boolean rowContainsStringsIgnoreCase(Integer row, List strings) { - String rowText = streamRow(row).map(TableCell::getTextBlock).collect(new TextBlockCollector()).getSearchText().toLowerCase(); + String rowText = streamRow(row).map(TableCell::getTextBlock).collect(new TextBlockCollector()).getSearchText().toLowerCase(Locale.ROOT); return strings.stream().map(String::toLowerCase).allMatch(rowText::contains); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/TableCell.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/TableCell.java similarity index 78% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/TableCell.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/TableCell.java index 704ffc16..7a959d35 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/TableCell.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/TableCell.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; +package com.iqser.red.service.redaction.v1.server.document.graph.nodes; import java.awt.geom.Rectangle2D; import java.util.HashMap; @@ -7,10 +7,10 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlockCollector; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/AtomicTextBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java similarity index 76% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/AtomicTextBlock.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java index 3fc40c4d..83bd426b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/AtomicTextBlock.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock; +package com.iqser.red.service.redaction.v1.server.document.graph.textblock; import static java.lang.String.format; @@ -12,13 +12,12 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.AtomicPositionBlockData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.AtomicTextBlockData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.factory.SearchTextWithTextPositionDto; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPositionData; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentTextData; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -58,28 +57,6 @@ public class AtomicTextBlock implements TextBlock { return lineBreaks.size() + 1; } - - public static AtomicTextBlock fromSearchTextWithTextPositionDto(SearchTextWithTextPositionDto searchTextWithTextPositionDto, - SemanticNode parent, - int stringOffset, - Long textBlockIdx, - Integer numberOnPage, - Page page) { - - return AtomicTextBlock.builder() - .id(textBlockIdx) - .parent(parent) - .searchText(searchTextWithTextPositionDto.getSearchText()) - .numberOnPage(numberOnPage) - .page(page) - .lineBreaks(searchTextWithTextPositionDto.getLineBreaks()) - .positions(searchTextWithTextPositionDto.getPositions()) - .stringIdxToPositionIdx(searchTextWithTextPositionDto.getStringCoordsToPositionCoords()) - .boundary(new Boundary(stringOffset, stringOffset + searchTextWithTextPositionDto.getSearchText().length())) - .build(); - } - - public static AtomicTextBlock empty(Long textBlockIdx, int stringOffset, Page page, int numberOnPage, SemanticNode parent) { return AtomicTextBlock.builder() @@ -96,8 +73,8 @@ public class AtomicTextBlock implements TextBlock { } - public static AtomicTextBlock fromAtomicTextBlockData(AtomicTextBlockData atomicTextBlockData, - AtomicPositionBlockData atomicPositionBlockData, + public static AtomicTextBlock fromAtomicTextBlockData(DocumentTextData atomicTextBlockData, + DocumentPositionData atomicPositionBlockData, SemanticNode parent, Page page) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/ConcatenatedTextBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/ConcatenatedTextBlock.java similarity index 96% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/ConcatenatedTextBlock.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/ConcatenatedTextBlock.java index 959c05ef..392f968d 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/ConcatenatedTextBlock.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/ConcatenatedTextBlock.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock; +package com.iqser.red.service.redaction.v1.server.document.graph.textblock; import static java.lang.String.format; @@ -10,8 +10,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Stream; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; import lombok.AccessLevel; import lombok.Data; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/TextBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlock.java similarity index 90% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/TextBlock.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlock.java index 0270bf20..e75760a8 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/TextBlock.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlock.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock; +package com.iqser.red.service.redaction.v1.server.document.graph.textblock; import static java.lang.String.format; @@ -10,9 +10,9 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; public interface TextBlock extends CharSequence { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/TextBlockCollector.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlockCollector.java similarity index 91% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/TextBlockCollector.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlockCollector.java index 119e636f..bb98abe3 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/TextBlockCollector.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/TextBlockCollector.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock; +package com.iqser.red.service.redaction.v1.server.document.graph.textblock; import java.util.Set; import java.util.function.BiConsumer; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/EntityCreationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/services/EntityCreationService.java similarity index 93% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/EntityCreationService.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/services/EntityCreationService.java index a2313503..acd0c68b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/EntityCreationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/services/EntityCreationService.java @@ -1,8 +1,6 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.services; +package com.iqser.red.service.redaction.v1.server.document.services; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.getExpandedEndByRegex; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.getExpandedStartByRegex; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; import static com.iqser.red.service.redaction.v1.server.redaction.utils.SeparatorUtils.boundaryIsSurroundedBySeparators; import static java.util.stream.Collectors.toMap; @@ -22,20 +20,20 @@ import org.kie.api.runtime.KieSession; import com.google.common.base.Functions; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.ConsecutiveBoundaryCollector; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionPosition; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.NodeType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.graph.ConsecutiveBoundaryCollector; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.SearchImplementation; @@ -450,14 +448,14 @@ public class EntityCreationService { public Optional byPrefixExpansionRegex(RedactionEntity entity, String regexPattern) { - int expandedStart = getExpandedStartByRegex(entity, regexPattern); + int expandedStart = RedactionSearchUtility.getExpandedStartByRegex(entity, regexPattern); return byBoundary(new Boundary(expandedStart, entity.getBoundary().end()), entity.getType(), entity.getEntityType(), entity.getDeepestFullyContainingNode()); } public Optional bySuffixExpansionRegex(RedactionEntity entity, String regexPattern) { - int expandedEnd = getExpandedEndByRegex(entity, regexPattern); + int expandedEnd = RedactionSearchUtility.getExpandedEndByRegex(entity, regexPattern); expandedEnd = truncateEndIfLineBreakIsBetween(entity.getBoundary().end(), expandedEnd, entity.getDeepestFullyContainingNode().getTextBlock()); return byBoundary(new Boundary(entity.getBoundary().start(), expandedEnd), entity.getType(), entity.getEntityType(), entity.getDeepestFullyContainingNode()); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/EntityEnrichmentService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/services/EntityEnrichmentService.java similarity index 91% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/EntityEnrichmentService.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/services/EntityEnrichmentService.java index 7f0a437e..3578d3ca 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/EntityEnrichmentService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/services/EntityEnrichmentService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.services; +package com.iqser.red.service.redaction.v1.server.document.services; import java.util.Arrays; import java.util.List; @@ -6,8 +6,8 @@ import java.util.Objects; import org.springframework.stereotype.Service; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; import lombok.RequiredArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/ManualRedactionApplicationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/services/ManualRedactionApplicationService.java similarity index 82% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/ManualRedactionApplicationService.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/services/ManualRedactionApplicationService.java index d9bf3bcf..e1d4ea29 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/ManualRedactionApplicationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/services/ManualRedactionApplicationService.java @@ -1,14 +1,14 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.services; +package com.iqser.red.service.redaction.v1.server.document.services; import java.awt.geom.Rectangle2D; import java.util.NoSuchElementException; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionPosition; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; import lombok.RequiredArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformations.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RectangleTransformations.java similarity index 80% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformations.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RectangleTransformations.java index 8211323d..28d036ab 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformations.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RectangleTransformations.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils; +package com.iqser.red.service.redaction.v1.server.document.utils; import java.awt.geom.Rectangle2D; import java.awt.geom.RectangularShape; @@ -12,39 +12,16 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; -import org.apache.pdfbox.pdmodel.common.PDRectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; public class RectangleTransformations { - public static PDRectangle toPDRectangleBBox(List rectangles) { - - Rectangle2D rectangle2D = RectangleTransformations.rectangleBBox(rectangles); - - PDRectangle annotationPosition = new PDRectangle(); - annotationPosition.setLowerLeftX((float) rectangle2D.getMinX()); - annotationPosition.setLowerLeftY((float) rectangle2D.getMinY()); - annotationPosition.setUpperRightX((float) rectangle2D.getMaxX()); - annotationPosition.setUpperRightY((float) rectangle2D.getMaxY()); - return annotationPosition; - } - - public static Rectangle2D abstractPageBlockBBox(List abstractPageBlocks) { - - return abstractPageBlocks.stream() - .map(abstractPageBlock -> new Rectangle2D.Double(abstractPageBlock.getMinX(), - abstractPageBlock.getMinY(), - abstractPageBlock.getWidth(), - abstractPageBlock.getHeight())).collect(new Rectangle2DBBoxCollector()); - } - public static Rectangle2D atomicTextBlockBBox(List atomicTextBlocks) { @@ -114,12 +91,6 @@ public class RectangleTransformations { } - public static Rectangle2D toRectangle2D(PDRectangle cropBox) { - - return new Rectangle2D.Double(cropBox.getLowerLeftX(), cropBox.getLowerLeftY(), cropBox.getWidth(), cropBox.getHeight()); - } - - private static class Rectangle2DBBoxCollector implements Collector { @Override diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RedactionSearchUtility.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RedactionSearchUtility.java similarity index 94% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RedactionSearchUtility.java rename to redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RedactionSearchUtility.java index 628fcf04..a87f37e6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RedactionSearchUtility.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RedactionSearchUtility.java @@ -1,18 +1,17 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils; +package com.iqser.red.service.redaction.v1.server.document.utils; import static java.lang.String.format; import java.awt.geom.Rectangle2D; import java.util.LinkedList; import java.util.List; -import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.IntStream; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns; import lombok.experimental.UtilityClass; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/ImageServiceResponseAdapter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/ImageServiceResponseAdapter.java deleted file mode 100644 index 9c395a1f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/ImageServiceResponseAdapter.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter; - -import java.awt.geom.Rectangle2D; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import org.springframework.stereotype.Service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image.ImageServiceResponse; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; -import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; - -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; - -@Service -@RequiredArgsConstructor -public class ImageServiceResponseAdapter { - - private final ObjectMapper objectMapper; - private final RedactionStorageService redactionStorageService; - - - @SneakyThrows - public Map> convertImages(String dossierId, String fileId) { - - var imageClassificationStream = redactionStorageService.getStoredObject(RedactionStorageService.StorageIdUtils.getStorageId(dossierId, fileId, FileType.IMAGE_INFO)); - - ImageServiceResponse imageServiceResponse = objectMapper.readValue(imageClassificationStream, ImageServiceResponse.class); - - Map> images = new HashMap<>(); - imageServiceResponse.getData().forEach(imageMetadata -> { - var classification = imageMetadata.getFilters().isAllPassed() ? ImageType.valueOf(imageMetadata.getClassification() - .getLabel() - .toUpperCase(Locale.ROOT)) : ImageType.OTHER; - images.computeIfAbsent(imageMetadata.getPosition().getPageNumber(), x -> new ArrayList<>()) - .add(new ClassifiedImage(new Rectangle2D.Double(imageMetadata.getPosition().getX1(), - imageMetadata.getPosition().getY1(), - imageMetadata.getGeometry().getWidth(), - imageMetadata.getGeometry().getHeight()), classification, imageMetadata.isAlpha(), imageMetadata.getPosition().getPageNumber())); - }); - - // Currently This is a copy but, it will be changed later because i don' t think that we should unclassified images. - imageServiceResponse.getDataCV().forEach(imageMetadata -> { - var classification = imageMetadata.getFilters().isAllPassed() ? ImageType.valueOf(imageMetadata.getClassification() - .getLabel() - .toUpperCase(Locale.ROOT)) : ImageType.OTHER; - images.computeIfAbsent(imageMetadata.getPosition().getPageNumber(), x -> new ArrayList<>()) - .add(new ClassifiedImage(new Rectangle2D.Double(imageMetadata.getPosition().getX1(), - imageMetadata.getPosition().getY1(), - imageMetadata.getGeometry().getWidth(), - imageMetadata.getGeometry().getHeight()), classification, imageMetadata.isAlpha(), imageMetadata.getPosition().getPageNumber())); - }); - - return images; - } - - - public void findOcr(ClassificationPage page) { - - page.getImages().forEach(image -> { - if (image.getImageType().equals(ImageType.OTHER)) { - page.getTextBlocks().forEach(textblock -> { - if (image.getPosition().contains(textblock.getMinX(), textblock.getMinY(), textblock.getWidth(), textblock.getHeight())) { - image.setImageType(ImageType.OCR); - } - }); - } - }); - } - - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/TableServiceResponseAdapter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/TableServiceResponseAdapter.java deleted file mode 100644 index 779414f5..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/TableServiceResponseAdapter.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.stereotype.Service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.PdfTableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.TableCells; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.TableServiceResponse; -import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; - -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class TableServiceResponseAdapter { - - private final ObjectMapper objectMapper; - private final RedactionStorageService redactionStorageService; - - - @SneakyThrows - public Map> convertTables(String dossierId, String fileId) { - - var tableClassificationStream = redactionStorageService.getStoredObject(RedactionStorageService.StorageIdUtils.getStorageId(dossierId, fileId, FileType.TABLES)); - - TableServiceResponse tableServiceResponse = objectMapper.readValue(tableClassificationStream, TableServiceResponse.class); - - Map> tableCells = new HashMap<>(); - tableServiceResponse.getData() - .forEach(tableData -> tableCells.computeIfAbsent(tableData.getPageInfo().getNumber(), tableCell -> new ArrayList<>()) - .addAll(convertTableCells(tableData.getTableCells()))); - - return tableCells; - } - - - private Collection convertTableCells(List tableCells) { - - List pdfTableCells = new ArrayList<>(); - - tableCells.forEach(t -> pdfTableCells.add(PdfTableCell.builder() - .y0(t.getY0()) - .x1(t.getX1()) - .y1(t.getY1()) - .x0(t.getX0()) - .width(t.getWidth()) - .height(t.getHeight()) - .build())); - - return pdfTableCells; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Classification.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Classification.java deleted file mode 100644 index 9de8a10d..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Classification.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import java.util.HashMap; -import java.util.Map; - -import lombok.Data; - -@Data -public class Classification { - - private Map probabilities = new HashMap<>(); - private String label; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/FilterGeometry.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/FilterGeometry.java deleted file mode 100644 index ed8fead8..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/FilterGeometry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class FilterGeometry { - - private ImageSize imageSize; - private ImageFormat imageFormat; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Filters.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Filters.java deleted file mode 100644 index ee0e7723..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Filters.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class Filters { - - private FilterGeometry geometry; - private Probability probability; - private boolean allPassed; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Geometry.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Geometry.java deleted file mode 100644 index ddebcdf8..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Geometry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class Geometry { - - private float width; - private float height; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageFormat.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageFormat.java deleted file mode 100644 index 7cea1acb..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageFormat.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class ImageFormat { - - private float quotient; - private boolean tooTall; - private boolean tooWide; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageMetadata.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageMetadata.java deleted file mode 100644 index 1efe46dd..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageMetadata.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class ImageMetadata { - - private Classification classification; - private Position position; - private Geometry geometry; - private Filters filters; - private boolean alpha; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageServiceResponse.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageServiceResponse.java deleted file mode 100644 index 8a23e734..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageServiceResponse.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import java.util.ArrayList; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.annotation.JsonProperty; - -import lombok.Data; - -@Data -public class ImageServiceResponse { - - private String dossierId; - private String fileId; - - @JsonProperty(value = "imageMetadata") - @JsonAlias("data") - private List data = new ArrayList<>(); - - private List dataCV = new ArrayList<>(); - - - @JsonProperty(value = "imageMetadata") - @JsonAlias("data") - public void setData(List data) {this.data = data;} - - - public List getData() { - - if (this.data == null) { - this.data = new ArrayList<>(); - } - return data; - } - - - public List getDataCV() { - - if (this.dataCV == null) { - this.dataCV = new ArrayList<>(); - } - return dataCV; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageSize.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageSize.java deleted file mode 100644 index 226f6ca1..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageSize.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class ImageSize { - - private float quotient; - private boolean tooLarge; - private boolean tooSmall; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Position.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Position.java deleted file mode 100644 index 911f5aed..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Position.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class Position { - - private float x1; - private float x2; - private float y1; - private float y2; - private int pageNumber; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Probability.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Probability.java deleted file mode 100644 index db286e40..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Probability.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class Probability { - - private boolean unconfident; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PageInfo.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PageInfo.java deleted file mode 100644 index f13a5a72..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PageInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import lombok.Data; - -@Data -public class PageInfo { - - private int number; - private int rotation; - private float width; - private float height; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PdfTableCell.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PdfTableCell.java deleted file mode 100644 index 313778bc..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PdfTableCell.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@RequiredArgsConstructor -public class PdfTableCell { - - private float x0; - private float y0; - private float x1; - private float y1; - private float width; - private float height; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableCells.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableCells.java deleted file mode 100644 index 1771b794..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableCells.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import lombok.Data; - -@Data -public class TableCells { - - private float x0; - private float y0; - private float x1; - private float y1; - private float width; - private float height; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableData.java deleted file mode 100644 index 5426e952..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableData.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import java.util.ArrayList; -import java.util.List; - -import lombok.Data; - -@Data -public class TableData { - - private PageInfo pageInfo; - private List tableCells = new ArrayList<>(); - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableServiceResponse.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableServiceResponse.java deleted file mode 100644 index 2afc4a80..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableServiceResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import java.util.ArrayList; -import java.util.List; - -import lombok.Data; - -@Data -public class TableServiceResponse { - - private String dossierId; - private String fileId; - private String operation; - private String targetFileExtension; - private String responseFileExtension; - - private List data = new ArrayList<>(); - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/AbstractPageBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/AbstractPageBlock.java deleted file mode 100644 index d4a49133..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/AbstractPageBlock.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public abstract class AbstractPageBlock { - - @JsonIgnore - protected float minX; - @JsonIgnore - protected float maxX; - @JsonIgnore - protected float minY; - @JsonIgnore - protected float maxY; - @JsonIgnore - protected PageBlockType classification; - @JsonIgnore - protected int page; - - int columnIndex; - - @JsonIgnore - private Orientation orientation = Orientation.NONE; - - - public abstract String getText(); - - - public boolean isHeadline() { - - return this instanceof TextPageBlock && this.getClassification() != null && this.getClassification().isHeadline(); - } - - - public boolean containsBlock(TextPageBlock other) { - - return this.minX <= other.getPdfMinX() && this.maxX >= other.getPdfMaxX() && this.minY >= other.getPdfMinY() && this.maxY <= other.getPdfMaxY(); - } - - - public boolean contains(AbstractPageBlock other) { - - return this.minX <= other.minX && this.maxX >= other.maxX && this.minY >= other.minY && this.maxY <= other.maxY; - } - - - public boolean contains(Rectangle other) { - - return page == other.getPage() && this.minX <= other.getTopLeft().getX() && this.maxX >= other.getTopLeft().getX() + other.getWidth() && this.minY <= other.getTopLeft() - .getY() && this.maxY >= other.getTopLeft().getY() + other.getHeight(); - } - - - @JsonIgnore - public float getHeight() { - - return maxY - minY; - } - - - @JsonIgnore - public float getWidth() { - - return maxX - minX; - } - - - public boolean intersectsY(AbstractPageBlock atc) { - - return this.minY <= atc.getMaxY() && this.maxY >= atc.getMinY(); - } - - - public boolean intersectsX(AbstractPageBlock atc) { - - return this.minX <= atc.getMaxX() && this.maxX >= atc.getMinX(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationDocument.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationDocument.java deleted file mode 100644 index e27faf0e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationDocument.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.ArrayList; -import java.util.List; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.UnclassifiedText; -import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryVersion; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class ClassificationDocument { - - private List pages = new ArrayList<>(); - private List sections = new ArrayList<>(); - private List headers = new ArrayList<>(); - private List footers = new ArrayList<>(); - private List unclassifiedTexts = new ArrayList<>(); - private FloatFrequencyCounter textHeightCounter = new FloatFrequencyCounter(); - private FloatFrequencyCounter fontSizeCounter = new FloatFrequencyCounter(); - private StringFrequencyCounter fontCounter = new StringFrequencyCounter(); - private StringFrequencyCounter fontStyleCounter = new StringFrequencyCounter(); - private boolean headlines; - - private SectionGrid sectionGrid = new SectionGrid(); - private DictionaryVersion dictionaryVersion; - private long rulesVersion; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationFooter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationFooter.java deleted file mode 100644 index 221bda7f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationFooter.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class ClassificationFooter { - - private List textBlocks; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationHeader.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationHeader.java deleted file mode 100644 index 53f1972a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationHeader.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class ClassificationHeader { - - private List textBlocks; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationPage.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationPage.java deleted file mode 100644 index d9b38623..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationPage.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.ArrayList; -import java.util.List; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; - -import lombok.Data; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -@Data -@RequiredArgsConstructor -public class ClassificationPage { - - @NonNull - private List textBlocks; - - private List images = new ArrayList<>(); - - private Rectangle bodyTextFrame; - - private boolean landscape; - private int rotation; - - private int pageNumber; - - private FloatFrequencyCounter textHeightCounter = new FloatFrequencyCounter(); - private FloatFrequencyCounter fontSizeCounter = new FloatFrequencyCounter(); - private StringFrequencyCounter fontCounter = new StringFrequencyCounter(); - private StringFrequencyCounter fontStyleCounter = new StringFrequencyCounter(); - - private float pageWidth; - private float pageHeight; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationSection.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationSection.java deleted file mode 100644 index 5ee7a0a4..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationSection.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.ArrayList; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class ClassificationSection { - - private List pageBlocks = new ArrayList<>(); - private List images = new ArrayList<>(); - private String headline; - - - public List getTables() { - - List tables = new ArrayList<>(); - pageBlocks.forEach(block -> { - if (block instanceof TablePageBlock) { - tables.add((TablePageBlock) block); - } - }); - return tables; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Column.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Column.java deleted file mode 100644 index ffd4a37d..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Column.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.awt.geom.Rectangle2D; - -import lombok.AllArgsConstructor; - -@AllArgsConstructor -public class Column { - - int index; - ColumnType columnType; - Rectangle2D bBox; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ColumnType.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ColumnType.java deleted file mode 100644 index d2212c42..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ColumnType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -public enum ColumnType { - RULING, - DISTANCE -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/FloatFrequencyCounter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/FloatFrequencyCounter.java deleted file mode 100755 index f656a839..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/FloatFrequencyCounter.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import lombok.Getter; - -public class FloatFrequencyCounter { - - @Getter - Map countPerValue = new HashMap<>(); - - - public void add(float value) { - - if (!countPerValue.containsKey(value)) { - countPerValue.put(value, 1); - } else { - countPerValue.put(value, countPerValue.get(value) + 1); - } - } - - - public void addAll(Map otherCounter) { - - for (Map.Entry entry : otherCounter.entrySet()) { - if (countPerValue.containsKey(entry.getKey())) { - countPerValue.put(entry.getKey(), countPerValue.get(entry.getKey()) + entry.getValue()); - } else { - countPerValue.put(entry.getKey(), entry.getValue()); - } - } - } - - - public Float getMostPopular() { - - Map.Entry mostPopular = null; - for (Map.Entry entry : countPerValue.entrySet()) { - if (mostPopular == null || entry.getValue() >= mostPopular.getValue()) { - mostPopular = entry; - } - } - return mostPopular != null ? mostPopular.getKey() : null; - } - - - public List getHighterThanMostPopular() { - - Float mostPopular = getMostPopular(); - List higher = new ArrayList<>(); - for (Float value : countPerValue.keySet()) { - if (value > mostPopular) { - higher.add(value); - } - } - - return higher.stream().sorted(Collections.reverseOrder()).collect(Collectors.toList()); - } - - - public Float getHighest() { - - Float highest = null; - for (Float value : countPerValue.keySet()) { - if (highest == null || value > highest) { - highest = value; - } - } - return highest; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Orientation.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Orientation.java deleted file mode 100644 index 5cd6a10f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Orientation.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -public enum Orientation { - - NONE, - LEFT, - RIGHT -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/PageBlockType.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/PageBlockType.java deleted file mode 100644 index d2991efd..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/PageBlockType.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -public enum PageBlockType { - H1, - H2, - H3, - H4, - H5, - H6, - HEADER, - FOOTER, - TITLE, - PARAGRAPH, - PARAGRAPH_BOLD, - PARAGRAPH_ITALIC, - PARAGRAPH_UNKNOWN, - OTHER, - TABLE; - - - public static PageBlockType getHeadlineType(int i) { - - return switch (i) { - case 1 -> PageBlockType.H1; - case 2 -> PageBlockType.H2; - case 3 -> PageBlockType.H3; - case 4 -> PageBlockType.H4; - case 5 -> PageBlockType.H5; - default -> PageBlockType.H6; - }; - } - - - public boolean isHeadline() { - - return this.equals(H1) || this.equals(H2) || this.equals(H3) || this.equals(H4) || this.equals(H5) || this.equals(H6); - } -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/image/ClassifiedImage.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/image/ClassifiedImage.java deleted file mode 100644 index c9129e08..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/image/ClassifiedImage.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image; - -import java.awt.geom.Rectangle2D; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; - -import lombok.Data; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -@Data -@RequiredArgsConstructor -public class ClassifiedImage { - - @NonNull - private Rectangle2D position; - @NonNull - private ImageType imageType; - private boolean isAppendedToSection; - @NonNull - private boolean hasTransparency; - @NonNull - private int page; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Cell.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Cell.java deleted file mode 100644 index 19b64a6a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Cell.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@SuppressWarnings("serial") -@Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -public class Cell extends Rectangle { - - private List textBlocks = new ArrayList<>(); - - private List headerCells = new ArrayList<>(); - - private boolean isHeaderCell; - - private static final int MIN_SIZE = 1; - - private int pageNumber; - - - public Cell(Point2D topLeft, Point2D bottomRight) { - - super((float) topLeft.getY(), (float) topLeft.getX(), (float) (bottomRight.getX() - topLeft.getX()), (float) (bottomRight.getY() - topLeft.getY())); - } - - - public void addTextBlock(TextPageBlock textBlock) { - - textBlocks.add(textBlock); - } - - - @Override - public String toString() { - - StringBuilder sb = new StringBuilder(); - - Iterator itty = textBlocks.iterator(); - TextPositionSequence previous = null; - while (itty.hasNext()) { - - TextPageBlock textBlock = itty.next(); - - for (TextPositionSequence word : textBlock.getSequences()) { - if (previous != null) { - if (Math.abs(previous.getMaxYDirAdj() - word.getMaxYDirAdj()) > word.getTextHeight()) { - sb.append('\n'); - } else { - sb.append(' '); - } - } - sb.append(word.toString()); - previous = word; - } - - } - - return TextNormalizationUtilities.removeHyphenLineBreaks(sb.toString()).replaceAll("\n", " ").replaceAll(" {2}", " "); - } - - - public boolean hasMinimumSize() { - - return this.getHeight() >= MIN_SIZE && this.getWidth() >= MIN_SIZE; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CellPosition.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CellPosition.java deleted file mode 100644 index bec2f274..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CellPosition.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import lombok.RequiredArgsConstructor; -import lombok.Value; - -@Value -@RequiredArgsConstructor -public class CellPosition implements Comparable { - - int row; - - int col; - - - @Override - public int compareTo(CellPosition other) { - - int rowDiff = row - other.row; - return rowDiff != 0 ? rowDiff : col - other.col; - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CleanRulings.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CleanRulings.java deleted file mode 100644 index 8e41b20a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CleanRulings.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.util.List; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class CleanRulings { - - List horizontal; - List vertical; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Rectangle.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Rectangle.java deleted file mode 100644 index c20f2368..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Rectangle.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.util.Comparator; -import java.util.List; - -@SuppressWarnings("all") -public class Rectangle extends Rectangle2D.Float { - - protected static final float VERTICAL_COMPARISON_THRESHOLD = 0.4f; - /** - * Ill-defined comparator, from when Rectangle was Comparable. - *

- * see https://github.com/tabulapdf/tabula-java/issues/116 - * - * @deprecated with no replacement - */ - @Deprecated - public static final Comparator ILL_DEFINED_ORDER = new Comparator() { - @Override - public int compare(Rectangle o1, Rectangle o2) { - - if (o1.equals(o2)) { - return 0; - } - if (o1.verticalOverlap(o2) > VERTICAL_COMPARISON_THRESHOLD) { - return o1.isLtrDominant() == -1 && o2.isLtrDominant() == -1 ? -java.lang.Double.compare(o1.getX(), o2.getX()) : java.lang.Double.compare(o1.getX(), o2.getX()); - } else { - return java.lang.Float.compare(o1.getBottom(), o2.getBottom()); - } - } - }; - - - public Rectangle() { - - super(); - } - - - public Rectangle(float top, float left, float width, float height) { - - super(); - this.setRect(left, top, width, height); - } - - - /** - * @param rectangles - * @return minimum bounding box that contains all the rectangles - */ - public static Rectangle boundingBoxOf(List rectangles) { - - float minx = java.lang.Float.MAX_VALUE; - float miny = java.lang.Float.MAX_VALUE; - float maxx = java.lang.Float.MIN_VALUE; - float maxy = java.lang.Float.MIN_VALUE; - - for (Rectangle r : rectangles) { - minx = (float) Math.min(r.getMinX(), minx); - miny = (float) Math.min(r.getMinY(), miny); - maxx = (float) Math.max(r.getMaxX(), maxx); - maxy = (float) Math.max(r.getMaxY(), maxy); - } - return new Rectangle(miny, minx, maxx - minx, maxy - miny); - } - - - public int compareTo(Rectangle other) { - - return ILL_DEFINED_ORDER.compare(this, other); - } - - - // I'm bad at Java and need this for fancy sorting in - // technology.tabula.TextChunk. - public int isLtrDominant() { - - return 0; - } - - - public float getArea() { - - return this.width * this.height; - } - - - public float verticalOverlap(Rectangle other) { - - return Math.max(0, Math.min(this.getBottom(), other.getBottom()) - Math.max(this.getTop(), other.getTop())); - } - - - public boolean verticallyOverlaps(Rectangle other) { - - return verticalOverlap(other) > 0; - } - - - public float horizontalOverlap(Rectangle other) { - - return Math.max(0, Math.min(this.getRight(), other.getRight()) - Math.max(this.getLeft(), other.getLeft())); - } - - - public boolean horizontallyOverlaps(Rectangle other) { - - return horizontalOverlap(other) > 0; - } - - - public float verticalOverlapRatio(Rectangle other) { - - float rv = 0, delta = Math.min(this.getBottom() - this.getTop(), other.getBottom() - other.getTop()); - - if (other.getTop() <= this.getTop() && this.getTop() <= other.getBottom() && other.getBottom() <= this.getBottom()) { - rv = (other.getBottom() - this.getTop()) / delta; - } else if (this.getTop() <= other.getTop() && other.getTop() <= this.getBottom() && this.getBottom() <= other.getBottom()) { - rv = (this.getBottom() - other.getTop()) / delta; - } else if (this.getTop() <= other.getTop() && other.getTop() <= other.getBottom() && other.getBottom() <= this.getBottom()) { - rv = (other.getBottom() - other.getTop()) / delta; - } else if (other.getTop() <= this.getTop() && this.getTop() <= this.getBottom() && this.getBottom() <= other.getBottom()) { - rv = (this.getBottom() - this.getTop()) / delta; - } - - return rv; - - } - - - public float overlapRatio(Rectangle other) { - - double intersectionWidth = Math.max(0, Math.min(this.getRight(), other.getRight()) - Math.max(this.getLeft(), other.getLeft())); - double intersectionHeight = Math.max(0, Math.min(this.getBottom(), other.getBottom()) - Math.max(this.getTop(), other.getTop())); - double intersectionArea = Math.max(0, intersectionWidth * intersectionHeight); - double unionArea = this.getArea() + other.getArea() - intersectionArea; - - return (float) (intersectionArea / unionArea); - } - - - public Rectangle merge(Rectangle other) { - - this.setRect(this.createUnion(other)); - return this; - } - - - public float getTop() { - - return (float) this.getMinY(); - } - - - public void setTop(float top) { - - float deltaHeight = top - this.y; - this.setRect(this.x, top, this.width, this.height - deltaHeight); - } - - - public float getRight() { - - return (float) this.getMaxX(); - } - - - public void setRight(float right) { - - this.setRect(this.x, this.y, right - this.x, this.height); - } - - - public float getLeft() { - - return (float) this.getMinX(); - } - - - public void setLeft(float left) { - - float deltaWidth = left - this.x; - this.setRect(left, this.y, this.width - deltaWidth, this.height); - } - - - public float getBottom() { - - return (float) this.getMaxY(); - } - - - public void setBottom(float bottom) { - - this.setRect(this.x, this.y, this.width, bottom - this.y); - } - - - public Point2D[] getPoints() { - - return new Point2D[]{new Point2D.Float(this.getLeft(), this.getTop()), new Point2D.Float(this.getRight(), this.getTop()), new Point2D.Float(this.getRight(), - this.getBottom()), new Point2D.Float(this.getLeft(), this.getBottom())}; - } - - - @Override - public String toString() { - - StringBuilder sb = new StringBuilder(); - String s = super.toString(); - sb.append(s.substring(0, s.length() - 1)); - sb.append(String.format(",bottom=%f,right=%f]", this.getBottom(), this.getRight())); - return sb.toString(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Ruling.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Ruling.java deleted file mode 100644 index 9988b61e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Ruling.java +++ /dev/null @@ -1,437 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Formatter; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.CohenSutherlandClipping; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.Utils; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@SuppressWarnings("all") -public class Ruling extends Line2D.Float { - - private static int PERPENDICULAR_PIXEL_EXPAND_AMOUNT = 2; - - - public Ruling(Point2D p1, Point2D p2) { - - super(p1, p2); - } - - - public static List cropRulingsToArea(List rulings, Rectangle2D area) { - - ArrayList rv = new ArrayList<>(); - for (Ruling r : rulings) { - if (r.intersects(area)) { - rv.add(r.intersect(area)); - } - } - return rv; - } - - - // log(n) implementation of find_intersections - // based on http://people.csail.mit.edu/indyk/6.838-old/handouts/lec2.pdf - public static Map findIntersections(List horizontals, List verticals) { - - class SortObject { - - protected SOType type; - protected float position; - protected Ruling ruling; - - - public SortObject(SOType type, float position, Ruling ruling) { - - this.type = type; - this.position = position; - this.ruling = ruling; - } - - } - - List sos = new ArrayList<>(); - - TreeMap tree = new TreeMap<>(new Comparator() { - @Override - public int compare(Ruling o1, Ruling o2) { - - return java.lang.Double.compare(o1.getTop(), o2.getTop()); - } - }); - - TreeMap rv = new TreeMap<>(new Comparator() { - @Override - public int compare(Point2D o1, Point2D o2) { - - if (o1.getY() > o2.getY()) { - return 1; - } - if (o1.getY() < o2.getY()) { - return -1; - } - if (o1.getX() > o2.getX()) { - return 1; - } - if (o1.getX() < o2.getX()) { - return -1; - } - return 0; - } - }); - - for (Ruling h : horizontals) { - sos.add(new SortObject(SOType.HLEFT, h.getLeft() - PERPENDICULAR_PIXEL_EXPAND_AMOUNT, h)); - sos.add(new SortObject(SOType.HRIGHT, h.getRight() + PERPENDICULAR_PIXEL_EXPAND_AMOUNT, h)); - } - - for (Ruling v : verticals) { - sos.add(new SortObject(SOType.VERTICAL, v.getLeft(), v)); - } - - Collections.sort(sos, new Comparator() { - @Override - public int compare(SortObject a, SortObject b) { - - int rv; - if (Utils.feq(a.position, b.position)) { - if (a.type == SOType.VERTICAL && b.type == SOType.HLEFT) { - rv = 1; - } else if (a.type == SOType.VERTICAL && b.type == SOType.HRIGHT) { - rv = -1; - } else if (a.type == SOType.HLEFT && b.type == SOType.VERTICAL) { - rv = -1; - } else if (a.type == SOType.HRIGHT && b.type == SOType.VERTICAL) { - rv = 1; - } else { - rv = java.lang.Double.compare(a.position, b.position); - } - } else { - return java.lang.Double.compare(a.position, b.position); - } - return rv; - } - }); - - for (SortObject so : sos) { - switch (so.type) { - case VERTICAL: - for (Map.Entry h : tree.entrySet()) { - try { - Point2D i = h.getKey().intersectionPoint(so.ruling); - if (i == null) { - continue; - } - rv.put(i, new Ruling[]{h.getKey().expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT), so.ruling.expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT)}); - } catch (UnsupportedOperationException e) { - log.info("Some line are oblique, ignoring..."); - continue; - } - } - break; - case HRIGHT: - tree.remove(so.ruling); - break; - case HLEFT: - tree.put(so.ruling, true); - break; - } - } - - return rv; - - } - - - public boolean vertical() { - - return this.length() > 0 && Utils.feq(this.x1, this.x2); //diff < ORIENTATION_CHECK_THRESHOLD; - } - - - public boolean horizontal() { - - return this.length() > 0 && Utils.feq(this.y1, this.y2); //diff < ORIENTATION_CHECK_THRESHOLD; - } - - // attributes that make sense only for non-oblique lines - // these are used to have a single collapse method (in page, currently) - - - public boolean oblique() { - - return !(this.vertical() || this.horizontal()); - } - - - public float getPosition() { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - return this.vertical() ? this.getLeft() : this.getTop(); - } - - - public float getStart() { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - return this.vertical() ? this.getTop() : this.getLeft(); - } - - - public void setStart(float v) { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - if (this.vertical()) { - this.setTop(v); - } else { - this.setLeft(v); - } - } - - - public float getEnd() { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - return this.vertical() ? this.getBottom() : this.getRight(); - } - - - public void setEnd(float v) { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - if (this.vertical()) { - this.setBottom(v); - } else { - this.setRight(v); - } - } - - - public void setStartEnd(float start, float end) { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - if (this.vertical()) { - this.setTop(start); - this.setBottom(end); - } else { - this.setLeft(start); - this.setRight(end); - } - } - - - public boolean perpendicularTo(Ruling other) { - - return this.vertical() == other.horizontal(); - } - - - public boolean nearlyIntersects(Ruling another, int colinearOrParallelExpandAmount) { - - if (this.intersectsLine(another)) { - return true; - } - - boolean rv = false; - - if (this.perpendicularTo(another)) { - rv = this.expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT).intersectsLine(another); - } else { - rv = this.expand(colinearOrParallelExpandAmount).intersectsLine(another.expand(colinearOrParallelExpandAmount)); - } - - return rv; - } - - - public double length() { - - return Math.sqrt(Math.pow(this.x1 - this.x2, 2) + Math.pow(this.y1 - this.y2, 2)); - } - - - public Ruling intersect(Rectangle2D clip) { - - Float clipee = (Float) this.clone(); - boolean clipped = new CohenSutherlandClipping(clip).clip(clipee); - - if (clipped) { - return new Ruling(clipee.getP1(), clipee.getP2()); - } else { - return this; - } - } - - - public Ruling expand(float amount) { - - Ruling r = (Ruling) this.clone(); - try { - r.setStart(this.getStart() - amount); - r.setEnd(this.getEnd() + amount); - } catch (UnsupportedOperationException e) { - log.warn("Could not expand ruling!"); - } - return r; - } - - - public Point2D intersectionPoint(Ruling other) { - - Ruling this_l = this.expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT); - Ruling other_l = other.expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT); - Ruling horizontal, vertical; - - if (!this_l.intersectsLine(other_l)) { - return null; - } - - if (this_l.horizontal() && other_l.vertical()) { - horizontal = this_l; - vertical = other_l; - } else if (this_l.vertical() && other_l.horizontal()) { - vertical = this_l; - horizontal = other_l; - } else { - log.warn("lines must be orthogonal, vertical and horizontal"); - return null; - } - return new Point2D.Float(vertical.getLeft(), horizontal.getTop()); - } - - - @Override - public boolean equals(Object other) { - - if (this == other) { - return true; - } - - if (!(other instanceof Ruling)) { - return false; - } - - Ruling o = (Ruling) other; - return this.getP1().equals(o.getP1()) && this.getP2().equals(o.getP2()); - } - - - @Override - public int hashCode() { - - return super.hashCode(); - } - - - public float getTop() { - - return this.y1; - } - - - public void setTop(float v) { - - setLine(this.getLeft(), v, this.getRight(), this.getBottom()); - } - - - public float getLeft() { - - return this.x1; - } - - - public void setLeft(float v) { - - setLine(v, this.getTop(), this.getRight(), this.getBottom()); - } - - - public float getBottom() { - - return this.y2; - } - - - public void setBottom(float v) { - - setLine(this.getLeft(), this.getTop(), this.getRight(), v); - } - - - public float getRight() { - - return this.x2; - } - - - public void setRight(float v) { - - setLine(this.getLeft(), this.getTop(), v, this.getBottom()); - } - - - public float getWidth() { - - return this.getRight() - this.getLeft(); - } - - - public float getHeight() { - - return this.getBottom() - this.getTop(); - } - - - public double getAngle() { - - double angle = Math.toDegrees(Math.atan2(this.getP2().getY() - this.getP1().getY(), this.getP2().getX() - this.getP1().getX())); - - if (angle < 0) { - angle += 360; - } - return angle; - } - - - @Override - public String toString() { - - StringBuilder sb = new StringBuilder(); - Formatter formatter = new Formatter(sb); - String rv = formatter.format("%s[minX=%f minY=%f maxX=%f maxY=%f]", this.getClass().toString(), this.x1, this.y1, this.x2, this.y2).toString(); - formatter.close(); - return rv; - } - - - private enum SOType { - VERTICAL, - HRIGHT, - HLEFT - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/TablePageBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/TablePageBlock.java deleted file mode 100644 index 8d8684ef..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/TablePageBlock.java +++ /dev/null @@ -1,342 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.TreeMap; - -import org.apache.commons.collections4.CollectionUtils; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class TablePageBlock extends AbstractPageBlock { - - private final TreeMap cells = new TreeMap<>(); - - private final int rotation; - @Getter - @Setter - private String headline; - private int unrotatedRowCount; - private int unrotatedColCount; - private List> rows; - - - public TablePageBlock(List cells, Rectangle area, int rotation) { - - addCells(cells); - minX = area.getLeft(); - minY = area.getBottom(); - maxX = area.getRight(); - maxY = area.getTop(); - classification = PageBlockType.TABLE; - this.rotation = rotation; - } - - - public List> getRows() { - - if (rows == null) { - rows = computeRows(); - - // Ignore rows that does not contain any cells and values. - List> rowsToRemove = new ArrayList<>(); - for (List row : rows) { - if (row.size() == 1 && row.get(0).getTextBlocks().isEmpty()) { - rowsToRemove.add(row); - } - } - rows.removeAll(rowsToRemove); - - computeHeaders(); - } - - return rows; - - } - - - public int getRowCount() { - - return getRows().size(); - } - - - public int getColCount() { - - return getRows().stream().mapToInt(List::size).max().orElse(0); - - } - - - /** - * Detect header cells (either first row or first column): - * Column is marked as header if cell text is bold and row cell text is not bold. - * Defaults to row. - */ - private void computeHeaders() { - - if (rows == null) { - rows = computeRows(); - } - // A bold cell is a header cell as long as every cell to the left/top is bold, too - // we move from left to right and top to bottom - for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) { - List rowCells = rows.get(rowIndex); - if (rowCells.size() == 1) { - continue; - } - - for (int colIndex = 0; colIndex < rowCells.size(); colIndex++) { - Cell cell = rowCells.get(colIndex); - List cellsToTheLeft = rowCells.subList(0, colIndex); - Cell lastHeaderCell = null; - for (Cell leftCell : cellsToTheLeft) { - if (leftCell.isHeaderCell()) { - lastHeaderCell = leftCell; - } else { - break; - } - } - if (lastHeaderCell != null) { - cell.getHeaderCells().add(lastHeaderCell); - } - List cellsToTheTop = new ArrayList<>(); - for (int i = 0; i < rowIndex; i++) { - try { - cellsToTheTop.add(rows.get(i).get(colIndex)); - } catch (IndexOutOfBoundsException e) { - log.debug("No cell {} in row {}, ignoring.", colIndex, rowIndex); - } - } - for (Cell topCell : cellsToTheTop) { - if (topCell.isHeaderCell()) { - lastHeaderCell = topCell; - } else { - break; - } - } - if (lastHeaderCell != null) { - cell.getHeaderCells().add(lastHeaderCell); - } - if (CollectionUtils.isNotEmpty(cell.getTextBlocks()) && cell.getTextBlocks().get(0).getMostPopularWordStyle().equals("bold")) { - cell.setHeaderCell(true); - } - } - } - - } - - - private List> computeRows() { - - List> rows = new ArrayList<>(); - if (rotation == 90) { - for (int i = 0; i < unrotatedColCount; i++) { // rows - List lastRow = new ArrayList<>(); - for (int j = unrotatedRowCount - 1; j >= 0; j--) { // cols - Cell cell = cells.get(new CellPosition(j, i)); - if (cell != null) { - lastRow.add(cell); - } - } - rows.add(lastRow); - } - } else if (rotation == 270) { - for (int i = unrotatedColCount - 1; i >= 0; i--) { // rows - List lastRow = new ArrayList<>(); - for (int j = 0; j < unrotatedRowCount; j++) { // cols - Cell cell = cells.get(new CellPosition(j, i)); - if (cell != null) { - lastRow.add(cell); - } - } - rows.add(lastRow); - } - } else { - for (int i = 0; i < unrotatedRowCount; i++) { - List lastRow = new ArrayList<>(); - for (int j = 0; j < unrotatedColCount; j++) { - Cell cell = cells.get(new CellPosition(i, j)); // JAVA_8 use getOrDefault() - if (cell != null) { - lastRow.add(cell); - } - } - rows.add(lastRow); - } - } - - return rows; - - } - - - private void add(Cell chunk, int row, int col) { - - unrotatedRowCount = Math.max(unrotatedRowCount, row + 1); - unrotatedColCount = Math.max(unrotatedColCount, col + 1); - - CellPosition cp = new CellPosition(row, col); - cells.put(cp, chunk); - - } - - - private void addCells(List cells) { - - if (cells.isEmpty()) { - return; - } - - cells.removeIf(cell -> cell.getWidth() < 1.1 || cell.getHeight() < 1.1); - - List> rowsOfCells = calculateStructure(cells); - - for (int i = 0; i < rowsOfCells.size(); i++) { - for (int j = 0; j < rowsOfCells.get(i).size(); j++) { - add(rowsOfCells.get(i).get(j), i, j); - } - } - - } - - - /** - * Calculates the structure of the table. For spanning rows and columns multiple cells with the same values will be inserted. - * - * @param cells The found cells - * @return TablePageBlock Structure - */ - private List> calculateStructure(List cells) { - - List> matrix = new ArrayList<>(); - - if (cells.isEmpty()) { - return matrix; - } - - Set uniqueX = new HashSet<>(); - Set uniqueY = new HashSet<>(); - cells.stream().filter(c -> !c.getTextBlocks().isEmpty() || c.getHeight() > 3 && c.getWidth() > 3).forEach(c -> { - uniqueX.add(c.getLeft()); - uniqueX.add(c.getRight()); - uniqueY.add(c.getBottom()); - uniqueY.add(c.getTop()); - }); - - var sortedUniqueX = uniqueX.stream().sorted().toList(); - var sortedUniqueY = uniqueY.stream().sorted().toList(); - - Float prevY = null; - for (Float y : sortedUniqueY) { - - List row = new ArrayList<>(); - - Float prevX = null; - for (Float x : sortedUniqueX) { - - if (prevY != null && prevX != null) { - var cell = new Cell(new Point2D.Float(prevX, prevY), new Point2D.Float(x, y)); - - var intersectionCell = cells.stream().filter(c -> cell.intersects(c) && cell.overlapRatio(c) > 0.1f).findFirst(); - intersectionCell.ifPresent(value -> cell.getTextBlocks().addAll(value.getTextBlocks())); - if (cell.hasMinimumSize()) { - row.add(cell); - } - } - prevX = x; - } - - if (prevY != null && prevX != null && !row.isEmpty()) { - matrix.add(row); - } - prevY = y; - } - - Collections.reverse(matrix); - - return matrix; - } - - - @Override - public String getText() { - - StringBuilder sb = new StringBuilder(); - List> rows = getRows(); - - int i = 0; - for (List row : rows) { - if (i != 0) { - sb.append("\n"); - } - if (!row.isEmpty()) { - boolean firstColumn = true; - for (Cell column : row) { - if (!firstColumn) { - sb.append(","); - } - if (column != null && column.getTextBlocks() != null) { - boolean first = true; - for (TextPageBlock textBlock : column.getTextBlocks()) { - if (!first) { - sb.append("\n"); - } - sb.append('\"').append(textBlock.getText().replaceAll("\"", "\\\"")).append('\"'); - first = false; - } - } - firstColumn = false; - } - } - i++; - } - - return sb.toString(); - } - - - public String getTextAsHtml() { - - StringBuilder sb = new StringBuilder(); - List> rows = getRows(); - - sb.append(""); - int i = 0; - for (List row : rows) { - sb.append("\n"); - if (!row.isEmpty()) { - for (Cell column : row) { - sb.append(i == 0 ? "\n"); - } - } - sb.append(""); - i++; - } - sb.append("
" : "\n"); - if (column != null && column.getTextBlocks() != null) { - boolean first = true; - for (TextPageBlock textBlock : column.getTextBlocks()) { - if (!first) { - sb.append("
"); - } - sb.append(textBlock.getText().replaceAll("\\n", "
")); - first = false; - } - } - sb.append(i == 0 ? "" : "
"); - - return sb.toString(); - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/RedTextPosition.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/RedTextPosition.java deleted file mode 100644 index 392b1eb0..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/RedTextPosition.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import org.apache.pdfbox.text.TextPosition; -import org.springframework.beans.BeanUtils; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.SneakyThrows; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class RedTextPosition { - - private String textMatrix; - private float[] position; - - @JsonIgnore - private int rotation; - - @JsonIgnore - private float pageHeight; - - @JsonIgnore - private float pageWidth; - - private String unicode; - - @JsonIgnore - private float dir; - - // not used in reanalysis - @JsonIgnore - private float widthOfSpace; - - // not used in reanalysis - @JsonIgnore - private float fontSizeInPt; - - // not used in reanalysis - @JsonIgnore - private String fontName; - - - @SneakyThrows - public static RedTextPosition fromTextPosition(TextPosition textPosition) { - - var pos = new RedTextPosition(); - BeanUtils.copyProperties(textPosition, pos); - pos.setFontName(textPosition.getFont().getName()); - - pos.setFontSizeInPt(textPosition.getFontSizeInPt()); - - pos.setTextMatrix(textPosition.getTextMatrix().toString()); - - var position = new float[4]; - - position[0] = textPosition.getXDirAdj(); - position[1] = textPosition.getYDirAdj(); - position[2] = textPosition.getWidthDirAdj(); - position[3] = textPosition.getHeightDir(); - - pos.setPosition(position); - return pos; - } - - - @JsonIgnore - public float getXDirAdj() { - - return position[0]; - } - - - @JsonIgnore - public float getYDirAdj() { - - return position[1]; - } - - - @JsonIgnore - public float getWidthDirAdj() { - - return position[2]; - } - - - @JsonIgnore - public float getHeightDir() { - - return position[3]; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SearchableText.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SearchableText.java deleted file mode 100644 index 36677e1f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SearchableText.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.ArrayList; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; - -import lombok.Getter; - -public class SearchableText { - - @Getter - private final List sequences = new ArrayList<>(); - - - public void add(TextPositionSequence textPositionSequence) { - - sequences.add(textPositionSequence); - } - - - public void addAll(List textPositionSequences) { - - sequences.addAll(textPositionSequences); - } - - - @Override - public String toString() { - - return buildString(sequences); - } - - - public static String buildString(List sequences) { - - StringBuilder sb = new StringBuilder(); - for (TextPositionSequence word : sequences) { - sb.append(word); - sb.append(' '); - } - String text = sb.toString(); - text = TextNormalizationUtilities.removeHyphenLineBreaks(text); - text = TextNormalizationUtilities.removeLineBreaks(text); - text = TextNormalizationUtilities.removeRepeatingWhitespaces(text); - return text; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedSectionText.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedSectionText.java deleted file mode 100644 index 5c1ba630..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedSectionText.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SimplifiedSectionText { - - private int sectionNumber; - private String text; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedText.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedText.java deleted file mode 100644 index 2d4eabf4..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedText.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.ArrayList; -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SimplifiedText { - - private int numberOfPages; - private List sectionTexts = new ArrayList<>(); - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/StringFrequencyCounter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/StringFrequencyCounter.java deleted file mode 100644 index 2186cc25..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/StringFrequencyCounter.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.HashMap; -import java.util.Map; - -import lombok.Getter; - -public class StringFrequencyCounter { - - @Getter - private final Map countPerValue = new HashMap<>(); - - - public void add(String value) { - - if (!countPerValue.containsKey(value)) { - countPerValue.put(value, 1); - } else { - countPerValue.put(value, countPerValue.get(value) + 1); - } - } - - - public void addAll(Map otherCounter) { - - for (Map.Entry entry : otherCounter.entrySet()) { - if (countPerValue.containsKey(entry.getKey())) { - countPerValue.put(entry.getKey(), countPerValue.get(entry.getKey()) + entry.getValue()); - } else { - countPerValue.put(entry.getKey(), entry.getValue()); - } - } - } - - - public String getMostPopular() { - - Map.Entry mostPopular = null; - for (Map.Entry entry : countPerValue.entrySet()) { - if (mostPopular == null || entry.getValue() > mostPopular.getValue()) { - mostPopular = entry; - } - } - return mostPopular != null ? mostPopular.getKey() : null; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextDirection.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextDirection.java deleted file mode 100644 index aceb3751..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextDirection.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; - -import lombok.Getter; - -@Getter -public enum TextDirection { - ZERO(0f), - QUARTER_CIRCLE(90f), - HALF_CIRCLE(180f), - THREE_QUARTER_CIRCLE(270f); - - public static final String VALUE_STRING_SUFFIX = "°"; - - @JsonValue - private final float degrees; - private final float radians; - - - TextDirection(float degreeValue) { - - degrees = degreeValue; - radians = (float) Math.toRadians(degreeValue); - } - - - @Override - public String toString() { - - return degrees + VALUE_STRING_SUFFIX; - } - - - @JsonCreator(mode = JsonCreator.Mode.DELEGATING) - public static TextDirection fromDegrees(float degrees) { - - for (var dir : TextDirection.values()) { - if (degrees == dir.degrees) { - return dir; - } - } - - throw new IllegalArgumentException(String.format("A value of %f is not supported by TextDirection", degrees)); - } -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPageBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPageBlock.java deleted file mode 100644 index ca8cc8e2..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPageBlock.java +++ /dev/null @@ -1,302 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.ArrayList; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@AllArgsConstructor -@Builder -@Data -@NoArgsConstructor -public class TextPageBlock extends AbstractPageBlock { - - @Builder.Default - private List sequences = new ArrayList<>(); - - @JsonIgnore - private int rotation; - - @JsonIgnore - private String mostPopularWordFont; - - @JsonIgnore - private String mostPopularWordStyle; - - @JsonIgnore - private float mostPopularWordFontSize; - - @JsonIgnore - private float mostPopularWordHeight; - - @JsonIgnore - private float mostPopularWordSpaceWidth; - - @JsonIgnore - private float highestFontSize; - - @JsonIgnore - private PageBlockType classification; - - - @JsonIgnore - public TextDirection getDir() { - - return sequences.get(0).getDir(); - } - - - @JsonIgnore - private float getPageHeight() { - - return sequences.get(0).getPageHeight(); - } - - - @JsonIgnore - private float getPageWidth() { - - return sequences.get(0).getPageWidth(); - } - - - /** - * Returns the minX value in pdf coordinate system. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return the minX value in pdf coordinate system - */ - @JsonIgnore - public float getPdfMinX() { - - if (getDir().getDegrees() == 90) { - return minY; - } else if (getDir().getDegrees() == 180) { - return getPageWidth() - maxX; - - } else if (getDir().getDegrees() == 270) { - - return getPageWidth() - maxY; - } else { - return minX; - } - } - - - /** - * Returns the maxX value in pdf coordinate system. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return the maxX value in pdf coordinate system - */ - @JsonIgnore - public float getPdfMaxX() { - - if (getDir().getDegrees() == 90) { - return maxY; - } else if (getDir().getDegrees() == 180) { - return getPageWidth() - minX; - } else if (getDir().getDegrees() == 270) { - return getPageWidth() - minY; - - } else { - return maxX; - } - } - - - /** - * Returns the minY value in pdf coordinate system. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return the minY value in pdf coordinate system - */ - @JsonIgnore - public float getPdfMinY() { - - if (getDir().getDegrees() == 90) { - return minX; - } else if (getDir().getDegrees() == 180) { - return maxY; - - } else if (getDir().getDegrees() == 270) { - return getPageHeight() - maxX; - - } else { - return getPageHeight() - maxY; - } - } - - - /** - * Returns the maxY value in pdf coordinate system. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return the maxY value in pdf coordinate system - */ - @JsonIgnore - public float getPdfMaxY() { - - if (getDir().getDegrees() == 90) { - return maxX; - } else if (getDir().getDegrees() == 180) { - - return minY; - } else if (getDir().getDegrees() == 270) { - return getPageHeight() - minX; - } else { - return getPageHeight() - minY; - } - } - - - public TextPageBlock(float minX, float maxX, float minY, float maxY, List sequences, int rotation) { - - this.minX = minX; - this.maxX = maxX; - this.minY = minY; - this.maxY = maxY; - this.sequences = sequences; - this.rotation = rotation; - } - - - public TextPageBlock union(TextPositionSequence r) { - - TextPageBlock union = this.copy(); - union.add(r); - return union; - } - - - public TextPageBlock union(TextPageBlock r) { - - TextPageBlock union = this.copy(); - union.add(r); - return union; - } - - - public void add(TextPageBlock r) { - - if (r.getMinX() < minX) { - minX = r.getMinX(); - } - if (r.getMaxX() > maxX) { - maxX = r.getMaxX(); - } - if (r.getMinY() < minY) { - minY = r.getMinY(); - } - if (r.getMaxY() > maxY) { - maxY = r.getMaxY(); - } - sequences.addAll(r.getSequences()); - } - - - public void add(TextPositionSequence r) { - - if (r.getMinXDirAdj() < minX) { - minX = r.getMinXDirAdj(); - } - if (r.getMaxXDirAdj() > maxX) { - maxX = r.getMaxXDirAdj(); - } - if (r.getMinYDirAdj() < minY) { - minY = r.getMinYDirAdj(); - } - if (r.getMaxYDirAdj() > maxY) { - maxY = r.getMaxYDirAdj(); - } - } - - - public TextPageBlock copy() { - - return new TextPageBlock(minX, maxX, minY, maxY, sequences, rotation); - } - - - public void resize(float x1, float y1, float width, float height) { - - set(x1, y1, x1 + width, y1 + height); - } - - - public void set(float x1, float y1, float x2, float y2) { - - this.minX = Math.min(x1, x2); - this.maxX = Math.max(x1, x2); - this.minY = Math.min(y1, y2); - this.maxY = Math.max(y1, y2); - } - - - @Override - public String toString() { - - StringBuilder builder = new StringBuilder(); - - for (int i = 0; i < sequences.size(); i++) { - String sequenceAsString = sequences.get(i).toString(); - // Fix for missing Whitespace. This is recognized in getSequences method. See PDFTextStripper Line 1730. - if (i != 0 && sequences.get(i - 1).charAt(sequences.get(i - 1).length() - 1) != ' ' && sequenceAsString.charAt(0) != ' ') { - builder.append(' '); - } - builder.append(sequenceAsString); - } - - return builder.toString(); - - } - - - @Override - @JsonIgnore - public String getText() { - - StringBuilder sb = new StringBuilder(); - - TextPositionSequence previous = null; - for (TextPositionSequence word : sequences) { - if (previous != null) { - if (Math.abs(previous.getMaxYDirAdj() - word.getMaxYDirAdj()) > word.getTextHeight()) { - sb.append('\n'); - } else { - sb.append(' '); - } - } - sb.append(word.toString()); - previous = word; - } - - return TextNormalizationUtilities.removeHyphenLineBreaks(sb.toString()); - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPositionSequence.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPositionSequence.java deleted file mode 100644 index 48a33a6b..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPositionSequence.java +++ /dev/null @@ -1,301 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import org.apache.pdfbox.text.TextPosition; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@JsonIgnoreProperties({"empty"}) -public class TextPositionSequence implements CharSequence { - - public static final int HEIGHT_PADDING = 2; - private int page; - private List textPositions = new ArrayList<>(); - - private TextDirection dir; - private int rotation; - private float pageHeight; - private float pageWidth; - - - public TextPositionSequence(int page) { - - this.page = page; - } - - - public TextPositionSequence(List textPositions, int page) { - - this.textPositions = textPositions.stream().map(RedTextPosition::fromTextPosition).collect(Collectors.toList()); - this.page = page; - this.dir = TextDirection.fromDegrees(textPositions.get(0).getDir()); - this.rotation = textPositions.get(0).getRotation(); - this.pageHeight = textPositions.get(0).getPageHeight(); - this.pageWidth = textPositions.get(0).getPageWidth(); - } - - - @Override - public int length() { - - return textPositions.size(); - } - - - @Override - public char charAt(int index) { - - RedTextPosition textPosition = textPositionAt(index); - String text = textPosition.getUnicode(); - return text.charAt(0); - } - - - public char charAt(int index, boolean caseInSensitive) { - - RedTextPosition textPosition = textPositionAt(index); - String text = textPosition.getUnicode(); - return caseInSensitive ? text.toLowerCase().charAt(0) : text.charAt(0); - } - - - @Override - public TextPositionSequence subSequence(int start, int end) { - - var textPositionSequence = new TextPositionSequence(); - textPositionSequence.textPositions = textPositions.subList(start, end); - textPositionSequence.page = page; - textPositionSequence.dir = dir; - textPositionSequence.rotation = rotation; - textPositionSequence.pageHeight = pageHeight; - textPositionSequence.pageWidth = pageWidth; - - return textPositionSequence; - } - - - @Override - public String toString() { - - StringBuilder builder = new StringBuilder(length()); - for (int i = 0; i < length(); i++) { - builder.append(charAt(i)); - } - return builder.toString(); - } - - - public RedTextPosition textPositionAt(int index) { - - return textPositions.get(index); - } - - - public void add(TextPositionSequence textPositionSequence, RedTextPosition textPosition) { - - this.textPositions.add(textPosition); - this.page = textPositionSequence.getPage(); - this.dir = textPositionSequence.getDir(); - this.rotation = textPositionSequence.getRotation(); - this.pageHeight = textPositionSequence.getPageHeight(); - this.pageWidth = textPositionSequence.getPageWidth(); - } - - - public void add(TextPosition textPosition) { - - this.textPositions.add(RedTextPosition.fromTextPosition(textPosition)); - - this.dir = TextDirection.fromDegrees(textPositions.get(0).getDir()); - this.rotation = textPositions.get(0).getRotation(); - this.pageHeight = textPositions.get(0).getPageHeight(); - this.pageWidth = textPositions.get(0).getPageWidth(); - - } - - - /** - * This value is adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - * This method ignores the page rotation but takes the text rotation and adjusts the coordinates to awt. - * - * @return the text direction adjusted minX value - */ - @JsonIgnore - public float getMinXDirAdj() { - - return textPositions.get(0).getXDirAdj(); - - } - - - /** - * This value is adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - * This method ignores the page rotation but takes the text rotation and adjusts the coordinates to awt. - * - * @return the text direction adjusted maxX value - */ - @JsonIgnore - public float getMaxXDirAdj() { - - return textPositions.get(textPositions.size() - 1).getXDirAdj() + textPositions.get(textPositions.size() - 1).getWidthDirAdj() + HEIGHT_PADDING; - - } - - - /** - * This value is adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - * This method ignores the page rotation but takes the text rotation and adjusts the coordinates to awt. - * - * @return the text direction adjusted minY value. The upper border of the bounding box of the word. - */ - @JsonIgnore - public float getMinYDirAdj() { - - return textPositions.get(0).getYDirAdj() - getTextHeight(); - - } - - - /** - * This value is adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - * This method ignores the page rotation but takes the text rotation and adjusts the coordinates to awt. - * - * @return the text direction adjusted maxY value. The lower border of the bounding box of the word. - */ - @JsonIgnore - public float getMaxYDirAdj() { - - return textPositions.get(0).getYDirAdj(); - - } - - - @JsonIgnore - public float getTextHeight() { - - return textPositions.get(0).getHeightDir() + HEIGHT_PADDING; - } - - - @JsonIgnore - public float getHeight() { - - return getMaxYDirAdj() - getMinYDirAdj(); - } - - - @JsonIgnore - public float getWidth() { - - return getMaxXDirAdj() - getMinXDirAdj(); - } - - - @JsonIgnore - public String getFont() { - - return textPositions.get(0).getFontName().toLowerCase().replaceAll(",bold", "").replaceAll(",italic", ""); - } - - - @JsonIgnore - public String getFontStyle() { - - String lowercaseFontName = textPositions.get(0).getFontName().toLowerCase(); - - if (lowercaseFontName.contains("bold") && lowercaseFontName.contains("italic")) { - return "bold, italic"; - } else if (lowercaseFontName.contains("bold")) { - return "bold"; - } else if (lowercaseFontName.contains("italic")) { - return "italic"; - } else { - return "standard"; - } - - } - - - @JsonIgnore - public float getFontSize() { - - return textPositions.get(0).getFontSizeInPt(); - } - - - @JsonIgnore - public float getSpaceWidth() { - - return textPositions.get(0).getWidthOfSpace(); - } - - - /** - * This returns the bounding box of the word in Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return bounding box of the word in Pdf Coordinate System - */ - @JsonIgnore - @SneakyThrows - public Rectangle getRectangle() { - - log.debug("Page: '{}', Word: '{}', Rotation: '{}', textRotation {}", page, this, rotation, dir); - - float textHeight = getTextHeight(); - - RedTextPosition firstTextPos = textPositions.get(0); - RedTextPosition lastTextPos = textPositions.get(textPositions.size() - 1); - - Point2D bottomLeft = new Point2D.Double(firstTextPos.getXDirAdj(), firstTextPos.getYDirAdj() - HEIGHT_PADDING); - Point2D topRight = new Point2D.Double(lastTextPos.getXDirAdj() + lastTextPos.getWidthDirAdj(), lastTextPos.getYDirAdj() + textHeight + HEIGHT_PADDING); - - AffineTransform transform = new AffineTransform(); - if (dir == TextDirection.ZERO || dir == TextDirection.HALF_CIRCLE) { - transform.rotate(dir.getRadians(), pageWidth / 2f, pageHeight / 2f); - transform.translate(0f, pageHeight + textHeight); - transform.scale(1., -1.); - } else if (dir == TextDirection.QUARTER_CIRCLE) { - transform.rotate(dir.getRadians(), pageWidth / 2f, pageWidth / 2f); - transform.translate(0f, pageWidth + textHeight); - transform.scale(1., -1.); - } else { - transform.rotate(dir.getRadians(), pageHeight / 2f, pageHeight / 2f); - transform.translate(0f, pageWidth + textHeight); - transform.scale(1., -1.); - } - - bottomLeft = transform.transform(bottomLeft, null); - topRight = transform.transform(topRight, null); - - return new Rectangle( // - new Point((float) bottomLeft.getX(), (float) bottomLeft.getY()), - (float) (topRight.getX() - bottomLeft.getX()), - (float) (topRight.getY() - bottomLeft.getY()), - page); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/UnclassifiedText.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/UnclassifiedText.java deleted file mode 100644 index 50925713..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/UnclassifiedText.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class UnclassifiedText { - - private List textBlocks; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/LegacyPDFStreamEngine.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/LegacyPDFStreamEngine.java deleted file mode 100644 index 5d96ca09..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/LegacyPDFStreamEngine.java +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.WeakHashMap; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.fontbox.ttf.TrueTypeFont; -import org.apache.fontbox.util.BoundingBox; -import org.apache.pdfbox.contentstream.PDFStreamEngine; -import org.apache.pdfbox.contentstream.operator.DrawObject; -import org.apache.pdfbox.contentstream.operator.state.Concatenate; -import org.apache.pdfbox.contentstream.operator.state.Restore; -import org.apache.pdfbox.contentstream.operator.state.Save; -import org.apache.pdfbox.contentstream.operator.state.SetGraphicsStateParameters; -import org.apache.pdfbox.contentstream.operator.state.SetMatrix; -import org.apache.pdfbox.contentstream.operator.text.BeginText; -import org.apache.pdfbox.contentstream.operator.text.EndText; -import org.apache.pdfbox.contentstream.operator.text.MoveText; -import org.apache.pdfbox.contentstream.operator.text.MoveTextSetLeading; -import org.apache.pdfbox.contentstream.operator.text.NextLine; -import org.apache.pdfbox.contentstream.operator.text.SetCharSpacing; -import org.apache.pdfbox.contentstream.operator.text.SetFontAndSize; -import org.apache.pdfbox.contentstream.operator.text.SetTextHorizontalScaling; -import org.apache.pdfbox.contentstream.operator.text.SetTextLeading; -import org.apache.pdfbox.contentstream.operator.text.SetTextRenderingMode; -import org.apache.pdfbox.contentstream.operator.text.SetTextRise; -import org.apache.pdfbox.contentstream.operator.text.SetWordSpacing; -import org.apache.pdfbox.contentstream.operator.text.ShowText; -import org.apache.pdfbox.contentstream.operator.text.ShowTextAdjusted; -import org.apache.pdfbox.contentstream.operator.text.ShowTextLine; -import org.apache.pdfbox.contentstream.operator.text.ShowTextLineAndSpace; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.font.PDCIDFont; -import org.apache.pdfbox.pdmodel.font.PDCIDFontType2; -import org.apache.pdfbox.pdmodel.font.PDFont; -import org.apache.pdfbox.pdmodel.font.PDFontDescriptor; -import org.apache.pdfbox.pdmodel.font.PDSimpleFont; -import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont; -import org.apache.pdfbox.pdmodel.font.PDType0Font; -import org.apache.pdfbox.pdmodel.font.PDType3Font; -import org.apache.pdfbox.pdmodel.font.encoding.GlyphList; -import org.apache.pdfbox.pdmodel.graphics.state.PDGraphicsState; -import org.apache.pdfbox.text.TextPosition; -import org.apache.pdfbox.util.Matrix; -import org.apache.pdfbox.util.Vector; - -/** - * LEGACY text calculations which are known to be incorrect but are depended on by PDFTextStripper. - *

- * This class exists only so that we don't break the code of users who have their own subclasses of - * PDFTextStripper. It replaces the mostly empty implementation of showGlyph() in PDFStreamEngine - * with a heuristic implementation which is backwards compatible. - *

- * DO NOT USE THIS CODE UNLESS YOU ARE WORKING WITH PDFTextStripper. - * THIS CODE IS DELIBERATELY INCORRECT, USE PDFStreamEngine INSTEAD. - */ -@SuppressWarnings({"PMD", "checkstyle:all"}) -class LegacyPDFStreamEngine extends PDFStreamEngine { - - private static final Log LOG = LogFactory.getLog(LegacyPDFStreamEngine.class); - - private int pageRotation; - private PDRectangle pageSize; - private Matrix translateMatrix; - private final GlyphList glyphList; - private final Map fontHeightMap = new WeakHashMap(); - - - /** - * Constructor. - */ - LegacyPDFStreamEngine() throws IOException { - - addOperator(new BeginText()); - addOperator(new Concatenate()); - addOperator(new DrawObject()); // special text version - addOperator(new EndText()); - addOperator(new SetGraphicsStateParameters()); - addOperator(new Save()); - addOperator(new Restore()); - addOperator(new NextLine()); - addOperator(new SetCharSpacing()); - addOperator(new MoveText()); - addOperator(new MoveTextSetLeading()); - addOperator(new SetFontAndSize()); - addOperator(new ShowText()); - addOperator(new ShowTextAdjusted()); - addOperator(new SetTextLeading()); - addOperator(new SetMatrix()); - addOperator(new SetTextRenderingMode()); - addOperator(new SetTextRise()); - addOperator(new SetWordSpacing()); - addOperator(new SetTextHorizontalScaling()); - addOperator(new ShowTextLine()); - addOperator(new ShowTextLineAndSpace()); - - // load additional glyph list for Unicode mapping - String path = "/org/apache/pdfbox/resources/glyphlist/additional.txt"; - InputStream input = GlyphList.class.getResourceAsStream(path); - glyphList = new GlyphList(GlyphList.getAdobeGlyphList(), input); - } - - - /** - * This will initialize and process the contents of the stream. - * - * @param page the page to process - * @throws java.io.IOException if there is an error accessing the stream. - */ - @Override - public void processPage(PDPage page) throws IOException { - - this.pageRotation = page.getRotation(); - this.pageSize = page.getCropBox(); - - if (pageSize.getLowerLeftX() == 0 && pageSize.getLowerLeftY() == 0) { - translateMatrix = null; - } else { - // translation matrix for cropbox - translateMatrix = Matrix.getTranslateInstance(-pageSize.getLowerLeftX(), -pageSize.getLowerLeftY()); - } - super.processPage(page); - } - - - /** - * Called when a glyph is to be processed. The heuristic calculations here were originally - * written by Ben Litchfield for PDFStreamEngine. - */ - @Override - protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, Vector displacement) throws IOException { - // - // legacy calculations which were previously in PDFStreamEngine - // - // DO NOT USE THIS CODE UNLESS YOU ARE WORKING WITH PDFTextStripper. - // THIS CODE IS DELIBERATELY INCORRECT - // - - PDGraphicsState state = getGraphicsState(); - Matrix ctm = state.getCurrentTransformationMatrix(); - float fontSize = state.getTextState().getFontSize(); - float horizontalScaling = state.getTextState().getHorizontalScaling() / 100f; - Matrix textMatrix = getTextMatrix(); - - float displacementX = displacement.getX(); - // the sorting algorithm is based on the width of the character. As the displacement - // for vertical characters doesn't provide any suitable value for it, we have to - // calculate our own - if (font.isVertical()) { - displacementX = font.getWidth(code) / 1000; - // there may be an additional scaling factor for true type fonts - TrueTypeFont ttf = null; - if (font instanceof PDTrueTypeFont) { - ttf = ((PDTrueTypeFont) font).getTrueTypeFont(); - } else if (font instanceof PDType0Font) { - PDCIDFont cidFont = ((PDType0Font) font).getDescendantFont(); - if (cidFont instanceof PDCIDFontType2) { - ttf = ((PDCIDFontType2) cidFont).getTrueTypeFont(); - } - } - if (ttf != null && ttf.getUnitsPerEm() != 1000) { - displacementX *= 1000f / ttf.getUnitsPerEm(); - } - } - - // - // legacy calculations which were previously in PDFStreamEngine - // - // DO NOT USE THIS CODE UNLESS YOU ARE WORKING WITH PDFTextStripper. - // THIS CODE IS DELIBERATELY INCORRECT - // - - // (modified) combined displacement, this is calculated *without* taking the character - // spacing and word spacing into account, due to legacy code in TextStripper - float tx = displacementX * fontSize * horizontalScaling; - float ty = displacement.getY() * fontSize; - - // (modified) combined displacement matrix - Matrix td = Matrix.getTranslateInstance(tx, ty); - - // (modified) text rendering matrix - Matrix nextTextRenderingMatrix = td.multiply(textMatrix).multiply(ctm); // text space -> device space - float nextX = nextTextRenderingMatrix.getTranslateX(); - float nextY = nextTextRenderingMatrix.getTranslateY(); - - // (modified) width and height calculations - float dxDisplay = nextX - textRenderingMatrix.getTranslateX(); - Float fontHeight = fontHeightMap.get(font.getCOSObject()); - if (fontHeight == null) { - fontHeight = computeFontHeight(font); - fontHeightMap.put(font.getCOSObject(), fontHeight); - } - float dyDisplay = fontHeight * textRenderingMatrix.getScalingFactorY(); - - // - // start of the original method - // - - // Note on variable names. There are three different units being used in this code. - // Character sizes are given in glyph units, text locations are initially given in text - // units, and we want to save the data in display units. The variable names should end with - // Text or Disp to represent if the values are in text or disp units (no glyph units are - // saved). - - float glyphSpaceToTextSpaceFactor = 1 / 1000f; - if (font instanceof PDType3Font) { - glyphSpaceToTextSpaceFactor = font.getFontMatrix().getScaleX(); - } - - float spaceWidthText = 0; - try { - // to avoid crash as described in PDFBOX-614, see what the space displacement should be - spaceWidthText = font.getSpaceWidth() * glyphSpaceToTextSpaceFactor; - } catch (Throwable exception) { - LOG.warn(exception, exception); - } - - if (spaceWidthText == 0) { - spaceWidthText = font.getAverageFontWidth() * glyphSpaceToTextSpaceFactor; - // the average space width appears to be higher than necessary so make it smaller - spaceWidthText *= .80f; - } - if (spaceWidthText == 0) { - spaceWidthText = 1.0f; // if could not find font, use a generic value - } - - // the space width has to be transformed into display units - float spaceWidthDisplay = spaceWidthText * textRenderingMatrix.getScalingFactorX(); - - // use our additional glyph list for Unicode mapping - String unicodeMapping = font.toUnicode(code, glyphList); - - // when there is no Unicode mapping available, Acrobat simply coerces the character code - // into Unicode, so we do the same. Subclasses of PDFStreamEngine don't necessarily want - // this, which is why we leave it until this point in PDFTextStreamEngine. - if (unicodeMapping == null) { - if (font instanceof PDSimpleFont) { - char c = (char) code; - unicodeMapping = new String(new char[]{c}); - } else { - // Acrobat doesn't seem to coerce composite font's character codes, instead it - // skips them. See the "allah2.pdf" TestTextStripper file. - return; - } - } - - // adjust for cropbox if needed - Matrix translatedTextRenderingMatrix; - if (translateMatrix == null) { - translatedTextRenderingMatrix = textRenderingMatrix; - } else { - translatedTextRenderingMatrix = Matrix.concatenate(translateMatrix, textRenderingMatrix); - nextX -= pageSize.getLowerLeftX(); - nextY -= pageSize.getLowerLeftY(); - } - - // This is a hack for unicode letter with 2 chars e.g. RA see unicodeProblem.pdf - if (unicodeMapping.length() == 2) { - processTextPosition(new TextPosition(pageRotation, - pageSize.getWidth(), - pageSize.getHeight(), - translatedTextRenderingMatrix, - nextX, - nextY, - Math.abs(dyDisplay), - dxDisplay, - Math.abs(spaceWidthDisplay), - Character.toString(unicodeMapping.charAt(0)), - new int[]{code}, - font, - fontSize, - (int) (fontSize * textMatrix.getScalingFactorX()))); - processTextPosition(new TextPosition(pageRotation, - pageSize.getWidth(), - pageSize.getHeight(), - translatedTextRenderingMatrix, - nextX, - nextY, - Math.abs(dyDisplay), - dxDisplay, - Math.abs(spaceWidthDisplay), - Character.toString(unicodeMapping.charAt(1)), - new int[]{code}, - font, - fontSize, - (int) (fontSize * textMatrix.getScalingFactorX()))); - } else { - - processTextPosition(new TextPosition(pageRotation, - pageSize.getWidth(), - pageSize.getHeight(), - translatedTextRenderingMatrix, - nextX, - nextY, - Math.abs(dyDisplay), - dxDisplay, - Math.abs(spaceWidthDisplay), - unicodeMapping, - new int[]{code}, - font, - fontSize, - (int) (fontSize * textMatrix.getScalingFactorX()))); - } - } - - - /** - * Compute the font height. Override this if you want to use own calculations. - * - * @param font the font. - * @return the font height. - * @throws IOException if there is an error while getting the font bounding box. - */ - protected float computeFontHeight(PDFont font) throws IOException { - - BoundingBox bbox = font.getBoundingBox(); - if (bbox.getLowerLeftY() < Short.MIN_VALUE) { - // PDFBOX-2158 and PDFBOX-3130 - // files by Salmat eSolutions / ClibPDF Library - bbox.setLowerLeftY(-(bbox.getLowerLeftY() + 65536)); - } - // 1/2 the bbox is used as the height todo: why? - float glyphHeight = bbox.getHeight() / 2; - - // sometimes the bbox has very high values, but CapHeight is OK - PDFontDescriptor fontDescriptor = font.getFontDescriptor(); - if (fontDescriptor != null) { - float capHeight = fontDescriptor.getCapHeight(); - if (Float.compare(capHeight, 0) != 0 && (capHeight < glyphHeight || Float.compare(glyphHeight, 0) == 0)) { - glyphHeight = capHeight; - } - // PDFBOX-3464, PDFBOX-4480, PDFBOX-4553: - // sometimes even CapHeight has very high value, but Ascent and Descent are ok - float ascent = fontDescriptor.getAscent(); - float descent = fontDescriptor.getDescent(); - if (capHeight > ascent && ascent > 0 && descent < 0 && ((ascent - descent) / 2 < glyphHeight || Float.compare(glyphHeight, 0) == 0)) { - glyphHeight = (ascent - descent) / 2; - } - } - - // transformPoint from glyph space -> text space - float height; - if (font instanceof PDType3Font) { - height = font.getFontMatrix().transformPoint(0, glyphHeight).y; - } else { - height = glyphHeight / 1000; - } - - return height; - } - - - /** - * A method provided as an event interface to allow a subclass to perform some specific - * functionality when text needs to be processed. - * - * @param text The text to be processed. - */ - protected void processTextPosition(TextPosition text) { - // subclasses can override to provide specific functionality - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFLinesTextStripper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFLinesTextStripper.java deleted file mode 100644 index fda2c3cb..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFLinesTextStripper.java +++ /dev/null @@ -1,335 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing; - -import java.awt.geom.Point2D; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -import org.apache.pdfbox.contentstream.operator.Operator; -import org.apache.pdfbox.contentstream.operator.OperatorName; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColor; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorN; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingDeviceCMYKColor; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingDeviceGrayColor; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingDeviceRGBColor; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingColor; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingColorN; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingColorSpace; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingDeviceCMYKColor; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingDeviceGrayColor; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingDeviceRGBColor; -import org.apache.pdfbox.contentstream.operator.state.SetFlatness; -import org.apache.pdfbox.contentstream.operator.state.SetLineCapStyle; -import org.apache.pdfbox.contentstream.operator.state.SetLineDashPattern; -import org.apache.pdfbox.contentstream.operator.state.SetLineJoinStyle; -import org.apache.pdfbox.contentstream.operator.state.SetLineMiterLimit; -import org.apache.pdfbox.contentstream.operator.state.SetLineWidth; -import org.apache.pdfbox.contentstream.operator.state.SetRenderingIntent; -import org.apache.pdfbox.contentstream.operator.text.SetFontAndSize; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSNumber; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.text.TextPosition; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.RedTextPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class PDFLinesTextStripper extends PDFTextStripper { - - @Getter - private final List textPositionSequences = new ArrayList<>(); - @Getter - private final List rulings = new ArrayList<>(); - private final List graphicsPath = new ArrayList<>(); - @Setter - protected PDPage pdpage; - @Getter - private int minCharWidth; - @Getter - private int maxCharWidth; - @Getter - private int minCharHeight; - @Getter - private int maxCharHeight; - - private float path_x; - private float path_y; - - @Setter - private int pageNumber; - - - public PDFLinesTextStripper() throws IOException { - - super(); - this.addOperator(new SetStrokingColorSpace()); - this.addOperator(new SetNonStrokingColorSpace()); - this.addOperator(new SetLineDashPattern()); - this.addOperator(new SetStrokingDeviceGrayColor()); - this.addOperator(new SetNonStrokingDeviceGrayColor()); - this.addOperator(new SetFlatness()); - this.addOperator(new SetLineJoinStyle()); - this.addOperator(new SetLineCapStyle()); - this.addOperator(new SetStrokingDeviceCMYKColor()); - this.addOperator(new SetNonStrokingDeviceCMYKColor()); - this.addOperator(new SetLineMiterLimit()); - this.addOperator(new SetStrokingDeviceRGBColor()); - this.addOperator(new SetNonStrokingDeviceRGBColor()); - this.addOperator(new SetRenderingIntent()); - this.addOperator(new SetStrokingColor()); - this.addOperator(new SetNonStrokingColor()); - this.addOperator(new SetStrokingColorN()); - this.addOperator(new SetNonStrokingColorN()); - this.addOperator(new SetFontAndSize()); - this.addOperator(new SetLineWidth()); - } - - - @Override - protected void processOperator(Operator operator, List arguments) throws IOException { - - String operation = operator.getName(); - - //move - switch (operation) { - case OperatorName.MOVE_TO: - if (arguments.size() == 2) { - Point2D.Float pos = transformPosition(floatValue(arguments.get(0)), floatValue(arguments.get(1))); - path_x = (float) pos.getX(); - path_y = (float) pos.getY(); - } - break; - - //line - case OperatorName.LINE_TO: - if (arguments.size() == 2) { - Point2D.Float pos = transformPosition(floatValue(arguments.get(0)), floatValue(arguments.get(1))); - - // The direction of vertical lines must always be from bottom to top for the table extraction algorithm. - if (pos.getY() > path_y) { - graphicsPath.add(new Ruling(new Point2D.Float(path_x, path_y), new Point2D.Float((float) pos.getX(), (float) pos.getY()))); - } else { - graphicsPath.add(new Ruling(new Point2D.Float(path_x, (float) pos.getY()), new Point2D.Float((float) pos.getX(), path_y))); - } - - path_x = (float) pos.getX(); - path_y = (float) pos.getY(); - } - break; - - //rectangle - case OperatorName.APPEND_RECT: - - if (arguments.size() == 4) { - float x = floatValue(arguments.get(0)); - float y = floatValue(arguments.get(1)); - float width = floatValue(arguments.get(2)); - float height = floatValue(arguments.get(3)); - - Point2D p1 = transformPosition(x, y); - Point2D p2 = transformPosition(x + width, y + height); - - // Horizontal lines - graphicsPath.add(new Ruling(new Point2D.Float((float) p1.getX(), (float) p1.getY()), new Point2D.Float((float) p2.getX(), (float) p1.getY()))); - graphicsPath.add(new Ruling(new Point2D.Float((float) p1.getX(), (float) p2.getY()), new Point2D.Float((float) p2.getX(), (float) p2.getY()))); - - // Vertical lines, direction must always be from bottom to top for the table extraction algorithm. - if (p2.getY() > p1.getY()) { - graphicsPath.add(new Ruling(new Point2D.Float((float) p2.getX(), (float) p1.getY()), new Point2D.Float((float) p2.getX(), (float) p2.getY()))); - } else { - graphicsPath.add(new Ruling(new Point2D.Float((float) p2.getX(), (float) p2.getY()), new Point2D.Float((float) p2.getX(), (float) p1.getY()))); - } - if (p2.getY() > p1.getY()) { - graphicsPath.add(new Ruling(new Point2D.Float((float) p1.getX(), (float) p1.getY()), new Point2D.Float((float) p1.getX(), (float) p2.getY()))); - } else { - graphicsPath.add(new Ruling(new Point2D.Float((float) p1.getX(), (float) p2.getY()), new Point2D.Float((float) p1.getX(), (float) p1.getY()))); - } - } - break; - - //fill - case OperatorName.FILL_NON_ZERO: - case OperatorName.LEGACY_FILL_NON_ZERO: - case OperatorName.FILL_EVEN_ODD: - addVisibleRulings(graphicsPath, false); - graphicsPath.clear(); - break; - - //stroke - case OperatorName.STROKE_PATH: - addVisibleRulings(graphicsPath, true); - graphicsPath.clear(); - break; - - //cancel path - case OperatorName.ENDPATH: - graphicsPath.clear(); - break; - - } - - super.processOperator(operator, arguments); - } - - - private float floatValue(COSBase value) { - - if (value instanceof COSNumber) { - return ((COSNumber) value).floatValue(); - } else { - return 0; - } - } - - - private Point2D.Float transformPosition(float x, float y) { - - return super.transformedPoint(x, y); - } - - - private void addVisibleRulings(List path, boolean stroke) throws IOException { - - try { - if (stroke && !getGraphicsState().getStrokingColor().isPattern() && getGraphicsState().getStrokingColor() - .toRGB() == 0 || !stroke && !getGraphicsState().getNonStrokingColor().isPattern() && getGraphicsState().getNonStrokingColor().toRGB() == 0) { - rulings.addAll(path); - } - } catch (UnsupportedOperationException e) { - log.debug("UnsupportedOperationException: " + getGraphicsState().getStrokingColor().getColorSpace().getName() + " or " + getGraphicsState().getNonStrokingColor() - .getColorSpace() - .getName() + " does not support toRGB"); - } - } - - - @Override - public void writeString(String text, List textPositions) throws IOException { - - int startIndex = 0; - RedTextPosition previous = null; - - textPositions.sort(Comparator.comparing(TextPosition::getXDirAdj)); - - for (int i = 0; i <= textPositions.size() - 1; i++) { - - if (!textPositionSequences.isEmpty()) { - previous = textPositionSequences.get(textPositionSequences.size() - 1) - .getTextPositions() - .get(textPositionSequences.get(textPositionSequences.size() - 1).getTextPositions().size() - 1); - } - - int charWidth = (int) textPositions.get(i).getWidthDirAdj(); - if (charWidth < minCharWidth) { - minCharWidth = charWidth; - } - if (charWidth > maxCharWidth) { - maxCharWidth = charWidth; - } - - int charHeight = (int) textPositions.get(i).getHeightDir(); - if (charHeight < minCharHeight) { - minCharHeight = charHeight; - } - if (charWidth > maxCharHeight) { - maxCharHeight = charHeight; - } - - if (i == 0 && (textPositions.get(i).getUnicode().equals(" ") || textPositions.get(i).getUnicode().equals("\u00A0") || textPositions.get(i).getUnicode().equals("\t"))) { - startIndex++; - continue; - } - - // Strange but sometimes this is happening, for example: Metolachlor2.pdf - if (i > 0 && textPositions.get(i).getXDirAdj() < textPositions.get(i - 1).getXDirAdj()) { - List sublist = textPositions.subList(startIndex, i); - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) - .getUnicode() - .equals("\t")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - startIndex = i; - } - - if (textPositions.get(i).getRotation() == 0 && i > 0 && textPositions.get(i).getX() > textPositions.get(i - 1).getEndX() + 1) { - List sublist = textPositions.subList(startIndex, i); - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) - .getUnicode() - .equals("\t")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - startIndex = i; - } - - if (i > 0 && (textPositions.get(i).getUnicode().equals(" ") || textPositions.get(i).getUnicode().equals("\u00A0") || textPositions.get(i) - .getUnicode() - .equals("\t")) && i <= textPositions.size() - 2) { - List sublist = textPositions.subList(startIndex, i); - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) - .getUnicode() - .equals("\t")))) { - - // Remove false sequence ends (whitespaces) - if (previous != null && sublist.get(0).getYDirAdj() == previous.getYDirAdj() && sublist.get(0) - .getXDirAdj() - (previous.getXDirAdj() + previous.getWidthDirAdj()) < 0.01) { - for (TextPosition textPosition : sublist) { - textPositionSequences.get(textPositionSequences.size() - 1).add(textPosition); - } - } else { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - } - startIndex = i + 1; - } - } - - List sublist = textPositions.subList(startIndex, textPositions.size()); - if (!sublist.isEmpty() && (sublist.get(sublist.size() - 1).getUnicode().equals(" ") || sublist.get(sublist.size() - 1) - .getUnicode() - .equals("\u00A0") || sublist.get(sublist.size() - 1).getUnicode().equals("\t"))) { - sublist = sublist.subList(0, sublist.size() - 1); - } - - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) - .getUnicode() - .equals("\t")))) { - if (previous != null && sublist.get(0).getYDirAdj() == previous.getYDirAdj() && sublist.get(0) - .getXDirAdj() - (previous.getXDirAdj() + previous.getWidthDirAdj()) < 0.01) { - for (TextPosition t : sublist) { - textPositionSequences.get(textPositionSequences.size() - 1).add(t); - } - } else { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - } - super.writeString(text); - } - - - @Override - public String getText(PDDocument doc) throws IOException { - - minCharWidth = Integer.MAX_VALUE; - maxCharWidth = 0; - minCharHeight = Integer.MAX_VALUE; - maxCharHeight = 0; - textPositionSequences.clear(); - rulings.clear(); - graphicsPath.clear(); - path_x = 0.0f; - path_y = 0.0f; - - return super.getText(doc); - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFTextStripper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFTextStripper.java deleted file mode 100644 index 48dc580a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFTextStripper.java +++ /dev/null @@ -1,2070 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.LineNumberReader; -import java.io.StringWriter; -import java.io.Writer; -import java.text.Bidi; -import java.text.Normalizer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.SortedMap; -import java.util.SortedSet; -import java.util.StringTokenizer; -import java.util.TreeMap; -import java.util.TreeSet; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageTree; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem; -import org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead; -import org.apache.pdfbox.text.TextPosition; -import org.apache.pdfbox.text.TextPositionComparator; -import org.apache.pdfbox.util.QuickSort; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; - -/** - * This is just a copy except i only adjusted lines 594-607 cause this is a bug in Pdfbox. - * see S416.pdf - */ -@SuppressWarnings({"PMD", "checkstyle:all"}) -public class PDFTextStripper extends LegacyPDFStreamEngine { - - private static float defaultIndentThreshold = 2.0f; - private static float defaultDropThreshold = 2.5f; - private static final boolean useCustomQuickSort; - - private static final Log LOG = LogFactory.getLog(PDFTextStripper.class); - - // enable the ability to set the default indent/drop thresholds - // with -D system properties: - // pdftextstripper.indent - // pdftextstripper.drop - static { - String strDrop = null, strIndent = null; - try { - String className = PDFTextStripper.class.getSimpleName().toLowerCase(); - String prop = className + ".indent"; - strIndent = System.getProperty(prop); - prop = className + ".drop"; - strDrop = System.getProperty(prop); - } catch (SecurityException e) { - // PDFBOX-1946 when run in an applet - // ignore and use default - } - if (strIndent != null && strIndent.length() > 0) { - try { - defaultIndentThreshold = Float.parseFloat(strIndent); - } catch (NumberFormatException nfe) { - // ignore and use default - } - } - if (strDrop != null && strDrop.length() > 0) { - try { - defaultDropThreshold = Float.parseFloat(strDrop); - } catch (NumberFormatException nfe) { - // ignore and use default - } - } - } - - - static { - // check if we need to use the custom quicksort algorithm as a - // workaround to the PDFBOX-1512 transitivity issue of TextPositionComparator: - boolean is16orLess = false; - try { - String version = System.getProperty("java.specification.version"); - StringTokenizer st = new StringTokenizer(version, "."); - int majorVersion = Integer.parseInt(st.nextToken()); - int minorVersion = 0; - if (st.hasMoreTokens()) { - minorVersion = Integer.parseInt(st.nextToken()); - } - is16orLess = majorVersion == 1 && minorVersion <= 6; - } catch (SecurityException x) { - // when run in an applet ignore and use default - // assume 1.7 or higher so that quicksort is used - } catch (NumberFormatException nfe) { - // should never happen, but if it does, - // assume 1.7 or higher so that quicksort is used - } - useCustomQuickSort = !is16orLess; - } - - /** - * The platform's line separator. - */ - protected final String LINE_SEPARATOR = System.getProperty("line.separator"); - - private String lineSeparator = LINE_SEPARATOR; - private String wordSeparator = " "; - private String paragraphStart = ""; - private String paragraphEnd = ""; - private String pageStart = ""; - private String pageEnd = LINE_SEPARATOR; - private String articleStart = ""; - private String articleEnd = ""; - - private int currentPageNo = 0; - private int startPage = 1; - private int endPage = Integer.MAX_VALUE; - private PDOutlineItem startBookmark = null; - - // 1-based bookmark pages - private int startBookmarkPageNumber = -1; - private int endBookmarkPageNumber = -1; - - private PDOutlineItem endBookmark = null; - private boolean suppressDuplicateOverlappingText = true; - private boolean shouldSeparateByBeads = true; - private boolean sortByPosition = false; - private boolean addMoreFormatting = false; - - private float indentThreshold = defaultIndentThreshold; - private float dropThreshold = defaultDropThreshold; - - // we will need to estimate where to add spaces, these are used to help guess - private float spacingTolerance = .5f; - private float averageCharTolerance = .3f; - - private List beadRectangles = null; - - /** - * The charactersByArticle is used to extract text by article divisions. For example a PDF that has two columns like - * a newspaper, we want to extract the first column and then the second column. In this example the PDF would have 2 - * beads(or articles), one for each column. The size of the charactersByArticle would be 5, because not all text on - * the screen will fall into one of the articles. The five divisions are shown below - *

- * Text before first article - * first article text - * text between first article and second article - * second article text - * text after second article - *

- * Most PDFs won't have any beads, so charactersByArticle will contain a single entry. - */ - protected ArrayList> charactersByArticle = new ArrayList<>(); - - private Map>> characterListMapping = new HashMap<>(); - - protected PDDocument document; - protected Writer output; - - /** - * True if we started a paragraph but haven't ended it yet. - */ - private boolean inParagraph; - - - /** - * Instantiate a new PDFTextStripper object. - * - * @throws IOException If there is an error loading the properties. - */ - public PDFTextStripper() throws IOException { - - } - - - /** - * This will return the text of a document. See writeText.
- * NOTE: The document must not be encrypted when coming into this method. - * - *

IMPORTANT: By default, text extraction is done in the same sequence as the text in the PDF page content stream. - * PDF is a graphic format, not a text format, and unlike HTML, it has no requirements that text one on page - * be rendered in a certain order. The order is the one that was determined by the software that created the - * PDF. To get text sorted from left to right and top to botton, use {@link #setSortByPosition(boolean)}. - * - * @param doc The document to get the text from. - * @return The text of the PDF document. - * @throws IOException if the doc state is invalid or it is encrypted. - */ - public String getText(PDDocument doc) throws IOException { - - StringWriter outputStream = new StringWriter(); - writeText(doc, outputStream); - return outputStream.toString(); - } - - - private void resetEngine() { - - currentPageNo = 0; - document = null; - if (charactersByArticle != null) { - charactersByArticle.clear(); - } - characterListMapping.clear(); - } - - - /** - * This will take a PDDocument and write the text of that document to the print writer. - * - * @param doc The document to get the data from. - * @param outputStream The location to put the text. - * @throws IOException If the doc is in an invalid state. - */ - public void writeText(PDDocument doc, Writer outputStream) throws IOException { - - resetEngine(); - document = doc; - output = outputStream; - if (getAddMoreFormatting()) { - paragraphEnd = lineSeparator; - pageStart = lineSeparator; - articleStart = lineSeparator; - articleEnd = lineSeparator; - } - startDocument(document); - processPages(document.getPages()); - endDocument(document); - } - - - /** - * This will process all of the pages and the text that is in them. - * - * @param pages The pages object in the document. - * @throws IOException If there is an error parsing the text. - */ - protected void processPages(PDPageTree pages) throws IOException { - - PDPage startBookmarkPage = startBookmark == null ? null : startBookmark.findDestinationPage(document); - if (startBookmarkPage != null) { - startBookmarkPageNumber = pages.indexOf(startBookmarkPage) + 1; - } else { - // -1 = undefined - startBookmarkPageNumber = -1; - } - - PDPage endBookmarkPage = endBookmark == null ? null : endBookmark.findDestinationPage(document); - if (endBookmarkPage != null) { - endBookmarkPageNumber = pages.indexOf(endBookmarkPage) + 1; - } else { - // -1 = undefined - endBookmarkPageNumber = -1; - } - - if (startBookmarkPageNumber == -1 && startBookmark != null && endBookmarkPageNumber == -1 && endBookmark != null && startBookmark.getCOSObject() == endBookmark.getCOSObject()) { - // this is a special case where both the start and end bookmark - // are the same but point to nothing. In this case - // we will not extract any text. - startBookmarkPageNumber = 0; - endBookmarkPageNumber = 0; - } - - for (PDPage page : pages) { - currentPageNo++; - if (page.hasContents()) { - processPage(page); - } - } - } - - - /** - * This method is available for subclasses of this class. It will be called before processing of the document start. - * - * @param document The PDF document that is being processed. - */ - protected void startDocument(PDDocument document) { - // no default implementation, but available for subclasses - } - - - /** - * This method is available for subclasses of this class. It will be called after processing of the document - * finishes. - * - * @param document The PDF document that is being processed. - */ - protected void endDocument(PDDocument document) { - // no default implementation, but available for subclasses - } - - - /** - * This will process the contents of a page. - * - * @param page The page to process. - * @throws IOException If there is an error processing the page. - */ - @Override - public void processPage(PDPage page) throws IOException { - - if (currentPageNo >= startPage && currentPageNo <= endPage && (startBookmarkPageNumber == -1 || currentPageNo >= startBookmarkPageNumber) && (endBookmarkPageNumber == -1 || currentPageNo <= endBookmarkPageNumber)) { - startPage(page); - - int numberOfArticleSections = 1; - if (shouldSeparateByBeads) { - fillBeadRectangles(page); - numberOfArticleSections += beadRectangles.size() * 2; - } - int originalSize = charactersByArticle.size(); - charactersByArticle.ensureCapacity(numberOfArticleSections); - int lastIndex = Math.max(numberOfArticleSections, originalSize); - for (int i = 0; i < lastIndex; i++) { - if (i < originalSize) { - charactersByArticle.get(i).clear(); - } else { - if (numberOfArticleSections < originalSize) { - charactersByArticle.remove(i); - } else { - charactersByArticle.add(new ArrayList<>()); - } - } - } - characterListMapping.clear(); - super.processPage(page); - writePage(); - endPage(page); - } - } - - - private void fillBeadRectangles(PDPage page) { - - beadRectangles = new ArrayList<>(); - for (PDThreadBead bead : page.getThreadBeads()) { - if (bead == null || bead.getRectangle() == null) { - // can't skip, because of null entry handling in processTextPosition() - beadRectangles.add(null); - continue; - } - - PDRectangle rect = bead.getRectangle(); - - // bead rectangle is in PDF coordinates (y=0 is bottom), - // glyphs are in image coordinates (y=0 is top), - // so we must flip - PDRectangle mediaBox = page.getMediaBox(); - float upperRightY = mediaBox.getUpperRightY() - rect.getLowerLeftY(); - float lowerLeftY = mediaBox.getUpperRightY() - rect.getUpperRightY(); - rect.setLowerLeftY(lowerLeftY); - rect.setUpperRightY(upperRightY); - - // adjust for cropbox - PDRectangle cropBox = page.getCropBox(); - if (cropBox.getLowerLeftX() != 0 || cropBox.getLowerLeftY() != 0) { - rect.setLowerLeftX(rect.getLowerLeftX() - cropBox.getLowerLeftX()); - rect.setLowerLeftY(rect.getLowerLeftY() - cropBox.getLowerLeftY()); - rect.setUpperRightX(rect.getUpperRightX() - cropBox.getLowerLeftX()); - rect.setUpperRightY(rect.getUpperRightY() - cropBox.getLowerLeftY()); - } - - beadRectangles.add(rect); - } - } - - - /** - * Start a new article, which is typically defined as a column on a single page (also referred to as a bead). This - * assumes that the primary direction of text is left to right. Default implementation is to do nothing. Subclasses - * may provide additional information. - * - * @throws IOException If there is any error writing to the stream. - */ - protected void startArticle() throws IOException { - - startArticle(true); - } - - - /** - * Start a new article, which is typically defined as a column on a single page (also referred to as a bead). - * Default implementation is to do nothing. Subclasses may provide additional information. - * - * @param isLTR true if primary direction of text is left to right. - * @throws IOException If there is any error writing to the stream. - */ - protected void startArticle(boolean isLTR) throws IOException { - - output.write(getArticleStart()); - } - - - /** - * End an article. Default implementation is to do nothing. Subclasses may provide additional information. - * - * @throws IOException If there is any error writing to the stream. - */ - protected void endArticle() throws IOException { - - output.write(getArticleEnd()); - } - - - /** - * Start a new page. Default implementation is to do nothing. Subclasses may provide additional information. - * - * @param page The page we are about to process. - */ - protected void startPage(PDPage page) { - // default is to do nothing - } - - - /** - * End a page. Default implementation is to do nothing. Subclasses may provide additional information. - * - * @param page The page we are about to process. - */ - protected void endPage(PDPage page) { - // default is to do nothing - } - - - private static final float END_OF_LAST_TEXT_X_RESET_VALUE = -1; - private static final float MAX_Y_FOR_LINE_RESET_VALUE = -Float.MAX_VALUE; - private static final float EXPECTED_START_OF_NEXT_WORD_X_RESET_VALUE = -Float.MAX_VALUE; - private static final float MAX_HEIGHT_FOR_LINE_RESET_VALUE = -1; - private static final float MIN_Y_TOP_FOR_LINE_RESET_VALUE = Float.MAX_VALUE; - private static final float LAST_WORD_SPACING_RESET_VALUE = -1; - - - /** - * This will print the text of the processed page to "output". It will estimate, based on the coordinates of the - * text, where newlines and word spacings should be placed. The text will be sorted only if that feature was - * enabled. - * - * @throws IOException If there is an error writing the text. - */ - protected void writePage() throws IOException { - - float maxYForLine = MAX_Y_FOR_LINE_RESET_VALUE; - float minYTopForLine = MIN_Y_TOP_FOR_LINE_RESET_VALUE; - float endOfLastTextX = END_OF_LAST_TEXT_X_RESET_VALUE; - float lastWordSpacing = LAST_WORD_SPACING_RESET_VALUE; - float maxHeightForLine = MAX_HEIGHT_FOR_LINE_RESET_VALUE; - PositionWrapper lastPosition = null; - PositionWrapper lastLineStartPosition = null; - - boolean startOfPage = true; // flag to indicate start of page - boolean startOfArticle; - if (!charactersByArticle.isEmpty()) { - writePageStart(); - } - - for (List textList : charactersByArticle) { - if (getSortByPosition()) { - TextPositionComparator comparator = new TextPositionComparator(); - - // because the TextPositionComparator is not transitive, but - // JDK7+ enforces transitivity on comparators, we need to use - // a custom quicksort implementation (which is slower, unfortunately). - if (useCustomQuickSort) { - QuickSort.sort(textList, comparator); - } else { - Collections.sort(textList, comparator); - } - } - - startArticle(); - startOfArticle = true; - - // Now cycle through to print the text. - // We queue up a line at a time before we print so that we can convert - // the line from presentation form to logical form (if needed). - List line = new ArrayList<>(); - - Iterator textIter = textList.iterator(); - // PDF files don't always store spaces. We will need to guess where we should add - // spaces based on the distances between TextPositions. Historically, this was done - // based on the size of the space character provided by the font. In general, this - // worked but there were cases where it did not work. Calculating the average character - // width and using that as a metric works better in some cases but fails in some cases - // where the spacing worked. So we use both. NOTE: Adobe reader also fails on some of - // these examples. - - // Keeps track of the previous average character width - float previousAveCharWidth = -1; - while (textIter.hasNext()) { - TextPosition position = textIter.next(); - PositionWrapper current = new PositionWrapper(position); - String characterValue = position.getUnicode(); - - // Resets the average character width when we see a change in font - // or a change in the font size - if (lastPosition != null && (position.getFont() != lastPosition.getTextPosition().getFont() || position.getFontSize() != lastPosition.getTextPosition() - .getFontSize())) { - previousAveCharWidth = -1; - } - - float positionX; - float positionY; - float positionWidth; - float positionHeight; - - // If we are sorting, then we need to use the text direction - // adjusted coordinates, because they were used in the sorting. -// if (getSortByPosition()) -// { - positionX = position.getXDirAdj(); - positionY = position.getYDirAdj(); - positionWidth = position.getWidthDirAdj(); - positionHeight = position.getHeightDir(); -// } -// else -// { -// positionX = position.getX(); -// positionY = position.getY(); -// positionWidth = position.getWidth(); -// positionHeight = position.getHeight(); -// } - - // The current amount of characters in a word - int wordCharCount = position.getIndividualWidths().length; - - // Estimate the expected width of the space based on the - // space character with some margin. - float wordSpacing = position.getWidthOfSpace(); - float deltaSpace; - if (wordSpacing == 0 || Float.isNaN(wordSpacing)) { - deltaSpace = Float.MAX_VALUE; - } else { - if (lastWordSpacing < 0) { - deltaSpace = wordSpacing * getSpacingTolerance(); - } else { - deltaSpace = (wordSpacing + lastWordSpacing) / 2f * getSpacingTolerance(); - } - } - - // Estimate the expected width of the space based on the average character width - // with some margin. This calculation does not make a true average (average of - // averages) but we found that it gave the best results after numerous experiments. - // Based on experiments we also found that .3 worked well. - float averageCharWidth; - if (previousAveCharWidth < 0) { - averageCharWidth = positionWidth / wordCharCount; - } else { - averageCharWidth = (previousAveCharWidth + positionWidth / wordCharCount) / 2f; - } - float deltaCharWidth = averageCharWidth * getAverageCharTolerance(); - - // Compares the values obtained by the average method and the wordSpacing method - // and picks the smaller number. - float expectedStartOfNextWordX = EXPECTED_START_OF_NEXT_WORD_X_RESET_VALUE; - if (endOfLastTextX != END_OF_LAST_TEXT_X_RESET_VALUE) { - expectedStartOfNextWordX = endOfLastTextX + Math.min(deltaSpace, deltaCharWidth); - } - - if (lastPosition != null) { - if (startOfArticle) { - lastPosition.setArticleStart(); - startOfArticle = false; - } - // RDD - Here we determine whether this text object is on the current - // line. We use the lastBaselineFontSize to handle the superscript - // case, and the size of the current font to handle the subscript case. - // Text must overlap with the last rendered baseline text by at least - // a small amount in order to be considered as being on the same line. - - // XXX BC: In theory, this check should really check if the next char is in - // full range seen in this line. This is what I tried to do with minYTopForLine, - // but this caused a lot of regression test failures. So, I'm leaving it be for - // now - if (!overlap(positionY, positionHeight, maxYForLine, maxHeightForLine)) { - writeLine(normalize(line)); - line.clear(); - lastLineStartPosition = handleLineSeparation(current, lastPosition, lastLineStartPosition, maxHeightForLine); - expectedStartOfNextWordX = EXPECTED_START_OF_NEXT_WORD_X_RESET_VALUE; - maxYForLine = MAX_Y_FOR_LINE_RESET_VALUE; - maxHeightForLine = MAX_HEIGHT_FOR_LINE_RESET_VALUE; - minYTopForLine = MIN_Y_TOP_FOR_LINE_RESET_VALUE; - } - // test if our TextPosition starts after a new word would be expected to start - if (expectedStartOfNextWordX != EXPECTED_START_OF_NEXT_WORD_X_RESET_VALUE && expectedStartOfNextWordX < positionX - // only bother adding a word separator if the last character was not a word separator - && (wordSeparator.isEmpty() || // - (lastPosition.getTextPosition().getUnicode() != null && !lastPosition.getTextPosition().getUnicode().endsWith(wordSeparator)))) { - line.add(LineItem.getWordSeparator()); - } - // if there is at least the equivalent of one space - // between the last character and the current one, - // reset the max line height as the font size may have completely changed - if (Math.abs(position.getX() - lastPosition.getTextPosition().getX()) > (wordSpacing + deltaSpace)) { - maxYForLine = MAX_Y_FOR_LINE_RESET_VALUE; - maxHeightForLine = MAX_HEIGHT_FOR_LINE_RESET_VALUE; - minYTopForLine = MIN_Y_TOP_FOR_LINE_RESET_VALUE; - } - } - if (positionY >= maxYForLine) { - maxYForLine = positionY; - } - // RDD - endX is what PDF considers to be the x coordinate of the - // end position of the text. We use it in computing our metrics below. - endOfLastTextX = positionX + positionWidth; - - // add it to the list - if (characterValue != null) { - if (startOfPage && lastPosition == null) { - writeParagraphStart();// not sure this is correct for RTL? - } - line.add(new LineItem(position)); - } - maxHeightForLine = Math.max(maxHeightForLine, positionHeight); - minYTopForLine = Math.min(minYTopForLine, positionY - positionHeight); - lastPosition = current; - if (startOfPage) { - lastPosition.setParagraphStart(); - lastPosition.setLineStart(); - lastLineStartPosition = lastPosition; - startOfPage = false; - } - lastWordSpacing = wordSpacing; - previousAveCharWidth = averageCharWidth; - } - // print the final line - if (line.size() > 0) { - writeLine(normalize(line)); - writeParagraphEnd(); - } - endArticle(); - } - writePageEnd(); - } - - - private boolean overlap(float y1, float height1, float y2, float height2) { - - return within(y1, y2, .1f) || y2 <= y1 && y2 >= y1 - height1 || y1 <= y2 && y1 >= y2 - height2; - } - - - /** - * Write the line separator value to the output stream. - * - * @throws IOException If there is a problem writing out the line separator to the document. - */ - protected void writeLineSeparator() throws IOException { - - output.write(getLineSeparator()); - } - - - /** - * Write the word separator value to the output stream. - * - * @throws IOException If there is a problem writing out the word separator to the document. - */ - protected void writeWordSeparator() throws IOException { - - output.write(getWordSeparator()); - } - - - /** - * Write the string in TextPosition to the output stream. - * - * @param text The text to write to the stream. - * @throws IOException If there is an error when writing the text. - */ - protected void writeCharacters(TextPosition text) throws IOException { - - output.write(text.getUnicode()); - } - - - /** - * Write a Java string to the output stream. The default implementation will ignore the textPositions - * and just calls {@link #writeString(String)}. - * - * @param text The text to write to the stream. - * @param textPositions The TextPositions belonging to the text. - * @throws IOException If there is an error when writing the text. - */ - protected void writeString(String text, List textPositions) throws IOException { - - writeString(text); - } - - - /** - * Write a Java string to the output stream. - * - * @param text The text to write to the stream. - * @throws IOException If there is an error when writing the text. - */ - protected void writeString(String text) throws IOException { - - output.write(text); - } - - - /** - * This will determine of two floating point numbers are within a specified variance. - * - * @param first The first number to compare to. - * @param second The second number to compare to. - * @param variance The allowed variance. - */ - private boolean within(float first, float second, float variance) { - - return second < first + variance && second > first - variance; - } - - - /** - * This will process a TextPosition object and add the text to the list of characters on a page. It takes care of - * overlapping text. - * - * @param text The text to process. - */ - @Override - protected void processTextPosition(TextPosition text) { - - boolean showCharacter = true; - if (suppressDuplicateOverlappingText) { - showCharacter = false; - String textCharacter = text.getUnicode(); - float textX = text.getX(); - float textY = text.getY(); - TreeMap> sameTextCharacters = characterListMapping.get(textCharacter); - if (sameTextCharacters == null) { - sameTextCharacters = new TreeMap>(); - characterListMapping.put(textCharacter, sameTextCharacters); - } - // RDD - Here we compute the value that represents the end of the rendered - // text. This value is used to determine whether subsequent text rendered - // on the same line overwrites the current text. - // - // We subtract any positive padding to handle cases where extreme amounts - // of padding are applied, then backed off (not sure why this is done, but there - // are cases where the padding is on the order of 10x the character width, and - // the TJ just backs up to compensate after each character). Also, we subtract - // an amount to allow for kerning (a percentage of the width of the last - // character). - boolean suppressCharacter = false; - float tolerance = text.getWidth() / textCharacter.length() / 3.0f; - - SortedMap> xMatches = sameTextCharacters.subMap(textX - tolerance, textX + tolerance); - for (TreeSet xMatch : xMatches.values()) { - SortedSet yMatches = xMatch.subSet(textY - tolerance, textY + tolerance); - if (!yMatches.isEmpty()) { - suppressCharacter = true; - break; - } - } - if (!suppressCharacter) { - TreeSet ySet = sameTextCharacters.get(textX); - if (ySet == null) { - ySet = new TreeSet(); - sameTextCharacters.put(textX, ySet); - } - ySet.add(textY); - showCharacter = true; - } - } - if (showCharacter) { - // if we are showing the character then we need to determine which article it belongs to - int foundArticleDivisionIndex = -1; - int notFoundButFirstLeftAndAboveArticleDivisionIndex = -1; - int notFoundButFirstLeftArticleDivisionIndex = -1; - int notFoundButFirstAboveArticleDivisionIndex = -1; - float x = text.getX(); - float y = text.getY(); - if (shouldSeparateByBeads) { - for (int i = 0; i < beadRectangles.size() && foundArticleDivisionIndex == -1; i++) { - PDRectangle rect = beadRectangles.get(i); - if (rect != null) { - if (rect.contains(x, y)) { - foundArticleDivisionIndex = i * 2 + 1; - } else if ((x < rect.getLowerLeftX() || y < rect.getUpperRightY()) && notFoundButFirstLeftAndAboveArticleDivisionIndex == -1) { - notFoundButFirstLeftAndAboveArticleDivisionIndex = i * 2; - } else if (x < rect.getLowerLeftX() && notFoundButFirstLeftArticleDivisionIndex == -1) { - notFoundButFirstLeftArticleDivisionIndex = i * 2; - } else if (y < rect.getUpperRightY() && notFoundButFirstAboveArticleDivisionIndex == -1) { - notFoundButFirstAboveArticleDivisionIndex = i * 2; - } - } else { - foundArticleDivisionIndex = 0; - } - } - } else { - foundArticleDivisionIndex = 0; - } - int articleDivisionIndex; - if (foundArticleDivisionIndex != -1) { - articleDivisionIndex = foundArticleDivisionIndex; - } else if (notFoundButFirstLeftAndAboveArticleDivisionIndex != -1) { - articleDivisionIndex = notFoundButFirstLeftAndAboveArticleDivisionIndex; - } else if (notFoundButFirstLeftArticleDivisionIndex != -1) { - articleDivisionIndex = notFoundButFirstLeftArticleDivisionIndex; - } else if (notFoundButFirstAboveArticleDivisionIndex != -1) { - articleDivisionIndex = notFoundButFirstAboveArticleDivisionIndex; - } else { - articleDivisionIndex = charactersByArticle.size() - 1; - } - - List textList = charactersByArticle.get(articleDivisionIndex); - - // In the wild, some PDF encoded documents put diacritics (accents on - // top of characters) into a separate Tj element. When displaying them - // graphically, the two chunks get overlaid. With text output though, - // we need to do the overlay. This code recombines the diacritic with - // its associated character if the two are consecutive. - if (textList.isEmpty()) { - textList.add(text); - } else { - // test if we overlap the previous entry. - // Note that we are making an assumption that we need to only look back - // one TextPosition to find what we are overlapping. - // This may not always be true. */ - TextPosition previousTextPosition = textList.get(textList.size() - 1); - if (text.isDiacritic() && previousTextPosition.contains(text)) { - previousTextPosition.mergeDiacritic(text); - } - // If the previous TextPosition was the diacritic, merge it into this - // one and remove it from the list. - else if (previousTextPosition.isDiacritic() && text.contains(previousTextPosition)) { - text.mergeDiacritic(previousTextPosition); - textList.remove(textList.size() - 1); - textList.add(text); - } else { - textList.add(text); - } - } - } - } - - - /** - * This is the page that the text extraction will start on. The pages start at page 1. For example in a 5 page PDF - * document, if the start page is 1 then all pages will be extracted. If the start page is 4 then pages 4 and 5 will - * be extracted. The default value is 1. - * - * @return Value of property startPage. - */ - public int getStartPage() { - - return startPage; - } - - - /** - * This will set the first page to be extracted by this class. - * - * @param startPageValue New value of 1-based startPage property. - */ - public void setStartPage(int startPageValue) { - - startPage = startPageValue; - } - - - /** - * This will get the last page that will be extracted. This is inclusive, for example if a 5 page PDF an endPage - * value of 5 would extract the entire document, an end page of 2 would extract pages 1 and 2. This defaults to - * Integer.MAX_VALUE such that all pages of the pdf will be extracted. - * - * @return Value of property endPage. - */ - public int getEndPage() { - - return endPage; - } - - - /** - * This will set the last page to be extracted by this class. - * - * @param endPageValue New value of 1-based endPage property. - */ - public void setEndPage(int endPageValue) { - - endPage = endPageValue; - } - - - /** - * Set the desired line separator for output text. The line.separator system property is used if the line separator - * preference is not set explicitly using this method. - * - * @param separator The desired line separator string. - */ - public void setLineSeparator(String separator) { - - lineSeparator = separator; - } - - - /** - * This will get the line separator. - * - * @return The desired line separator string. - */ - public String getLineSeparator() { - - return lineSeparator; - } - - - /** - * This will get the word separator. - * - * @return The desired word separator string. - */ - public String getWordSeparator() { - - return wordSeparator; - } - - - /** - * Set the desired word separator for output text. The PDFBox text extraction algorithm will output a space - * character if there is enough space between two words. By default a space character is used. If you need and - * accurate count of characters that are found in a PDF document then you might want to set the word separator to - * the empty string. - * - * @param separator The desired page separator string. - */ - public void setWordSeparator(String separator) { - - wordSeparator = separator; - } - - - /** - * @return Returns the suppressDuplicateOverlappingText. - */ - public boolean getSuppressDuplicateOverlappingText() { - - return suppressDuplicateOverlappingText; - } - - - /** - * Get the current page number that is being processed. - * - * @return A 1 based number representing the current page. - */ - protected int getCurrentPageNo() { - - return currentPageNo; - } - - - /** - * The output stream that is being written to. - * - * @return The stream that output is being written to. - */ - protected Writer getOutput() { - - return output; - } - - - /** - * Character strings are grouped by articles. It is quite common that there will only be a single article. This - * returns a List that contains List objects, the inner lists will contain TextPosition objects. - * - * @return A double List of TextPositions for all text strings on the page. - */ - protected List> getCharactersByArticle() { - - return charactersByArticle; - } - - - /** - * By default the text stripper will attempt to remove text that overlapps each other. Word paints the same - * character several times in order to make it look bold. By setting this to false all text will be extracted, which - * means that certain sections will be duplicated, but better performance will be noticed. - * - * @param suppressDuplicateOverlappingTextValue The suppressDuplicateOverlappingText to set. - */ - public void setSuppressDuplicateOverlappingText(boolean suppressDuplicateOverlappingTextValue) { - - suppressDuplicateOverlappingText = suppressDuplicateOverlappingTextValue; - } - - - /** - * This will tell if the text stripper should separate by beads. - * - * @return If the text will be grouped by beads. - */ - public boolean getSeparateByBeads() { - - return shouldSeparateByBeads; - } - - - /** - * Set if the text stripper should group the text output by a list of beads. The default value is true! - * - * @param aShouldSeparateByBeads The new grouping of beads. - */ - public void setShouldSeparateByBeads(boolean aShouldSeparateByBeads) { - - shouldSeparateByBeads = aShouldSeparateByBeads; - } - - - /** - * Get the bookmark where text extraction should end, inclusive. Default is null. - * - * @return The ending bookmark. - */ - public PDOutlineItem getEndBookmark() { - - return endBookmark; - } - - - /** - * Set the bookmark where the text extraction should stop. - * - * @param aEndBookmark The ending bookmark. - */ - public void setEndBookmark(PDOutlineItem aEndBookmark) { - - endBookmark = aEndBookmark; - } - - - /** - * Get the bookmark where text extraction should start, inclusive. Default is null. - * - * @return The starting bookmark. - */ - public PDOutlineItem getStartBookmark() { - - return startBookmark; - } - - - /** - * Set the bookmark where text extraction should start, inclusive. - * - * @param aStartBookmark The starting bookmark. - */ - public void setStartBookmark(PDOutlineItem aStartBookmark) { - - startBookmark = aStartBookmark; - } - - - /** - * This will tell if the text stripper should add some more text formatting. - * - * @return true if some more text formatting will be added - */ - public boolean getAddMoreFormatting() { - - return addMoreFormatting; - } - - - /** - * There will some additional text formatting be added if addMoreFormatting is set to true. Default is false. - * - * @param newAddMoreFormatting Tell PDFBox to add some more text formatting - */ - public void setAddMoreFormatting(boolean newAddMoreFormatting) { - - addMoreFormatting = newAddMoreFormatting; - } - - - /** - * This will tell if the text stripper should sort the text tokens before writing to the stream. - * - * @return true If the text tokens will be sorted before being written. - */ - public boolean getSortByPosition() { - - return sortByPosition; - } - - - /** - * The order of the text tokens in a PDF file may not be in the same as they appear visually on the screen. For - * example, a PDF writer may write out all text by font, so all bold or larger text, then make a second pass and - * write out the normal text.
- * The default is to not sort by position.
- *
- * A PDF writer could choose to write each character in a different order. By default PDFBox does not sort - * the text tokens before processing them due to performance reasons. - * - * @param newSortByPosition Tell PDFBox to sort the text positions. - */ - public void setSortByPosition(boolean newSortByPosition) { - - sortByPosition = newSortByPosition; - } - - - /** - * Get the current space width-based tolerance value that is being used to estimate where spaces in text should be - * added. Note that the default value for this has been determined from trial and error. - * - * @return The current tolerance / scaling factor - */ - public float getSpacingTolerance() { - - return spacingTolerance; - } - - - /** - * Set the space width-based tolerance value that is used to estimate where spaces in text should be added. Note - * that the default value for this has been determined from trial and error. Setting this value larger will reduce - * the number of spaces added. - * - * @param spacingToleranceValue tolerance / scaling factor to use - */ - public void setSpacingTolerance(float spacingToleranceValue) { - - spacingTolerance = spacingToleranceValue; - } - - - /** - * Get the current character width-based tolerance value that is being used to estimate where spaces in text should - * be added. Note that the default value for this has been determined from trial and error. - * - * @return The current tolerance / scaling factor - */ - public float getAverageCharTolerance() { - - return averageCharTolerance; - } - - - /** - * Set the character width-based tolerance value that is used to estimate where spaces in text should be added. Note - * that the default value for this has been determined from trial and error. Setting this value larger will reduce - * the number of spaces added. - * - * @param averageCharToleranceValue average tolerance / scaling factor to use - */ - public void setAverageCharTolerance(float averageCharToleranceValue) { - - averageCharTolerance = averageCharToleranceValue; - } - - - /** - * returns the multiple of whitespace character widths for the current text which the current line start can be - * indented from the previous line start beyond which the current line start is considered to be a paragraph start. - * - * @return the number of whitespace character widths to use when detecting paragraph indents. - */ - public float getIndentThreshold() { - - return indentThreshold; - } - - - /** - * sets the multiple of whitespace character widths for the current text which the current line start can be - * indented from the previous line start beyond which the current line start is considered to be a paragraph start. - * The default value is 2.0. - * - * @param indentThresholdValue the number of whitespace character widths to use when detecting paragraph indents. - */ - public void setIndentThreshold(float indentThresholdValue) { - - indentThreshold = indentThresholdValue; - } - - - /** - * the minimum whitespace, as a multiple of the max height of the current characters beyond which the current line - * start is considered to be a paragraph start. - * - * @return the character height multiple for max allowed whitespace between lines in the same paragraph. - */ - public float getDropThreshold() { - - return dropThreshold; - } - - - /** - * sets the minimum whitespace, as a multiple of the max height of the current characters beyond which the current - * line start is considered to be a paragraph start. The default value is 2.5. - * - * @param dropThresholdValue the character height multiple for max allowed whitespace between lines in the same - * paragraph. - */ - public void setDropThreshold(float dropThresholdValue) { - - dropThreshold = dropThresholdValue; - } - - - /** - * Returns the string which will be used at the beginning of a paragraph. - * - * @return the paragraph start string - */ - public String getParagraphStart() { - - return paragraphStart; - } - - - /** - * Sets the string which will be used at the beginning of a paragraph. - * - * @param s the paragraph start string - */ - public void setParagraphStart(String s) { - - paragraphStart = s; - } - - - /** - * Returns the string which will be used at the end of a paragraph. - * - * @return the paragraph end string - */ - public String getParagraphEnd() { - - return paragraphEnd; - } - - - /** - * Sets the string which will be used at the end of a paragraph. - * - * @param s the paragraph end string - */ - public void setParagraphEnd(String s) { - - paragraphEnd = s; - } - - - /** - * Returns the string which will be used at the beginning of a page. - * - * @return the page start string - */ - public String getPageStart() { - - return pageStart; - } - - - /** - * Sets the string which will be used at the beginning of a page. - * - * @param pageStartValue the page start string - */ - public void setPageStart(String pageStartValue) { - - pageStart = pageStartValue; - } - - - /** - * Returns the string which will be used at the end of a page. - * - * @return the page end string - */ - public String getPageEnd() { - - return pageEnd; - } - - - /** - * Sets the string which will be used at the end of a page. - * - * @param pageEndValue the page end string - */ - public void setPageEnd(String pageEndValue) { - - pageEnd = pageEndValue; - } - - - /** - * Returns the string which will be used at the beginning of an article. - * - * @return the article start string - */ - public String getArticleStart() { - - return articleStart; - } - - - /** - * Sets the string which will be used at the beginning of an article. - * - * @param articleStartValue the article start string - */ - public void setArticleStart(String articleStartValue) { - - articleStart = articleStartValue; - } - - - /** - * Returns the string which will be used at the end of an article. - * - * @return the article end string - */ - public String getArticleEnd() { - - return articleEnd; - } - - - /** - * Sets the string which will be used at the end of an article. - * - * @param articleEndValue the article end string - */ - public void setArticleEnd(String articleEndValue) { - - articleEnd = articleEndValue; - } - - - /** - * handles the line separator for a new line given the specified current and previous TextPositions. - * - * @param current the current text position - * @param lastPosition the previous text position - * @param lastLineStartPosition the last text position that followed a line separator. - * @param maxHeightForLine max height for positions since lastLineStartPosition - * @return start position of the last line - * @throws IOException if something went wrong - */ - private PositionWrapper handleLineSeparation(PositionWrapper current, - PositionWrapper lastPosition, - PositionWrapper lastLineStartPosition, - float maxHeightForLine) throws IOException { - - current.setLineStart(); - isParagraphSeparation(current, lastPosition, lastLineStartPosition, maxHeightForLine); - lastLineStartPosition = current; - if (current.isParagraphStart()) { - if (lastPosition.isArticleStart()) { - if (lastPosition.isLineStart()) { - writeLineSeparator(); - } - writeParagraphStart(); - } else { - writeLineSeparator(); - writeParagraphSeparator(); - } - } else { - writeLineSeparator(); - } - return lastLineStartPosition; - } - - - /** - * tests the relationship between the last text position, the current text position and the last text position that - * followed a line separator to decide if the gap represents a paragraph separation. This should only be - * called for consecutive text positions that first pass the line separation test. - *

- * This base implementation tests to see if the lastLineStartPosition is null OR if the current vertical position - * has dropped below the last text vertical position by at least 2.5 times the current text height OR if the current - * horizontal position is indented by at least 2 times the current width of a space character. - *

- *

- * This also attempts to identify text that is indented under a hanging indent. - *

- *

- * This method sets the isParagraphStart and isHangingIndent flags on the current position object. - *

- * - * @param position the current text position. This may have its isParagraphStart or isHangingIndent flags set upon - * return. - * @param lastPosition the previous text position (should not be null). - * @param lastLineStartPosition the last text position that followed a line separator, or null. - * @param maxHeightForLine max height for text positions since lasLineStartPosition. - */ - private void isParagraphSeparation(PositionWrapper position, PositionWrapper lastPosition, PositionWrapper lastLineStartPosition, float maxHeightForLine) { - - boolean result = false; - if (lastLineStartPosition == null) { - result = true; - } else { - float yGap = Math.abs(position.getTextPosition().getYDirAdj() - lastPosition.getTextPosition().getYDirAdj()); - float newYVal = multiplyFloat(getDropThreshold(), maxHeightForLine); - // do we need to flip this for rtl? - float xGap = position.getTextPosition().getXDirAdj() - lastLineStartPosition.getTextPosition().getXDirAdj(); - float newXVal = multiplyFloat(getIndentThreshold(), position.getTextPosition().getWidthOfSpace()); - float positionWidth = multiplyFloat(0.25f, position.getTextPosition().getWidth()); - - if (yGap > newYVal) { - result = true; - } else if (xGap > newXVal) { - // text is indented, but try to screen for hanging indent - if (!lastLineStartPosition.isParagraphStart()) { - result = true; - } else { - position.setHangingIndent(); - } - } else if (xGap < -position.getTextPosition().getWidthOfSpace()) { - // text is left of previous line. Was it a hanging indent? - if (!lastLineStartPosition.isParagraphStart()) { - result = true; - } - } else if (Math.abs(xGap) < positionWidth) { - // current horizontal position is within 1/4 a char of the last - // linestart. We'll treat them as lined up. - if (lastLineStartPosition.isHangingIndent()) { - position.setHangingIndent(); - } else if (lastLineStartPosition.isParagraphStart()) { - // check to see if the previous line looks like - // any of a number of standard list item formats - Pattern liPattern = matchListItemPattern(lastLineStartPosition); - if (liPattern != null) { - Pattern currentPattern = matchListItemPattern(position); - if (liPattern == currentPattern) { - result = true; - } - } - } - } - } - if (result) { - position.setParagraphStart(); - } - } - - - private float multiplyFloat(float value1, float value2) { - // multiply 2 floats and truncate the resulting value to 3 decimal places - // to avoid wrong results when comparing with another float - return Math.round(value1 * value2 * 1000) / 1000f; - } - - - /** - * writes the paragraph separator string to the output. - * - * @throws IOException if something went wrong - */ - protected void writeParagraphSeparator() throws IOException { - - writeParagraphEnd(); - writeParagraphStart(); - } - - - /** - * Write something (if defined) at the start of a paragraph. - * - * @throws IOException if something went wrong - */ - protected void writeParagraphStart() throws IOException { - - if (inParagraph) { - writeParagraphEnd(); - inParagraph = false; - } - output.write(getParagraphStart()); - inParagraph = true; - } - - - /** - * Write something (if defined) at the end of a paragraph. - * - * @throws IOException if something went wrong - */ - protected void writeParagraphEnd() throws IOException { - - if (!inParagraph) { - writeParagraphStart(); - } - output.write(getParagraphEnd()); - inParagraph = false; - } - - - /** - * Write something (if defined) at the start of a page. - * - * @throws IOException if something went wrong - */ - protected void writePageStart() throws IOException { - - output.write(getPageStart()); - } - - - /** - * Write something (if defined) at the end of a page. - * - * @throws IOException if something went wrong - */ - protected void writePageEnd() throws IOException { - - output.write(getPageEnd()); - } - - - /** - * returns the list item Pattern object that matches the text at the specified PositionWrapper or null if the text - * does not match such a pattern. The list of Patterns tested against is given by the {@link #getListItemPatterns()} - * method. To add to the list, simply override that method (if sub-classing) or explicitly supply your own list - * using {@link #setListItemPatterns(List)}. - * - * @param pw position - * @return the matching pattern - */ - private Pattern matchListItemPattern(PositionWrapper pw) { - - TextPosition tp = pw.getTextPosition(); - String txt = tp.getUnicode(); - return matchPattern(txt, getListItemPatterns()); - } - - - /** - * a list of regular expressions that match commonly used list item formats, i.e. bullets, numbers, letters, Roman - * numerals, etc. Not meant to be comprehensive. - */ - private static final String[] LIST_ITEM_EXPRESSIONS = {"\\.", "\\d+\\.", "\\[\\d+\\]", "\\d+\\)", "[A-Z]\\.", "[a-z]\\.", "[A-Z]\\)", "[a-z]\\)", "[IVXL]+\\.", "[ivxl]+\\.",}; - - private List listOfPatterns = null; - - - /** - * use to supply a different set of regular expression patterns for matching list item starts. - * - * @param patterns list of patterns - */ - protected void setListItemPatterns(List patterns) { - - listOfPatterns = patterns; - } - - - /** - * returns a list of regular expression Patterns representing different common list item formats. For example - * numbered items of form: - *
    - *
  1. some text
  2. - *
  3. more text
  4. - *
- * or - *
    - *
  • some text
  • - *
  • more text
  • - *
- * etc., all begin with some character pattern. The pattern "\\d+\." (matches "1.", "2.", ...) or "\[\\d+\]" - * (matches "[1]", "[2]", ...). - *

- * This method returns a list of such regular expression Patterns. - * - * @return a list of Pattern objects. - */ - protected List getListItemPatterns() { - - if (listOfPatterns == null) { - listOfPatterns = new ArrayList(); - for (String expression : LIST_ITEM_EXPRESSIONS) { - Pattern p = Pattern.compile(expression); - listOfPatterns.add(p); - } - } - return listOfPatterns; - } - - - /** - * iterates over the specified list of Patterns until it finds one that matches the specified string. Then returns - * the Pattern. - *

- * Order of the supplied list of patterns is important as most common patterns should come first. Patterns should be - * strict in general, and all will be used with case sensitivity on. - *

- * - * @param string the string to be searched - * @param patterns list of patterns - * @return matching pattern - */ - protected static Pattern matchPattern(String string, List patterns) { - - for (Pattern p : patterns) { - if (p.matcher(string).matches()) { - return p; - } - } - return null; - } - - - /** - * Write a list of string containing a whole line of a document. - * - * @param line a list with the words of the given line - * @throws IOException if something went wrong - */ - private void writeLine(List line) throws IOException { - - int numberOfStrings = line.size(); - for (int i = 0; i < numberOfStrings; i++) { - WordWithTextPositions word = line.get(i); - writeString(word.getText(), word.getTextPositions()); - if (i < numberOfStrings - 1) { - writeWordSeparator(); - } - } - } - - - /** - * Normalize the given list of TextPositions. - * - * @param line list of TextPositions - * @return a list of strings, one string for every word - */ - private List normalize(List line) { - - List normalized = new LinkedList(); - StringBuilder lineBuilder = new StringBuilder(); - List wordPositions = new ArrayList(); - - for (LineItem item : line) { - lineBuilder = normalizeAdd(normalized, lineBuilder, wordPositions, item); - } - - if (lineBuilder.length() > 0) { - normalized.add(createWord(lineBuilder.toString(), wordPositions)); - } - return normalized; - } - - - /** - * Handles the LTR and RTL direction of the given words. The whole implementation stands and falls with the given - * word. If the word is a full line, the results will be the best. If the word contains of single words or - * characters, the order of the characters in a word or words in a line may wrong, due to RTL and LTR marks and - * characters! - *

- * Based on http://www.nesterovsky-bros.com/weblog/2013/07/28/VisualToLogicalConversionInJava.aspx - * - * @param word The word that shall be processed - * @return new word with the correct direction of the containing characters - */ - private String handleDirection(String word) { - - Bidi bidi = new Bidi(word, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); - - // if there is pure LTR text no need to process further - if (!bidi.isMixed() && bidi.getBaseLevel() == Bidi.DIRECTION_LEFT_TO_RIGHT) { - return word; - } - - // collect individual bidi information - int runCount = bidi.getRunCount(); - byte[] levels = new byte[runCount]; - Integer[] runs = new Integer[runCount]; - - for (int i = 0; i < runCount; i++) { - levels[i] = (byte) bidi.getRunLevel(i); - runs[i] = i; - } - - // reorder individual parts based on their levels - Bidi.reorderVisually(levels, 0, runs, 0, runCount); - - // collect the parts based on the direction within the run - StringBuilder result = new StringBuilder(); - - for (int i = 0; i < runCount; i++) { - int index = runs[i]; - int start = bidi.getRunStart(index); - int end = bidi.getRunLimit(index); - - int level = levels[index]; - - if ((level & 1) != 0) { - while (--end >= start) { - char character = word.charAt(end); - if (Character.isMirrored(word.codePointAt(end))) { - if (MIRRORING_CHAR_MAP.containsKey(character)) { - result.append(MIRRORING_CHAR_MAP.get(character)); - } else { - result.append(character); - } - } else { - result.append(character); - } - } - } else { - result.append(word, start, end); - } - } - - return result.toString(); - } - - - @SuppressFBWarnings - private static Map MIRRORING_CHAR_MAP = new HashMap<>(); - - static { - String path = "/org/apache/pdfbox/resources/text/BidiMirroring.txt"; - InputStream input = new BufferedInputStream(PDFTextStripper.class.getResourceAsStream(path)); - try { - parseBidiFile(input); - } catch (IOException e) { - LOG.warn("Could not parse BidiMirroring.txt, mirroring char map will be empty: " + e.getMessage()); - } finally { - try { - input.close(); - } catch (IOException e) { - LOG.debug("Could not close BidiMirroring.txt ", e); - } - } - } - - /** - * This method parses the bidi file provided as inputstream. - * - * @param inputStream - The bidi file as inputstream - * @throws IOException if any line could not be read by the LineNumberReader - */ - private static void parseBidiFile(InputStream inputStream) throws IOException { - - LineNumberReader rd = new LineNumberReader(new InputStreamReader(inputStream)); - - do { - String s = rd.readLine(); - if (s == null) { - break; - } - - int comment = s.indexOf('#'); // ignore comments - if (comment != -1) { - s = s.substring(0, comment); - } - - if (s.length() < 2) { - continue; - } - - StringTokenizer st = new StringTokenizer(s, ";"); - int nFields = st.countTokens(); - Character[] fields = new Character[nFields]; - for (int i = 0; i < nFields; i++) { - fields[i] = (char) Integer.parseInt(st.nextToken().trim(), 16); - } - - if (fields.length == 2) { - // initialize the MIRRORING_CHAR_MAP - MIRRORING_CHAR_MAP.put(fields[0], fields[1]); - } - - } while (true); - } - - - /** - * Used within {@link #normalize(List)} to create a single {@link WordWithTextPositions} entry. - */ - private WordWithTextPositions createWord(String word, List wordPositions) { - - return new WordWithTextPositions(normalizeWord(word), wordPositions); - } - - - /** - * Normalize certain Unicode characters. For example, convert the single "fi" ligature to "f" and "i". Also - * normalises Arabic and Hebrew presentation forms. - * - * @param word Word to normalize - * @return Normalized word - */ - private String normalizeWord(String word) { - - StringBuilder builder = null; - int p = 0; - int q = 0; - int strLength = word.length(); - for (; q < strLength; q++) { - // We only normalize if the codepoint is in a given range. - // Otherwise, NFKC converts too many things that would cause - // confusion. For example, it converts the micro symbol in - // extended Latin to the value in the Greek script. We normalize - // the Unicode Alphabetic and Arabic A&B Presentation forms. - char c = word.charAt(q); - if (0xFB00 <= c && c <= 0xFDFF || 0xFE70 <= c && c <= 0xFEFF) { - if (builder == null) { - builder = new StringBuilder(strLength * 2); - } - builder.append(word, p, q); - // Some fonts map U+FDF2 differently than the Unicode spec. - // They add an extra U+0627 character to compensate. - // This removes the extra character for those fonts. - if (c == 0xFDF2 && q > 0 && (word.charAt(q - 1) == 0x0627 || word.charAt(q - 1) == 0xFE8D)) { - builder.append("\u0644\u0644\u0647"); - } else { - // Trim because some decompositions have an extra space, such as U+FC5E - builder.append(Normalizer.normalize(word.substring(q, q + 1), Normalizer.Form.NFKC).trim()); - } - p = q + 1; - } - } - if (builder == null) { - return handleDirection(word); - } else { - builder.append(word, p, q); - return handleDirection(builder.toString()); - } - } - - - /** - * Used within {@link #normalize(List)} to handle a {@link TextPosition}. - * - * @return The StringBuilder that must be used when calling this method. - */ - private StringBuilder normalizeAdd(List normalized, StringBuilder lineBuilder, List wordPositions, LineItem item) { - - if (item.isWordSeparator()) { - normalized.add(createWord(lineBuilder.toString(), new ArrayList(wordPositions))); - lineBuilder = new StringBuilder(); - wordPositions.clear(); - } else { - TextPosition text = item.getTextPosition(); - lineBuilder.append(text.getUnicode()); - wordPositions.add(text); - } - return lineBuilder; - } - - - /** - * internal marker class. Used as a place holder in a line of TextPositions. - */ - private static final class LineItem { - - public static LineItem WORD_SEPARATOR = new LineItem(); - - - public static LineItem getWordSeparator() { - - return WORD_SEPARATOR; - } - - - private final TextPosition textPosition; - - - private LineItem() { - - textPosition = null; - } - - - LineItem(TextPosition textPosition) { - - this.textPosition = textPosition; - } - - - public TextPosition getTextPosition() { - - return textPosition; - } - - - public boolean isWordSeparator() { - - return textPosition == null; - } - - } - - /** - * Internal class that maps strings to lists of {@link TextPosition} arrays. Note that the number of entries in that - * list may differ from the number of characters in the string due to normalization. - * - * @author Axel Dörfler - */ - private static final class WordWithTextPositions { - - String text; - List textPositions; - - - WordWithTextPositions(String word, List positions) { - - text = word; - textPositions = positions; - } - - - public String getText() { - - return text; - } - - - public List getTextPositions() { - - return textPositions; - } - - } - - /** - * wrapper of TextPosition that adds flags to track status as linestart and paragraph start positions. - *

- * This is implemented as a wrapper since the TextPosition class doesn't provide complete access to its state fields - * to subclasses. Also, conceptually TextPosition is immutable while these flags need to be set post-creation so it - * makes sense to put these flags in this separate class. - *

- * - * @author m.martinez@ll.mit.edu - */ - private static final class PositionWrapper { - - private boolean isLineStart = false; - private boolean isParagraphStart = false; - private boolean isPageBreak = false; - private boolean isHangingIndent = false; - private boolean isArticleStart = false; - - private TextPosition position = null; - - - /** - * Constructs a PositionWrapper around the specified TextPosition object. - * - * @param position the text position. - */ - PositionWrapper(TextPosition position) { - - this.position = position; - } - - - /** - * Returns the underlying TextPosition object. - * - * @return the text position - */ - public TextPosition getTextPosition() { - - return position; - } - - - public boolean isLineStart() { - - return isLineStart; - } - - - /** - * Sets the isLineStart() flag to true. - */ - public void setLineStart() { - - this.isLineStart = true; - } - - - public boolean isParagraphStart() { - - return isParagraphStart; - } - - - /** - * sets the isParagraphStart() flag to true. - */ - public void setParagraphStart() { - - this.isParagraphStart = true; - } - - - public boolean isArticleStart() { - - return isArticleStart; - } - - - /** - * Sets the isArticleStart() flag to true. - */ - public void setArticleStart() { - - this.isArticleStart = true; - } - - - public boolean isPageBreak() { - - return isPageBreak; - } - - - /** - * Sets the isPageBreak() flag to true. - */ - public void setPageBreak() { - - this.isPageBreak = true; - } - - - public boolean isHangingIndent() { - - return isHangingIndent; - } - - - /** - * Sets the isHangingIndent() flag to true. - */ - public void setHangingIndent() { - - this.isHangingIndent = true; - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BlockificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BlockificationService.java deleted file mode 100644 index d7a96673..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BlockificationService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import static java.util.stream.Collectors.toSet; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; - -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.FloatFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.Orientation; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.RulingTextDirAdjustUtil; - -public interface BlockificationService { - - ClassificationPage blockify(List textPositions, List horizontalRulingLines, List verticalRulingLines); -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BodyTextFrameService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BodyTextFrameService.java deleted file mode 100644 index 278218bb..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BodyTextFrameService.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.FloatFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.PositionUtils; - -@Service -public class BodyTextFrameService { - - @Value("${application.type:RedactManager}") - private String applicationType; - - private static final float APPROXIMATE_HEADER_LINE_COUNT = 2.9f; - - - /** - * Adjusts and sets the body text frame to a page. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * The aspect ratio of the page is also regarded. - * - * @param page The page - * @param bodyTextFrame frame that contains the main text on portrait pages - * @param landscapeBodyTextFrame frame that contains the main text on landscape pages - */ - public void setBodyTextFrameAdjustedToPage(ClassificationPage page, Rectangle bodyTextFrame, Rectangle landscapeBodyTextFrame) { - - Rectangle textFrame = page.isLandscape() ? landscapeBodyTextFrame : bodyTextFrame; - - if (page.getPageWidth() > page.getPageHeight() && page.getRotation() == 270) { - textFrame = new Rectangle(new Point(textFrame.getTopLeft().getY(), page.getPageHeight() - textFrame.getTopLeft().getX() - textFrame.getWidth()), - textFrame.getHeight(), - textFrame.getWidth(), - 0); - } else if (page.getPageWidth() > page.getPageHeight() && page.getRotation() != 0) { - textFrame = new Rectangle(new Point(textFrame.getTopLeft().getY(), textFrame.getTopLeft().getX()), textFrame.getHeight(), textFrame.getWidth(), page.getPageNumber()); - } else if (page.getRotation() == 180) { - textFrame = new Rectangle(new Point(textFrame.getTopLeft().getX(), page.getPageHeight() - textFrame.getTopLeft().getY() - textFrame.getHeight()), - textFrame.getWidth(), - textFrame.getHeight(), - 0); - } - page.setBodyTextFrame(textFrame); - } - - - /** - * Calculates the frame that contains the main text, text outside the frame will be e.g. headers or footers. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * The aspect ratio of the page is also regarded. - * - * @param pages List of all pages - * @param documentFontSizeCounter Statistics of the document - * @param landscape Calculate for landscape or portrait - * @return Rectangle of the text frame - */ - public Rectangle calculateBodyTextFrame(List pages, FloatFrequencyCounter documentFontSizeCounter, boolean landscape) { - - BodyTextFrameExpansionsRectangle expansionsRectangle = new BodyTextFrameExpansionsRectangle(); - - for (ClassificationPage page : pages) { - - if (page.getTextBlocks().isEmpty() || landscape != page.isLandscape()) { - continue; - } - - for (AbstractPageBlock container : page.getTextBlocks()) { - - if (container instanceof TextPageBlock) { - TextPageBlock textBlock = (TextPageBlock) container; - if (textBlock.getMostPopularWordFont() == null || textBlock.getMostPopularWordStyle() == null) { - continue; - } - - float approxLineCount = PositionUtils.getApproxLineCount(textBlock); - if (applicationType.equals("DocuMine") && approxLineCount < APPROXIMATE_HEADER_LINE_COUNT && textBlock.getMaxY() >= page.getPageHeight() - (page.getPageHeight() / 10) - || applicationType.equals("RedactManager") && approxLineCount < APPROXIMATE_HEADER_LINE_COUNT){ - continue; - } - - if (documentFontSizeCounter.getMostPopular() != null && textBlock.getMostPopularWordFontSize() >= documentFontSizeCounter.getMostPopular()) { - - expandRectangle(textBlock, page, expansionsRectangle); - } - } - - if (container instanceof TablePageBlock) { - TablePageBlock table = (TablePageBlock) container; - for (List row : table.getRows()) { - for (Cell cell : row) { - - if (cell == null || cell.getTextBlocks() == null) { - continue; - } - for (TextPageBlock textBlock : cell.getTextBlocks()) { - expandRectangle(textBlock, page, expansionsRectangle); - } - } - } - } - } - } - return new Rectangle(new Point(expansionsRectangle.minX, expansionsRectangle.minY), - expansionsRectangle.maxX - expansionsRectangle.minX, - expansionsRectangle.maxY - expansionsRectangle.minY, - 0); - } - - - private void expandRectangle(TextPageBlock textBlock, ClassificationPage page, BodyTextFrameExpansionsRectangle expansionsRectangle) { - - if (page.getPageWidth() > page.getPageHeight() && page.getRotation() != 0) { - if (textBlock.getPdfMinY() < expansionsRectangle.minX) { - expansionsRectangle.minX = textBlock.getPdfMinY(); - } - if (textBlock.getPdfMaxY() > expansionsRectangle.maxX) { - expansionsRectangle.maxX = textBlock.getPdfMaxY(); - } - if (textBlock.getPdfMinX() < expansionsRectangle.minY) { - expansionsRectangle.minY = textBlock.getPdfMinX(); - } - if (textBlock.getPdfMaxX() > expansionsRectangle.maxY) { - expansionsRectangle.maxY = textBlock.getPdfMaxX(); - } - } else { - if (textBlock.getPdfMinX() < expansionsRectangle.minX) { - expansionsRectangle.minX = textBlock.getPdfMinX(); - } - if (textBlock.getPdfMaxX() > expansionsRectangle.maxX) { - expansionsRectangle.maxX = textBlock.getPdfMaxX(); - } - if (textBlock.getPdfMinY() < expansionsRectangle.minY) { - expansionsRectangle.minY = textBlock.getPdfMinY(); - } - if (textBlock.getPdfMaxY() > expansionsRectangle.maxY) { - expansionsRectangle.maxY = textBlock.getPdfMaxY(); - } - } - } - - - private class BodyTextFrameExpansionsRectangle { - - float minX = 10000; - float maxX = -100; - float minY = 10000; - float maxY = -100; - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ClassificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ClassificationService.java deleted file mode 100644 index 1e37929b..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ClassificationService.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; - -public interface ClassificationService { - void classifyDocument(ClassificationDocument document); -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ColumnDetectionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ColumnDetectionService.java deleted file mode 100644 index 27a15912..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ColumnDetectionService.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Rectangle2D; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.stream.IntStream; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class ColumnDetectionService { - - private static final double SPLITTABLE_LINE_PERCENTAGE_THRESHOLD = 0.6; - private static final int MAX_NUMBER_OF_COLUMNS = 4; - - - public List detectColumns(List textPositionSequences, Rectangle2D mainBodyTextFrame) { - - if (textPositionSequences.size() < 2) { - return List.of(mainBodyTextFrame); - } - - List> linesWithGaps = LineDetectionService.findLinesWithGaps(textPositionSequences); - - Map> linesWithMatchingGapIndices = new HashMap<>(); - for (int numberOfColumns = 2; numberOfColumns <= MAX_NUMBER_OF_COLUMNS; numberOfColumns++) { - linesWithMatchingGapIndices.put(numberOfColumns, findConsecutiveLinesWithMatchingGaps(linesWithGaps, mainBodyTextFrame.getWidth(), numberOfColumns)); - } - - int optimalNumberOfColumns = findOptimalNumberOfColumns(linesWithMatchingGapIndices, linesWithGaps.size()); - if (optimalNumberOfColumns == 1) { - return List.of(mainBodyTextFrame); - } - return buildColumns(mainBodyTextFrame, getLinesWithMatchingGaps(linesWithMatchingGapIndices.get(optimalNumberOfColumns), linesWithGaps), optimalNumberOfColumns); - } - - - private static List findConsecutiveLinesWithMatchingGaps(List> linesWithGaps, double width, int numberOfColumns) { - - List booleans = lineHasMatchingGap(linesWithGaps, width, numberOfColumns); - return findConsecutiveTrueIndicesWithMaxLengthRun(booleans); - } - - - private List lineHasMatchingGap(List> linesWithGaps, double width, int numberOfColumns) { - - return linesWithGaps.stream() - .map(blocksWithGaps -> IntStream.range(1, numberOfColumns) - .allMatch(columnIndex -> noBlocksIntersectX(blocksWithGaps, calculateGapLocation(width, numberOfColumns, columnIndex)))) - .toList(); - } - - - private List findConsecutiveTrueIndicesWithMaxLengthRun(List booleans) { - - List maxConsecutiveTrueIndices = new LinkedList<>(); - List currentConsecutiveTrueIndices = new LinkedList<>(); - for (int i = 0; i < booleans.size(); i++) { - if (!booleans.get(i)) { - if (currentConsecutiveTrueIndices.isEmpty()) { - continue; - } - if (currentConsecutiveTrueIndices.size() > maxConsecutiveTrueIndices.size()) { - maxConsecutiveTrueIndices = currentConsecutiveTrueIndices; - } - currentConsecutiveTrueIndices = new LinkedList<>(); - continue; - } - currentConsecutiveTrueIndices.add(i); - } - if (currentConsecutiveTrueIndices.size() > maxConsecutiveTrueIndices.size()) { - return currentConsecutiveTrueIndices; - } - return maxConsecutiveTrueIndices; - } - - - private static int findOptimalNumberOfColumns(Map> linesWithMatchingGapIndices, Integer numberOfLines) { - - return linesWithMatchingGapIndices.entrySet() - .stream() - .max(comparePercentages(numberOfLines)) - .filter(entry -> percentageIsAboveThreshold(entry, numberOfLines)) - .map(Map.Entry::getKey) - .orElse(1); - } - - - private List buildColumns(Rectangle2D mainBodyTextFrame, List rectanglesToMerge, int optimalColumnCount) { - - if (optimalColumnCount == 1 || rectanglesToMerge.isEmpty()) { - return List.of(mainBodyTextFrame); - } - - double maxY = rectanglesToMerge.get(0).getMaxY(); - double minY = rectanglesToMerge.get(rectanglesToMerge.size() - 1).getMinY(); - - List columns = new LinkedList<>(); - double width = mainBodyTextFrame.getWidth() / optimalColumnCount; - double height = maxY - minY; - for (int i = 0; i < optimalColumnCount; i++) { - columns.add(new Rectangle2D.Double(mainBodyTextFrame.getMinY() + i * width, minY, width, height)); - } - return columns; - } - - - private Comparator>> comparePercentages(Integer numberOfLines) { - - return Comparator.comparingDouble(entry -> calculatePercentage(entry.getValue().size(), numberOfLines)); - } - - - private List getLinesWithMatchingGaps(List linesWithMatchingGapIndices, List> linesWithGaps) { - - return linesWithMatchingGapIndices.stream().map(linesWithGaps::get).flatMap(Collection::stream).toList(); - } - - - private boolean percentageIsAboveThreshold(Map.Entry> entry, Integer numberOfLines) { - - return calculatePercentage(entry.getValue().size(), numberOfLines) > SPLITTABLE_LINE_PERCENTAGE_THRESHOLD; - } - - - private double calculatePercentage(Integer numberOfMatchingLines, Integer numberOfLines) { - - return ((double) numberOfMatchingLines) / ((double) numberOfLines); - } - - - private double calculateGapLocation(double pageWidth, int numberOfColumns, int columnIndex) { - - return (pageWidth / numberOfColumns) * columnIndex; - } - - - private Boolean noBlocksIntersectX(List blocksWithGaps, double x) { - - return blocksWithGaps.stream().noneMatch(rect -> rect.getMaxX() > x && rect.getMinX() < x); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineBlockificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineBlockificationService.java deleted file mode 100644 index 10bc2a28..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineBlockificationService.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import static java.util.stream.Collectors.toSet; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.FloatFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.Orientation; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.RulingTextDirAdjustUtil; -import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns; - -@Service -@ConditionalOnProperty(prefix = "application", name = "type", havingValue = "DocuMine") -@SuppressWarnings("all") -public class DocuMineBlockificationService implements BlockificationService{ - - static final float THRESHOLD = 1f; - - Pattern pattern = Patterns.getCompiledPattern("^(\\d{1,2}\\.){1,3}\\d{1,2}\\.?\\s[0-9A-Za-z ()-]{2,50}", true); - - - /** - * This method is building blocks by expanding the minX/maxX and minY/maxY value on each word that is not split by the conditions. - * This method must use text direction adjusted postions (DirAdj). Where {0,0} is on the upper left. Never try to change this! - * Rulings (Table lines) must be adjusted to the text directions as well, when checking if a block is split by a ruling. - * @param textPositions The words of a page. - * @param horizontalRulingLines Horizontal table lines. - * @param verticalRulingLines Vertical table lines. - * @return Page object that contains the Textblock and text statistics. - */ - public ClassificationPage blockify(List textPositions, List horizontalRulingLines, List verticalRulingLines) { - - List chunkWords = new ArrayList<>(); - List chunkBlockList1 = new ArrayList<>(); - - float minX = 1000, maxX = 0, minY = 1000, maxY = 0; - TextPositionSequence prev = null; - - boolean wasSplitted = false; - Float splitX1 = null; - for (TextPositionSequence word : textPositions) { - - boolean lineSeparation = prev != null && word.getMinYDirAdj() - maxY > Math.min(word.getHeight(), prev.getHeight()) * 1.25; - boolean startFromTop = prev != null && word.getMinYDirAdj() < prev.getMinYDirAdj() - prev.getTextHeight(); - boolean splitByX = prev != null && maxX + 50 < word.getMinXDirAdj() && prev.getMinYDirAdj() == word.getMinYDirAdj(); - boolean negativeXGap = prev != null && word.getMinXDirAdj() - minX < -5; - boolean newLineAfterSplit = prev != null && word.getMinYDirAdj() != prev.getMinYDirAdj() && wasSplitted && splitX1 != word.getMinXDirAdj(); - boolean isSplitByRuling = isSplitByRuling(minX, minY, maxX, maxY, word, horizontalRulingLines, verticalRulingLines); - boolean splitByDir = prev != null && !prev.getDir().equals(word.getDir()); - boolean splitByOtherFontAndOtherY = prev != null && prev.getMaxYDirAdj() != word.getMaxYDirAdj() && (word.getFontStyle().contains("bold") && !prev.getFontStyle().contains("bold") || prev.getFontStyle().contains("bold") && !word.getFontStyle().contains("bold")); - - Matcher matcher = pattern.matcher(chunkWords.stream().collect(Collectors.joining(" ")).toString()); - boolean startsOnSameX = Math.abs(minX - word.getMinXDirAdj()) < 5 && matcher.matches(); - - if (prev != null && (lineSeparation || startFromTop || splitByDir || isSplitByRuling || splitByOtherFontAndOtherY || negativeXGap || startsOnSameX)) { - - Orientation prevOrientation = null; - if (!chunkBlockList1.isEmpty()) { - prevOrientation = chunkBlockList1.get(chunkBlockList1.size() - 1).getOrientation(); - } - - TextPageBlock cb1 = buildTextBlock(chunkWords); - chunkBlockList1.add(cb1); - chunkWords = new ArrayList<>(); - - if (splitByX && !isSplitByRuling) { - wasSplitted = true; - cb1.setOrientation(Orientation.LEFT); - splitX1 = word.getMinXDirAdj(); - } else if (newLineAfterSplit && !isSplitByRuling) { - wasSplitted = false; - cb1.setOrientation(Orientation.RIGHT); - splitX1 = null; - } else if (prevOrientation != null && prevOrientation.equals(Orientation.RIGHT) && (lineSeparation || !startFromTop || !splitByX || !newLineAfterSplit || !isSplitByRuling)) { - cb1.setOrientation(Orientation.LEFT); - } - - minX = 1000; - maxX = 0; - minY = 1000; - maxY = 0; - prev = null; - } - - chunkWords.add(word); - - prev = word; - if (word.getMinXDirAdj() < minX) { - minX = word.getMinXDirAdj(); - } - if (word.getMaxXDirAdj() > maxX) { - maxX = word.getMaxXDirAdj(); - } - if (word.getMinYDirAdj() < minY) { - minY = word.getMinYDirAdj(); - } - if (word.getMaxYDirAdj() > maxY) { - maxY = word.getMaxYDirAdj(); - } - } - - TextPageBlock cb1 = buildTextBlock(chunkWords); - if (cb1 != null) { - chunkBlockList1.add(cb1); - } - - return new ClassificationPage(chunkBlockList1); - } - - - private boolean equalsWithThreshold(float f1, float f2) { - - return Math.abs(f1 - f2) < THRESHOLD; - } - - - private TextPageBlock buildTextBlock(List wordBlockList) { - - TextPageBlock textBlock = null; - - FloatFrequencyCounter lineHeightFrequencyCounter = new FloatFrequencyCounter(); - FloatFrequencyCounter fontSizeFrequencyCounter = new FloatFrequencyCounter(); - FloatFrequencyCounter spaceFrequencyCounter = new FloatFrequencyCounter(); - StringFrequencyCounter fontFrequencyCounter = new StringFrequencyCounter(); - StringFrequencyCounter styleFrequencyCounter = new StringFrequencyCounter(); - - for (TextPositionSequence wordBlock : wordBlockList) { - - lineHeightFrequencyCounter.add(wordBlock.getTextHeight()); - fontSizeFrequencyCounter.add(wordBlock.getFontSize()); - spaceFrequencyCounter.add(wordBlock.getSpaceWidth()); - fontFrequencyCounter.add(wordBlock.getFont()); - styleFrequencyCounter.add(wordBlock.getFontStyle()); - - if (textBlock == null) { - textBlock = new TextPageBlock(wordBlock.getMinXDirAdj(), wordBlock.getMaxXDirAdj(), wordBlock.getMinYDirAdj(), wordBlock.getMaxYDirAdj(), wordBlockList, wordBlock.getRotation()); - } else { - TextPageBlock spatialEntity = textBlock.union(wordBlock); - textBlock.resize(spatialEntity.getMinX(), spatialEntity.getMinY(), spatialEntity.getWidth(), spatialEntity.getHeight()); - } - } - - if (textBlock != null) { - textBlock.setMostPopularWordFont(fontFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordStyle(styleFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordFontSize(fontSizeFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordHeight(lineHeightFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordSpaceWidth(spaceFrequencyCounter.getMostPopular()); - textBlock.setHighestFontSize(fontSizeFrequencyCounter.getHighest()); - } - - if (textBlock != null && textBlock.getSequences() != null && textBlock.getSequences().stream().map(t -> round(t.getMinYDirAdj(), 3)).collect(toSet()).size() == 1) { - textBlock.getSequences().sort(Comparator.comparing(TextPositionSequence::getMinXDirAdj)); - } - return textBlock; - } - - - private boolean isSplitByRuling(float minX, - float minY, - float maxX, - float maxY, - TextPositionSequence word, - List horizontalRulingLines, - List verticalRulingLines) { - - return isSplitByRuling(maxX, minY, word.getMinXDirAdj(), word.getMinYDirAdj(), verticalRulingLines, word.getDir().getDegrees(), word.getPageWidth(), word.getPageHeight()) // - || isSplitByRuling(minX, minY, word.getMinXDirAdj(), word.getMaxYDirAdj(), horizontalRulingLines, word.getDir().getDegrees(), word.getPageWidth(), word.getPageHeight()) // - || isSplitByRuling(maxX, minY, word.getMinXDirAdj(), word.getMinYDirAdj(), horizontalRulingLines, word.getDir().getDegrees(), word.getPageWidth(), word.getPageHeight()) // - || isSplitByRuling(minX, minY, word.getMinXDirAdj(), word.getMaxYDirAdj(), verticalRulingLines, word.getDir().getDegrees(), word.getPageWidth(), word.getPageHeight()); // - } - - - private boolean isSplitByRuling(float previousX2, float previousY1, float currentX1, float currentY1, List rulingLines, float dir, float pageWidth, float pageHeight) { - - for (Ruling ruling : rulingLines) { - var line = RulingTextDirAdjustUtil.convertToDirAdj(ruling, dir, pageWidth, pageHeight); - if (line.intersectsLine(previousX2, previousY1, currentX1, currentY1)) { - return true; - } - } - return false; - } - - - private double round(float value, int decimalPoints) { - - var d = Math.pow(10, decimalPoints); - return Math.round(value * d) / d; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineClassificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineClassificationService.java deleted file mode 100644 index b91d01fa..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineClassificationService.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.util.List; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.PositionUtils; -import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -@ConditionalOnProperty(prefix = "application", name = "type", havingValue = "DocuMine") -public class DocuMineClassificationService implements ClassificationService { - - private final BodyTextFrameService bodyTextFrameService; - - - public void classifyDocument(ClassificationDocument document) { - - Rectangle bodyTextFrame = bodyTextFrameService.calculateBodyTextFrame(document.getPages(), document.getFontSizeCounter(), false); - Rectangle landscapeBodyTextFrame = bodyTextFrameService.calculateBodyTextFrame(document.getPages(), document.getFontSizeCounter(), true); - - log.debug("Document FontSize counters are: {}", document.getFontSizeCounter().getCountPerValue()); - - for (ClassificationPage page : document.getPages()) { - bodyTextFrameService.setBodyTextFrameAdjustedToPage(page, bodyTextFrame, landscapeBodyTextFrame); - classifyPage(page, document); - } - } - - - private void classifyPage(ClassificationPage page, ClassificationDocument document) { - - for (AbstractPageBlock textBlock : page.getTextBlocks()) { - if (textBlock instanceof TextPageBlock) { - classifyBlock((TextPageBlock) textBlock, page, document); - } - } - } - - - private void classifyBlock(TextPageBlock textBlock, ClassificationPage page, ClassificationDocument document) { - - var bodyTextFrame = page.getBodyTextFrame(); - - var pattern = Patterns.getCompiledPattern("^(\\d{1,2}\\.){1,3}\\d{1,2}\\.?\\s[0-9A-Za-z \\[\\]]{2,50}", true); - var pattern2 = Patterns.getCompiledPattern("\\p{L}{3,}", true); - var pattern3 = Patterns.getCompiledPattern("^(\\d{1,1}\\.){1,3}\\d{1,2}\\.?\\s[a-z]{1,2}\\/[a-z]{1,2}.*", false); - - Matcher matcher = pattern.matcher(textBlock.toString()); - Matcher matcher2 = pattern2.matcher(textBlock.toString()); - Matcher matcher3 = pattern3.matcher(textBlock.toString()); - - if (document.getFontSizeCounter().getMostPopular() == null) { - textBlock.setClassification(PageBlockType.OTHER); - return; - } - if (PositionUtils.isOverBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() - .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { - textBlock.setClassification(PageBlockType.HEADER); - - } else if (PositionUtils.isUnderBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() - .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { - textBlock.setClassification(PageBlockType.FOOTER); - } else if (page.getPageNumber() == 1 && (PositionUtils.getHeightDifferenceBetweenChunkWordAndDocumentWord(textBlock, - document.getTextHeightCounter().getMostPopular()) > 2.5 && textBlock.getHighestFontSize() > document.getFontSizeCounter().getMostPopular() || page.getTextBlocks() - .size() == 1)) { - if (!Pattern.matches("[0-9]+", textBlock.toString())) { - textBlock.setClassification(PageBlockType.TITLE); - } - } else if (textBlock.getText().length() > 5 && (textBlock.getMostPopularWordHeight() > document.getTextHeightCounter() - .getMostPopular() || textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter().getMostPopular()) && PositionUtils.getApproxLineCount(textBlock) < 5.9 - - && (textBlock.getMostPopularWordStyle().contains("bold") && Character.isDigit(textBlock.toString().charAt(0)) && !matcher2.matches() && !textBlock.toString() - .contains(":") || textBlock.toString().equals(textBlock.toString().toUpperCase(Locale.ROOT)) && !matcher2.matches() && !textBlock.toString() - .contains(":") || textBlock.toString().startsWith("APPENDIX") || textBlock.toString().startsWith("FIGURE") || textBlock.toString() - .startsWith("TABLE")) && !textBlock.toString().endsWith(":") && matcher2.find()) { - textBlock.setClassification(PageBlockType.getHeadlineType(1)); - document.setHeadlines(true); - - } else if (matcher.find() && PositionUtils.getApproxLineCount(textBlock) < 2.9 && matcher2.find() && !matcher3.matches()) { - textBlock.setClassification(PageBlockType.getHeadlineType(2)); - document.setHeadlines(true); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("bold") && !document.getFontStyleCounter().getMostPopular().equals("bold")) { - textBlock.setClassification(PageBlockType.PARAGRAPH_BOLD); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFont() - .equals(document.getFontCounter().getMostPopular()) && textBlock.getMostPopularWordStyle() - .equals(document.getFontStyleCounter().getMostPopular()) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter().getMostPopular()) { - textBlock.setClassification(PageBlockType.PARAGRAPH); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("italic") && !document.getFontStyleCounter() - .getMostPopular() - .equals("italic") && PositionUtils.getApproxLineCount(textBlock) < 2.9) { - textBlock.setClassification(PageBlockType.PARAGRAPH_ITALIC); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock)) { - textBlock.setClassification(PageBlockType.PARAGRAPH_UNKNOWN); - } else { - textBlock.setClassification(PageBlockType.OTHER); - } - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/LineDetectionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/LineDetectionService.java deleted file mode 100644 index 758b9890..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/LineDetectionService.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Rectangle2D; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.TextPositionSequenceComparator; - -import lombok.AllArgsConstructor; -import lombok.experimental.UtilityClass; - -@UtilityClass -public class LineDetectionService { - - private static final double X_GAP_FACTOR = 1; // multiplied with average text height, determines the minimum distance of gaps in lines - - - public static List> findLinesWithGaps(List textPositionSequences) { - - if (textPositionSequences.isEmpty()) { - return Collections.emptyList(); - } - - final double avgTextPositionHeight = textPositionSequences.stream().mapToDouble(TextPositionSequence::getHeight).average().orElseThrow(); - - Context context = Context.init(); - - List sortedTextPositionSequence = textPositionSequences.stream().sorted(new TextPositionSequenceComparator()).toList(); - - var previousTextPosition = sortedTextPositionSequence.get(0); - context.textPositionsToMerge.add(previousTextPosition); - for (TextPositionSequence currentTextPosition : sortedTextPositionSequence.subList(1, sortedTextPositionSequence.size())) { - if (isNewLine(currentTextPosition, previousTextPosition, avgTextPositionHeight) || isSplitByOrientation(currentTextPosition, previousTextPosition)) { - addBlockToLine(context); - startNewLine(currentTextPosition, context); - } else if (isXGap(currentTextPosition, previousTextPosition, avgTextPositionHeight)) { - addBlockToLine(context); - startNewBlock(currentTextPosition, context); - } else { - context.textPositionsToMerge.add(currentTextPosition); - } - previousTextPosition = currentTextPosition; - } - addBlockToLine(context); - return context.linesWithGaps; - } - - - private static boolean isXGap(TextPositionSequence currentTextPosition, TextPositionSequence previousTextPosition, double avgTextPositionHeight) { - - return Math.abs(previousTextPosition.getMaxXDirAdj() - currentTextPosition.getMinXDirAdj()) > (avgTextPositionHeight * X_GAP_FACTOR); - } - - - private static boolean isSplitByOrientation(TextPositionSequence currentTextPosition, TextPositionSequence previousTextPosition) { - - return !previousTextPosition.getDir().equals(currentTextPosition.getDir()); - } - - - private static boolean isNewLine(TextPositionSequence currentTextPosition, TextPositionSequence previousTextPosition, double avgTextPositionHeight) { - - return Math.abs(previousTextPosition.getMinYDirAdj() - currentTextPosition.getMinYDirAdj()) > avgTextPositionHeight; - } - - - private static void startNewBlock(TextPositionSequence currentTextPosition, Context context) { - - context.textPositionsToMerge = new LinkedList<>(); - context.textPositionsToMerge.add(currentTextPosition); - } - - - private static void addBlockToLine(Context context) { - - context.blocksInLine.add(textPositionBBox(context.textPositionsToMerge)); - } - - - private static void startNewLine(TextPositionSequence current, Context context) { - - context.blocksInLine = new LinkedList<>(); - startNewBlock(current, context); - context.linesWithGaps.add(context.blocksInLine); - } - - - private Rectangle2D textPositionBBox(List textPositionSequences) { - - return RectangleTransformations.rectangleBBox(textPositionSequences.stream().map(TextPositionSequence::getRectangle).toList()); - } - - - @AllArgsConstructor - private class Context { - - List> linesWithGaps; - List blocksInLine; - List textPositionsToMerge; - - - public static Context init() { - - List> initialLinesWithGaps = new LinkedList<>(); - List initialBlocksInLine = new LinkedList<>(); - initialLinesWithGaps.add(initialBlocksInLine); - return new Context(initialLinesWithGaps, initialBlocksInLine, new LinkedList<>()); - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/PdfSegmentationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/PdfSegmentationService.java deleted file mode 100644 index 94227fbc..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/PdfSegmentationService.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.io.MemoryUsageSetting; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.ImageServiceResponseAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.TableServiceResponseAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.PdfTableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.CleanRulings; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing.PDFLinesTextStripper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.FileUtils; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; -import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class PdfSegmentationService { - - private final RedactionServiceSettings redactionServiceSettings; - private final RulingCleaningService rulingCleaningService; - private final TableExtractionService tableExtractionService; - private final BlockificationService blockificationService; - private final ClassificationService classificationService; - private final SectionsBuilderService sectionsBuilderService; - private final ImageServiceResponseAdapter imageServiceResponseAdapter; - private final TableServiceResponseAdapter tableServiceResponseAdapter; - - @Value("${application.type:RedactManager}") - private String applicationType; - - - public ClassificationDocument parseDocument(String dossierId, - String fileId, - InputStream documentInputStream, - Map> pdfImages) throws IOException { - - PDDocument pdDocument = null; - File tempFile = null; - try { - Map> pdfTableCells = new HashMap<>(); - if (redactionServiceSettings.isCvTableParsingEnabled()) { - pdfTableCells = tableServiceResponseAdapter.convertTables(dossierId, fileId); - } - - tempFile = FileUtils.createTempFile("document", ".pdf"); - try (var fos = new FileOutputStream(tempFile)) { - IOUtils.copy(documentInputStream, fos); - - // initialize required variables - ClassificationDocument document = new ClassificationDocument(); - List pages = new ArrayList<>(); - - pdDocument = PDDocument.load(tempFile, MemoryUsageSetting.setupMixed(67108864L)); - pdDocument.setAllSecurityToBeRemoved(true); - long pageCount = pdDocument.getNumberOfPages(); - - for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++) { - processPage(pdfImages, pdDocument, pdfTableCells, document, pages, pageNumber); - } - - document.setPages(pages); - - classificationService.classifyDocument(document); - sectionsBuilderService.buildSections(document); - sectionsBuilderService.addImagesToSections(document); - - return document; - } - } finally { - if (pdDocument != null) { - pdDocument.close(); - } - - FileUtils.deleteFile(tempFile); - } - } - - - private void processPage(Map> pdfImages, - PDDocument pdDocument, - Map> pdfTableCells, - ClassificationDocument document, - List pages, - int pageNumber) throws IOException { - - PDFLinesTextStripper stripper = new PDFLinesTextStripper(); - PDPage pdPage = pdDocument.getPage(pageNumber - 1); - stripper.setPageNumber(pageNumber); - stripper.setStartPage(pageNumber); - stripper.setEndPage(pageNumber); - stripper.setPdpage(pdPage); - - if(applicationType.equals("DocuMine")){ - stripper.setSortByPosition(true); - } - - stripper.getText(pdDocument); - - PDRectangle pdr = pdPage.getMediaBox(); - - int rotation = pdPage.getRotation(); - boolean isLandscape = pdr.getWidth() > pdr.getHeight() && (rotation == 0 || rotation == 180) || pdr.getHeight() > pdr.getWidth() && (rotation == 90 || rotation == 270); - - PDRectangle cropbox = pdPage.getCropBox(); - CleanRulings cleanRulings = rulingCleaningService.getCleanRulings(pdfTableCells.get(pageNumber), - stripper.getRulings(), - stripper.getMinCharWidth(), - stripper.getMaxCharHeight()); - // var columns = ColumnDetectionService.detectColumns(stripper.getTextPositionSequences(), RectangleTransformations.toRectangle2D(pdPage.getCropBox())); - ClassificationPage page = blockificationService.blockify(stripper.getTextPositionSequences(), cleanRulings.getHorizontal(), cleanRulings.getVertical()); - - page.setRotation(rotation); - page.setLandscape(isLandscape); - page.setPageNumber(pageNumber); - page.setPageWidth(cropbox.getWidth()); - page.setPageHeight(cropbox.getHeight()); - - // If images is ocr needs to be calculated before textBlocks are moved into tables, otherwise findOcr algorithm needs to be adopted. - if (pdfImages != null && pdfImages.containsKey(pageNumber)) { - page.setImages(pdfImages.get(pageNumber)); - imageServiceResponseAdapter.findOcr(page); - } - - tableExtractionService.extractTables(cleanRulings, page); - buildPageStatistics(page); - increaseDocumentStatistics(page, document); - - pages.add(page); - } - - - private void increaseDocumentStatistics(ClassificationPage page, ClassificationDocument document) { - - if (!page.isLandscape()) { - document.getFontSizeCounter().addAll(page.getFontSizeCounter().getCountPerValue()); - } - document.getFontCounter().addAll(page.getFontCounter().getCountPerValue()); - document.getTextHeightCounter().addAll(page.getTextHeightCounter().getCountPerValue()); - document.getFontStyleCounter().addAll(page.getFontStyleCounter().getCountPerValue()); - } - - - private void buildPageStatistics(ClassificationPage page) { - - // Collect all statistics for the page, except from blocks inside tables, as tables will always be added to BodyTextFrame. - for (AbstractPageBlock textBlock : page.getTextBlocks()) { - if (textBlock instanceof TextPageBlock) { - if (((TextPageBlock) textBlock).getSequences() == null) { - continue; - } - for (TextPositionSequence word : ((TextPageBlock) textBlock).getSequences()) { - page.getTextHeightCounter().add(word.getTextHeight()); - page.getFontCounter().add(word.getFont()); - page.getFontSizeCounter().add(word.getFontSize()); - page.getFontStyleCounter().add(word.getFontStyle()); - } - } - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerBlockificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerBlockificationService.java deleted file mode 100644 index 5c4fcf1c..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerBlockificationService.java +++ /dev/null @@ -1,280 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import static java.util.stream.Collectors.toSet; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.FloatFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.Orientation; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.RulingTextDirAdjustUtil; - -@Service -@SuppressWarnings("all") -@ConditionalOnProperty(prefix = "application", name = "type", havingValue = "RedactManager") -public class RedactManagerBlockificationService implements BlockificationService { - - static final float THRESHOLD = 1f; - - - /** - * This method is building blocks by expanding the minX/maxX and minY/maxY value on each word that is not split by the conditions. - * This method must use text direction adjusted postions (DirAdj). Where {0,0} is on the upper left. Never try to change this! - * Rulings (TablePageBlock lines) must be adjusted to the text directions as well, when checking if a block is split by a ruling. - * - * @param textPositions The words of a page. - * @param horizontalRulingLines Horizontal table lines. - * @param verticalRulingLines Vertical table lines. - * @return Page object that contains the Textblock and text statistics. - */ - public ClassificationPage blockify(List textPositions, List horizontalRulingLines, List verticalRulingLines) { - - int indexOnPage = 0; - List chunkWords = new ArrayList<>(); - List chunkBlockList = new ArrayList<>(); - - float minX = 1000, maxX = 0, minY = 1000, maxY = 0; - TextPositionSequence prev = null; - - boolean wasSplitted = false; - Float splitX1 = null; - for (TextPositionSequence word : textPositions) { - - boolean lineSeparation = word.getMinYDirAdj() - maxY > word.getHeight() * 1.25; - boolean startFromTop = prev != null && word.getMinYDirAdj() < prev.getMinYDirAdj() - prev.getTextHeight(); - boolean splitByX = prev != null && maxX + 50 < word.getMinXDirAdj() && prev.getMinYDirAdj() == word.getMinYDirAdj(); - boolean xIsBeforeFirstX = prev != null && word.getMinXDirAdj() < minX; - boolean newLineAfterSplit = prev != null && word.getMinYDirAdj() != prev.getMinYDirAdj() && wasSplitted && splitX1 != word.getMinXDirAdj(); - boolean isSplitByRuling = isSplitByRuling(minX, minY, maxX, maxY, word, horizontalRulingLines, verticalRulingLines); - boolean splitByDir = prev != null && !prev.getDir().equals(word.getDir()); - - if (prev != null && (lineSeparation || startFromTop || splitByX || splitByDir || isSplitByRuling)) { - - Orientation prevOrientation = null; - if (!chunkBlockList.isEmpty()) { - prevOrientation = chunkBlockList.get(chunkBlockList.size() - 1).getOrientation(); - } - - TextPageBlock cb1 = buildTextBlock(chunkWords, indexOnPage); - indexOnPage++; - - chunkBlockList.add(cb1); - chunkWords = new ArrayList<>(); - - if (splitByX && !isSplitByRuling) { - wasSplitted = true; - cb1.setOrientation(Orientation.LEFT); - splitX1 = word.getMinXDirAdj(); - } else if (newLineAfterSplit && !isSplitByRuling) { - wasSplitted = false; - cb1.setOrientation(Orientation.RIGHT); - splitX1 = null; - } else if (prevOrientation != null && prevOrientation.equals(Orientation.RIGHT) && (lineSeparation || !startFromTop || !splitByX || !newLineAfterSplit || !isSplitByRuling)) { - cb1.setOrientation(Orientation.LEFT); - } - - minX = 1000; - maxX = 0; - minY = 1000; - maxY = 0; - prev = null; - } - - chunkWords.add(word); - - prev = word; - if (word.getMinXDirAdj() < minX) { - minX = word.getMinXDirAdj(); - } - if (word.getMaxXDirAdj() > maxX) { - maxX = word.getMaxXDirAdj(); - } - if (word.getMinYDirAdj() < minY) { - minY = word.getMinYDirAdj(); - } - if (word.getMaxYDirAdj() > maxY) { - maxY = word.getMaxYDirAdj(); - } - } - - TextPageBlock cb1 = buildTextBlock(chunkWords, indexOnPage); - if (cb1 != null) { - chunkBlockList.add(cb1); - } - - Iterator itty = chunkBlockList.iterator(); - - TextPageBlock previousLeft = null; - TextPageBlock previousRight = null; - while (itty.hasNext()) { - TextPageBlock block = (TextPageBlock) itty.next(); - - if (previousLeft != null && block.getOrientation().equals(Orientation.LEFT)) { - if (previousLeft.getMinY() > block.getMinY() && block.getMaxY() + block.getMostPopularWordHeight() > previousLeft.getMinY()) { - previousLeft.add(block); - itty.remove(); - continue; - } - } - - if (previousRight != null && block.getOrientation().equals(Orientation.RIGHT)) { - if (previousRight.getMinY() > block.getMinY() && block.getMaxY() + block.getMostPopularWordHeight() > previousRight.getMinY()) { - previousRight.add(block); - itty.remove(); - continue; - } - } - - if (block.getOrientation().equals(Orientation.LEFT)) { - previousLeft = block; - } else if (block.getOrientation().equals(Orientation.RIGHT)) { - previousRight = block; - } - } - - itty = chunkBlockList.iterator(); - TextPageBlock previous = null; - while (itty.hasNext()) { - TextPageBlock block = (TextPageBlock) itty.next(); - - if (previous != null && previous.getOrientation().equals(Orientation.LEFT) && block.getOrientation().equals(Orientation.LEFT) && equalsWithThreshold(block.getMaxY(), - previous.getMaxY()) || previous != null && previous.getOrientation().equals(Orientation.LEFT) && block.getOrientation() - .equals(Orientation.RIGHT) && equalsWithThreshold(block.getMaxY(), previous.getMaxY())) { - previous.add(block); - itty.remove(); - continue; - } - - previous = block; - } - - return new ClassificationPage(chunkBlockList); - } - - - private boolean equalsWithThreshold(float f1, float f2) { - - return Math.abs(f1 - f2) < THRESHOLD; - } - - - private TextPageBlock buildTextBlock(List wordBlockList, int indexOnPage) { - - TextPageBlock textBlock = null; - - FloatFrequencyCounter lineHeightFrequencyCounter = new FloatFrequencyCounter(); - FloatFrequencyCounter fontSizeFrequencyCounter = new FloatFrequencyCounter(); - FloatFrequencyCounter spaceFrequencyCounter = new FloatFrequencyCounter(); - StringFrequencyCounter fontFrequencyCounter = new StringFrequencyCounter(); - StringFrequencyCounter styleFrequencyCounter = new StringFrequencyCounter(); - - for (TextPositionSequence wordBlock : wordBlockList) { - - lineHeightFrequencyCounter.add(wordBlock.getTextHeight()); - fontSizeFrequencyCounter.add(wordBlock.getFontSize()); - spaceFrequencyCounter.add(wordBlock.getSpaceWidth()); - fontFrequencyCounter.add(wordBlock.getFont()); - styleFrequencyCounter.add(wordBlock.getFontStyle()); - - if (textBlock == null) { - textBlock = new TextPageBlock(wordBlock.getMinXDirAdj(), - wordBlock.getMaxXDirAdj(), - wordBlock.getMinYDirAdj(), - wordBlock.getMaxYDirAdj(), - wordBlockList, - wordBlock.getRotation()); - } else { - TextPageBlock spatialEntity = textBlock.union(wordBlock); - textBlock.resize(spatialEntity.getMinX(), spatialEntity.getMinY(), spatialEntity.getWidth(), spatialEntity.getHeight()); - } - } - - if (textBlock != null) { - textBlock.setMostPopularWordFont(fontFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordStyle(styleFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordFontSize(fontSizeFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordHeight(lineHeightFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordSpaceWidth(spaceFrequencyCounter.getMostPopular()); - textBlock.setHighestFontSize(fontSizeFrequencyCounter.getHighest()); - } - - if (textBlock != null && textBlock.getSequences() != null && textBlock.getSequences().stream().map(t -> round(t.getMinYDirAdj(), 3)).collect(toSet()).size() == 1) { - textBlock.getSequences().sort(Comparator.comparing(TextPositionSequence::getMinXDirAdj)); - } - return textBlock; - } - - - private boolean isSplitByRuling(float minX, - float minY, - float maxX, - float maxY, - TextPositionSequence word, - List horizontalRulingLines, - List verticalRulingLines) { - - return isSplitByRuling(maxX, - minY, - word.getMinXDirAdj(), - word.getMinYDirAdj(), - verticalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()) // - || isSplitByRuling(minX, - minY, - word.getMinXDirAdj(), - word.getMaxYDirAdj(), - horizontalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()) // - || isSplitByRuling(maxX, - minY, - word.getMinXDirAdj(), - word.getMinYDirAdj(), - horizontalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()) // - || isSplitByRuling(minX, - minY, - word.getMinXDirAdj(), - word.getMaxYDirAdj(), - verticalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()); - } - - - private boolean isSplitByRuling(float previousX2, float previousY1, float currentX1, float currentY1, List rulingLines, float dir, float pageWidth, float pageHeight) { - - for (Ruling ruling : rulingLines) { - var line = RulingTextDirAdjustUtil.convertToDirAdj(ruling, dir, pageWidth, pageHeight); - if (line.intersectsLine(previousX2, previousY1, currentX1, currentY1)) { - return true; - } - } - return false; - } - - - private double round(float value, int decimalPoints) { - - var d = Math.pow(10, decimalPoints); - return Math.round(value * d) / d; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerClassificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerClassificationService.java deleted file mode 100644 index 6cb84e36..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerClassificationService.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.util.List; -import java.util.regex.Pattern; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.PositionUtils; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -@ConditionalOnProperty(prefix = "application", name = "type", havingValue = "RedactManager") -public class RedactManagerClassificationService implements ClassificationService { - - private final BodyTextFrameService bodyTextFrameService; - - - public void classifyDocument(ClassificationDocument document) { - - Rectangle bodyTextFrame = bodyTextFrameService.calculateBodyTextFrame(document.getPages(), document.getFontSizeCounter(), false); - Rectangle landscapeBodyTextFrame = bodyTextFrameService.calculateBodyTextFrame(document.getPages(), document.getFontSizeCounter(), true); - List headlineFontSizes = document.getFontSizeCounter().getHighterThanMostPopular(); - - log.debug("Document FontSize counters are: {}", document.getFontSizeCounter().getCountPerValue()); - - for (ClassificationPage page : document.getPages()) { - bodyTextFrameService.setBodyTextFrameAdjustedToPage(page, bodyTextFrame, landscapeBodyTextFrame); - classifyPage(page, document, headlineFontSizes); - } - } - - - private void classifyPage(ClassificationPage page, ClassificationDocument document, List headlineFontSizes) { - - for (AbstractPageBlock textBlock : page.getTextBlocks()) { - if (textBlock instanceof TextPageBlock) { - classifyBlock((TextPageBlock) textBlock, page, document, headlineFontSizes); - } - } - } - - - private void classifyBlock(TextPageBlock textBlock, ClassificationPage page, ClassificationDocument document, List headlineFontSizes) { - - var bodyTextFrame = page.getBodyTextFrame(); - - if (document.getFontSizeCounter().getMostPopular() == null) { - textBlock.setClassification(PageBlockType.OTHER); - return; - } - if (PositionUtils.isOverBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() - .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { - textBlock.setClassification(PageBlockType.HEADER); - - } else if (PositionUtils.isUnderBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() - .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { - textBlock.setClassification(PageBlockType.FOOTER); - } else if (page.getPageNumber() == 1 && (PositionUtils.getHeightDifferenceBetweenChunkWordAndDocumentWord(textBlock, - document.getTextHeightCounter().getMostPopular()) > 2.5 && textBlock.getHighestFontSize() > document.getFontSizeCounter().getMostPopular() || page.getTextBlocks() - .size() == 1)) { - if (!Pattern.matches("[0-9]+", textBlock.toString())) { - textBlock.setClassification(PageBlockType.TITLE); - } - } else if (textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter() - .getMostPopular() && PositionUtils.getApproxLineCount(textBlock) < 4.9 && (textBlock.getMostPopularWordStyle().equals("bold") || !document.getFontStyleCounter() - .getCountPerValue() - .containsKey("bold") && textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter().getMostPopular() + 1) && textBlock.getSequences() - .get(0) - .getTextPositions() - .get(0) - .getFontSizeInPt() >= textBlock.getMostPopularWordFontSize()) { - - for (int i = 1; i <= headlineFontSizes.size(); i++) { - if (textBlock.getMostPopularWordFontSize() == headlineFontSizes.get(i - 1)) { - textBlock.setClassification(PageBlockType.getHeadlineType(i)); - document.setHeadlines(true); - } - } - } else if (!textBlock.getText().startsWith("Figure ") && PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordStyle() - .equals("bold") && !document.getFontStyleCounter().getMostPopular().equals("bold") && PositionUtils.getApproxLineCount(textBlock) < 2.9 && textBlock.getSequences() - .get(0) - .getTextPositions() - .get(0) - .getFontSizeInPt() >= textBlock.getMostPopularWordFontSize()) { - textBlock.setClassification(PageBlockType.getHeadlineType(headlineFontSizes.size() + 1)); - document.setHeadlines(true); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("bold") && !document.getFontStyleCounter().getMostPopular().equals("bold")) { - textBlock.setClassification(PageBlockType.PARAGRAPH_BOLD); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFont() - .equals(document.getFontCounter().getMostPopular()) && textBlock.getMostPopularWordStyle() - .equals(document.getFontStyleCounter().getMostPopular()) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter().getMostPopular()) { - textBlock.setClassification(PageBlockType.PARAGRAPH); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("italic") && !document.getFontStyleCounter() - .getMostPopular() - .equals("italic") && PositionUtils.getApproxLineCount(textBlock) < 2.9) { - textBlock.setClassification(PageBlockType.PARAGRAPH_ITALIC); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock)) { - textBlock.setClassification(PageBlockType.PARAGRAPH_UNKNOWN); - } else { - textBlock.setClassification(PageBlockType.OTHER); - } - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RulingCleaningService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RulingCleaningService.java deleted file mode 100644 index 25f88849..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RulingCleaningService.java +++ /dev/null @@ -1,235 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.PdfTableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.CleanRulings; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.Utils; -import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class RulingCleaningService { - - private final RedactionServiceSettings redactionServiceSettings; - - - public CleanRulings getCleanRulings(List pdfTableCells, List rulings, float minCharWidth, float maxCharHeight) { - - if (!rulings.isEmpty()) { - snapPoints(rulings, minCharWidth, maxCharHeight); - } - - List vrs = new ArrayList<>(); - for (Ruling vr : rulings) { - if (vr.vertical()) { - vrs.add(vr); - } - } - if (vrs.isEmpty() && redactionServiceSettings.isCvTableParsingEnabled()) { - vrs.addAll(extractVerticalRulings(pdfTableCells)); - } - List verticalRulingLines = collapseOrientedRulings(vrs); - - List hrs = new ArrayList<>(); - for (Ruling hr : rulings) { - if (hr.horizontal()) { - hrs.add(hr); - } - } - if (hrs.isEmpty() && redactionServiceSettings.isCvTableParsingEnabled()) { - hrs.addAll(extractHorizontalRulings(pdfTableCells)); - } - List horizontalRulingLines = collapseOrientedRulings(hrs); - - return CleanRulings.builder().vertical(verticalRulingLines).horizontal(horizontalRulingLines).build(); - } - - - public void snapPoints(List rulings, float xThreshold, float yThreshold) { - - // collect points and keep a Line -> p1,p2 map - Map linesToPoints = new HashMap<>(); - List points = new ArrayList<>(); - for (Line2D.Float r : rulings) { - Point2D p1 = r.getP1(); - Point2D p2 = r.getP2(); - linesToPoints.put(r, new Point2D[]{p1, p2}); - points.add(p1); - points.add(p2); - } - - // snap by X - points.sort(Comparator.comparingDouble(Point2D::getX)); - - List> groupedPoints = new ArrayList<>(); - groupedPoints.add(new ArrayList<>(Collections.singletonList(points.get(0)))); - - for (Point2D p : points.subList(1, points.size() - 1)) { - List last = groupedPoints.get(groupedPoints.size() - 1); - if (Math.abs(p.getX() - last.get(0).getX()) < xThreshold) { - groupedPoints.get(groupedPoints.size() - 1).add(p); - } else { - groupedPoints.add(new ArrayList<>(Collections.singletonList(p))); - } - } - - for (List group : groupedPoints) { - float avgLoc = 0; - for (Point2D p : group) { - avgLoc += p.getX(); - } - avgLoc /= group.size(); - for (Point2D p : group) { - p.setLocation(avgLoc, p.getY()); - } - } - // --- - - // snap by Y - points.sort(Comparator.comparingDouble(Point2D::getY)); - - groupedPoints = new ArrayList<>(); - groupedPoints.add(new ArrayList<>(Collections.singletonList(points.get(0)))); - - for (Point2D p : points.subList(1, points.size() - 1)) { - List last = groupedPoints.get(groupedPoints.size() - 1); - if (Math.abs(p.getY() - last.get(0).getY()) < yThreshold) { - groupedPoints.get(groupedPoints.size() - 1).add(p); - } else { - groupedPoints.add(new ArrayList<>(Collections.singletonList(p))); - } - } - - for (List group : groupedPoints) { - float avgLoc = 0; - for (Point2D p : group) { - avgLoc += p.getY(); - } - avgLoc /= group.size(); - for (Point2D p : group) { - p.setLocation(p.getX(), avgLoc); - } - } - // --- - - // finally, modify lines - for (Map.Entry ltp : linesToPoints.entrySet()) { - Point2D[] p = ltp.getValue(); - ltp.getKey().setLine(p[0], p[1]); - } - } - - - private Collection extractVerticalRulings(List pdfTableCells) { - - List vrs = new ArrayList<>(); - - if (pdfTableCells != null) { - for (PdfTableCell pdfTableCell : pdfTableCells) { - Ruling leftLine = createRuling(pdfTableCell.getX0(), pdfTableCell.getX0(), pdfTableCell.getY0(), pdfTableCell.getY1()); - Ruling rightLine = createRuling(pdfTableCell.getX1(), pdfTableCell.getX1(), pdfTableCell.getY0(), pdfTableCell.getY1()); - vrs.add(leftLine); - vrs.add(rightLine); - } - } - return vrs; - } - - - private Collection extractHorizontalRulings(List pdfTableCells) { - - List hrs = new ArrayList<>(); - - if (pdfTableCells != null) { - for (PdfTableCell pdfTableCell : pdfTableCells) { - Ruling topLine = createRuling(pdfTableCell.getX0(), pdfTableCell.getX1(), pdfTableCell.getY1(), pdfTableCell.getY1()); - Ruling baseLine = createRuling(pdfTableCell.getX0(), pdfTableCell.getX1(), pdfTableCell.getY0(), pdfTableCell.getY0()); - hrs.add(topLine); - hrs.add(baseLine); - } - } - - return hrs; - } - - - private Ruling createRuling(float tableCellX0, float tableCellX1, float tableCellY0, float tableCellY1) { - - float x0 = tableCellX0; - float x1 = tableCellX1; - float y0 = tableCellY0; - float y1 = tableCellY1; - - if (x1 < x0) { - x0 = tableCellX1; - x1 = tableCellX0; - } - - if (y1 < y0) { - y0 = tableCellY1; - y1 = tableCellY0; - } - - return new Ruling(new Point2D.Float(x0, y0), new Point2D.Float(x1, y1)); - } - - - private List collapseOrientedRulings(List lines) { - - int COLINEAR_OR_PARALLEL_PIXEL_EXPAND_AMOUNT = 1; - return collapseOrientedRulings(lines, COLINEAR_OR_PARALLEL_PIXEL_EXPAND_AMOUNT); - } - - - private List collapseOrientedRulings(List lines, int expandAmount) { - - ArrayList rv = new ArrayList<>(); - lines.sort((a, b) -> { - final float diff = a.getPosition() - b.getPosition(); - return Float.compare(diff == 0 ? a.getStart() - b.getStart() : diff, 0f); - }); - - for (Ruling next_line : lines) { - Ruling last = rv.isEmpty() ? null : rv.get(rv.size() - 1); - // if current line colinear with next, and are "close enough": expand current line - if (last != null && Utils.feq(next_line.getPosition(), last.getPosition()) && last.nearlyIntersects(next_line, expandAmount)) { - final float lastStart = last.getStart(); - final float lastEnd = last.getEnd(); - - final boolean lastFlipped = lastStart > lastEnd; - final boolean nextFlipped = next_line.getStart() > next_line.getEnd(); - - boolean differentDirections = nextFlipped != lastFlipped; - float nextS = differentDirections ? next_line.getEnd() : next_line.getStart(); - float nextE = differentDirections ? next_line.getStart() : next_line.getEnd(); - - final float newStart = lastFlipped ? Math.max(nextS, lastStart) : Math.min(nextS, lastStart); - final float newEnd = lastFlipped ? Math.min(nextE, lastEnd) : Math.max(nextE, lastEnd); - last.setStartEnd(newStart, newEnd); - assert !last.oblique(); - } else if (next_line.length() == 0) { - continue; - } else { - rv.add(next_line); - } - } - return rv; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/SectionsBuilderService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/SectionsBuilderService.java deleted file mode 100644 index 48b7ccbf..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/SectionsBuilderService.java +++ /dev/null @@ -1,304 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationFooter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationHeader; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationSection; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.UnclassifiedText; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -public class SectionsBuilderService { - - public void buildSections(ClassificationDocument document) { - - List chunkWords = new ArrayList<>(); - List chunkBlockList = new ArrayList<>(); - List headers = new ArrayList<>(); - List footers = new ArrayList<>(); - List unclassifiedTexts = new ArrayList<>(); - - AbstractPageBlock prev = null; - - String lastHeadline = ""; - TablePageBlock previousTable = null; - for (ClassificationPage page : document.getPages()) { - List header = new ArrayList<>(); - List footer = new ArrayList<>(); - List unclassifiedText = new ArrayList<>(); - for (AbstractPageBlock current : page.getTextBlocks()) { - - if (current.getClassification() == null) { - continue; - } - - current.setPage(page.getPageNumber()); - - if (current.getClassification().equals(PageBlockType.HEADER)) { - header.add((TextPageBlock) current); - continue; - } - - if (current.getClassification().equals(PageBlockType.FOOTER)) { - footer.add((TextPageBlock) current); - continue; - } - - if (current.getClassification().equals(PageBlockType.OTHER)) { - unclassifiedText.add((TextPageBlock) current); - continue; - } - - if (prev != null && current.getClassification().isHeadline() && !prev.getClassification().isHeadline() || !document.isHeadlines()) { - ClassificationSection chunkBlock = buildTextBlock(chunkWords, lastHeadline); - chunkBlock.setHeadline(lastHeadline); - if (document.isHeadlines()) { - lastHeadline = current.getText(); - } - chunkBlockList.add(chunkBlock); - chunkWords = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(chunkBlock.getTables())) { - previousTable = chunkBlock.getTables().get(chunkBlock.getTables().size() - 1); - } - } - if (current instanceof TablePageBlock table) { - // Distribute header information for subsequent tables - mergeTableMetadata(table, previousTable); - previousTable = table; - } - chunkWords.add(current); - prev = current; - } - - if (!header.isEmpty()) { - headers.add(new ClassificationHeader(header)); - } - if (!footer.isEmpty()) { - footers.add(new ClassificationFooter(footer)); - } - if (!unclassifiedText.isEmpty()) { - unclassifiedTexts.add(new UnclassifiedText(unclassifiedText)); - } - } - - ClassificationSection chunkBlock = buildTextBlock(chunkWords, lastHeadline); - chunkBlock.setHeadline(lastHeadline); - chunkBlockList.add(chunkBlock); - - document.setSections(chunkBlockList); - document.setHeaders(headers); - document.setFooters(footers); - document.setUnclassifiedTexts(unclassifiedTexts); - } - - - public void addImagesToSections(ClassificationDocument document) { - - Map> sectionMap = new HashMap<>(); - for (ClassificationSection section : document.getSections()) { - for (AbstractPageBlock container : section.getPageBlocks()) { - - List sectionsOnPage = sectionMap.computeIfAbsent(container.getPage(), c -> new ArrayList<>()); - if (sectionsOnPage.contains(section)) { - continue; - } - sectionsOnPage.add(section); - } - } - - if (sectionMap.isEmpty()) { - ClassificationSection section = new ClassificationSection(); - document.getSections().add(section); - sectionMap.computeIfAbsent(1, x -> new ArrayList<>()).add(section); - } - - // first page is always a paragraph, else we can't process pages 1..N, - // where N is the first found page with a paragraph - if (sectionMap.get(1) == null) { - ClassificationSection section = new ClassificationSection(); - document.getSections().add(section); - sectionMap.computeIfAbsent(1, x -> new ArrayList<>()).add(section); - } - - for (ClassificationPage page : document.getPages()) { - for (ClassifiedImage image : page.getImages()) { - List sectionsOnPage = sectionMap.get(page.getPageNumber()); - if (sectionsOnPage == null) { - int i = page.getPageNumber(); - while (sectionsOnPage == null) { - sectionsOnPage = sectionMap.get(i); - i--; - } - } - for (ClassificationSection section : sectionsOnPage) { - Float xMin = null; - Float yMin = null; - Float xMax = null; - Float yMax = null; - - for (AbstractPageBlock abs : section.getPageBlocks()) { - if (abs.getPage() != page.getPageNumber()) { - continue; - } - - if (abs.getMinX() < abs.getMaxX()) { - if (xMin == null || abs.getMinX() < xMin) { - xMin = abs.getMinX(); - } - if (xMax == null || abs.getMaxX() > xMax) { - xMax = abs.getMaxX(); - } - } else { - if (xMin == null || abs.getMaxX() < xMin) { - xMin = abs.getMaxX(); - } - if (xMax == null || abs.getMinX() > xMax) { - xMax = abs.getMinX(); - } - } - - if (abs.getMinY() < abs.getMaxY()) { - if (yMin == null || abs.getMinY() < yMin) { - yMin = abs.getMinY(); - } - if (yMax == null || abs.getMaxY() > yMax) { - yMax = abs.getMaxY(); - } - } else { - if (yMin == null || abs.getMaxY() < yMin) { - yMin = abs.getMaxY(); - } - if (yMax == null || abs.getMinY() > yMax) { - yMax = abs.getMinY(); - } - } - - } - - log.debug("Image position x: {}, y: {}", image.getPosition().getX(), image.getPosition().getY()); - log.debug("Paragraph position xMin: {}, xMax: {}, yMin: {}, yMax: {}", xMin, xMax, yMin, yMax); - - if (xMin != null && xMax != null && yMin != null && yMax != null && image.getPosition().getX() >= xMin && image.getPosition() - .getX() <= xMax && image.getPosition().getY() >= yMin && image.getPosition().getY() <= yMax) { - section.getImages().add(image); - image.setAppendedToSection(true); - } - } - if (!image.isAppendedToSection()) { - log.debug("Image uses first paragraph"); - sectionsOnPage.get(0).getImages().add(image); - image.setAppendedToSection(true); - } - } - } - } - - - private void mergeTableMetadata(TablePageBlock currentTable, TablePageBlock previousTable) { - - // Distribute header information for subsequent tables - if (previousTable != null && hasInvalidHeaderInformation(currentTable) && hasValidHeaderInformation(previousTable)) { - List previousTableNonHeaderRow = getRowWithNonHeaderCells(previousTable); - List tableNonHeaderRow = getRowWithNonHeaderCells(currentTable); - // Allow merging of tables if header row is separated from first logical non-header row - if (previousTableNonHeaderRow.isEmpty() && previousTable.getRowCount() == 1 && previousTable.getRows().get(0).size() == tableNonHeaderRow.size()) { - previousTableNonHeaderRow = previousTable.getRows().get(0).stream().map(cell -> { - Cell fakeCell = new Cell(cell.getPoints()[0], cell.getPoints()[2]); - fakeCell.setHeaderCells(Collections.singletonList(cell)); - return fakeCell; - }).collect(Collectors.toList()); - } - if (previousTableNonHeaderRow.size() == tableNonHeaderRow.size()) { - for (int i = currentTable.getRowCount() - 1; i >= 0; i--) { // Non header rows are most likely at bottom of table - List row = currentTable.getRows().get(i); - if (row.size() == tableNonHeaderRow.size() && row.stream().allMatch(cell -> cell.getHeaderCells().isEmpty())) { - for (int j = 0; j < row.size(); j++) { - row.get(j).setHeaderCells(previousTableNonHeaderRow.get(j).getHeaderCells()); - } - } - } - } - } - } - - - private ClassificationSection buildTextBlock(List wordBlockList, String lastHeadline) { - - ClassificationSection section = new ClassificationSection(); - - for (AbstractPageBlock container : wordBlockList) { - if (container instanceof TablePageBlock table) { - - if (lastHeadline == null || lastHeadline.isEmpty()) { - table.setHeadline("Text in table"); - } else { - table.setHeadline("TablePageBlock in: " + lastHeadline); - } - - section.getPageBlocks().add(table); - continue; - } - - TextPageBlock wordBlock = (TextPageBlock) container; - section.getPageBlocks().add(wordBlock); - } - return section; - } - - - private boolean hasValidHeaderInformation(TablePageBlock table) { - - return !hasInvalidHeaderInformation(table); - } - - - private boolean hasInvalidHeaderInformation(TablePageBlock table) { - - return table.getRows().stream().flatMap(row -> row.stream().filter(cell -> CollectionUtils.isNotEmpty(cell.getHeaderCells()))).findAny().isEmpty(); - - } - - - private List getRowWithNonHeaderCells(TablePageBlock table) { - - for (int i = table.getRowCount() - 1; i >= 0; i--) { // Non header rows are most likely at bottom of table - List row = table.getRows().get(i); - if (row.size() == 1) { - continue; - } - boolean allNonHeader = true; - for (Cell cell : row) { - if (cell.isHeaderCell()) { - allNonHeader = false; - break; - } - } - if (allNonHeader) { - return row; - } - } - - return Collections.emptyList(); - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/TableExtractionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/TableExtractionService.java deleted file mode 100644 index 7ab5e4dc..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/TableExtractionService.java +++ /dev/null @@ -1,337 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.CleanRulings; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.Utils; - -@Service -public class TableExtractionService { - - private static final Comparator X_FIRST_POINT_COMPARATOR = (arg0, arg1) -> { - - int rv = 0; - float arg0X = Utils.round(arg0.getX(), 2); - float arg0Y = Utils.round(arg0.getY(), 2); - float arg1X = Utils.round(arg1.getX(), 2); - float arg1Y = Utils.round(arg1.getY(), 2); - - if (arg0X > arg1X) { - rv = 1; - } else if (arg0X < arg1X) { - rv = -1; - } else if (arg0Y > arg1Y) { - rv = 1; - } else if (arg0Y < arg1Y) { - rv = -1; - } - return rv; - }; - private static final Comparator POINT_COMPARATOR = (arg0, arg1) -> { - - int rv = 0; - float arg0X = Utils.round(arg0.getX(), 2); - float arg0Y = Utils.round(arg0.getY(), 2); - float arg1X = Utils.round(arg1.getX(), 2); - float arg1Y = Utils.round(arg1.getY(), 2); - - if (arg0Y > arg1Y) { - rv = 1; - } else if (arg0Y < arg1Y) { - rv = -1; - } else if (arg0X > arg1X) { - rv = 1; - } else if (arg0X < arg1X) { - rv = -1; - } - return rv; - }; - - - /** - * Finds tables on a page and moves textblocks into cells of the found tables. - * Note: This algorithm uses Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - *

- * DirAdj (Text direction adjusted) values can not be used here. - * - * @param cleanRulings The lines used to build the table. - * @param page Page object that contains textblocks and statistics. - */ - public void extractTables(CleanRulings cleanRulings, ClassificationPage page) { - - List cells = findCells(cleanRulings.getHorizontal(), cleanRulings.getVertical()); - - List toBeRemoved = new ArrayList<>(); - - for (AbstractPageBlock abstractPageBlock : page.getTextBlocks()) { - TextPageBlock textBlock = (TextPageBlock) abstractPageBlock; - for (Cell cell : cells) { - if (cell.hasMinimumSize() && cell.intersects(textBlock.getPdfMinX(), - textBlock.getPdfMinY(), - textBlock.getPdfMaxX() - textBlock.getPdfMinX(), - textBlock.getPdfMaxY() - textBlock.getPdfMinY())) { - cell.addTextBlock(textBlock); - toBeRemoved.add(textBlock); - break; - } - } - } - - cells = new ArrayList<>(new HashSet<>(cells)); - Utils.sort(cells, Rectangle.ILL_DEFINED_ORDER); - - List spreadsheetAreas = findSpreadsheetsFromCells(cells).stream().filter(r -> r.getWidth() > 0f && r.getHeight() > 0f).collect(Collectors.toList()); - - List tables = new ArrayList<>(); - for (Rectangle area : spreadsheetAreas) { - - List overlappingCells = new ArrayList<>(); - for (Cell c : cells) { - if (c.hasMinimumSize() && c.intersects(area)) { - overlappingCells.add(c); - } - } - tables.add(new TablePageBlock(overlappingCells, area, page.getRotation())); - } - - for (TablePageBlock table : tables) { - int position = -1; - - Iterator itty = page.getTextBlocks().iterator(); - while (itty.hasNext()) { - AbstractPageBlock textBlock = itty.next(); - if (textBlock instanceof TextPageBlock ? table.containsBlock((TextPageBlock) textBlock) : table.contains(textBlock) && position == -1) { - position = page.getTextBlocks().indexOf(textBlock); - } - } - if (position != -1) { - page.getTextBlocks().add(position, table); - } - } - - page.getTextBlocks().removeAll(toBeRemoved); - } - - - public List findCells(List horizontalRulingLines, List verticalRulingLines) { - - List cellsFound = new ArrayList<>(); - Map intersectionPoints = Ruling.findIntersections(horizontalRulingLines, verticalRulingLines); - List intersectionPointsList = new ArrayList<>(intersectionPoints.keySet()); - intersectionPointsList.sort(POINT_COMPARATOR); - - for (int i = 0; i < intersectionPointsList.size(); i++) { - Point2D topLeft = intersectionPointsList.get(i); - Ruling[] hv = intersectionPoints.get(topLeft); - - // CrossingPointsDirectlyBelow( topLeft ); - List xPoints = new ArrayList<>(); - // CrossingPointsDirectlyToTheRight( topLeft ); - List yPoints = new ArrayList<>(); - - for (Point2D p : intersectionPointsList.subList(i, intersectionPointsList.size())) { - if (p.getX() == topLeft.getX() && p.getY() > topLeft.getY()) { - xPoints.add(p); - } - if (p.getY() == topLeft.getY() && p.getX() > topLeft.getX()) { - yPoints.add(p); - } - } - outer: - for (Point2D xPoint : xPoints) { - // is there a vertical edge b/w topLeft and xPoint? - if (!hv[1].equals(intersectionPoints.get(xPoint)[1])) { - continue; - } - for (Point2D yPoint : yPoints) { - // is there an horizontal edge b/w topLeft and yPoint ? - if (!hv[0].equals(intersectionPoints.get(yPoint)[0])) { - continue; - } - Point2D btmRight = new Point2D.Float((float) yPoint.getX(), (float) xPoint.getY()); - if (intersectionPoints.containsKey(btmRight) && intersectionPoints.get(btmRight)[0].equals(intersectionPoints.get(xPoint)[0]) && intersectionPoints.get(btmRight)[1].equals( - intersectionPoints.get(yPoint)[1])) { - cellsFound.add(new Cell(topLeft, btmRight)); - break outer; - } - } - } - } - - // TODO create cells for vertical ruling lines with aligned endpoints at the top/bottom of a grid - // that aren't connected with an horizontal ruler? - // see: https://github.com/jazzido/tabula-extractor/issues/78#issuecomment-41481207 - - return cellsFound; - } - - - private List findSpreadsheetsFromCells(List cells) { - // via: http://stackoverflow.com/questions/13746284/merging-multiple-adjacent-rectangles-into-one-polygon - List rectangles = new ArrayList<>(); - Set pointSet = new HashSet<>(); - Map edgesH = new HashMap<>(); - Map edgesV = new HashMap<>(); - int i = 0; - - for (Rectangle cell : cells) { - for (Point2D pt : cell.getPoints()) { - if (pointSet.contains(pt)) { // shared vertex, remove it - pointSet.remove(pt); - } else { - pointSet.add(pt); - } - } - } - - // X first sort - List pointsSortX = new ArrayList<>(pointSet); - pointsSortX.sort(X_FIRST_POINT_COMPARATOR); - // Y first sort - List pointsSortY = new ArrayList<>(pointSet); - pointsSortY.sort(POINT_COMPARATOR); - - while (i < pointSet.size()) { - float currY = (float) pointsSortY.get(i).getY(); - while (i < pointSet.size() && Utils.feq(pointsSortY.get(i).getY(), currY)) { - edgesH.put(pointsSortY.get(i), pointsSortY.get(i + 1)); - edgesH.put(pointsSortY.get(i + 1), pointsSortY.get(i)); - i += 2; - } - } - - i = 0; - while (i < pointSet.size()) { - float currX = (float) pointsSortX.get(i).getX(); - while (i < pointSet.size() && Utils.feq(pointsSortX.get(i).getX(), currX)) { - edgesV.put(pointsSortX.get(i), pointsSortX.get(i + 1)); - edgesV.put(pointsSortX.get(i + 1), pointsSortX.get(i)); - i += 2; - } - } - - // Get all the polygons - List> polygons = new ArrayList<>(); - Point2D nextVertex; - while (!edgesH.isEmpty()) { - ArrayList polygon = new ArrayList<>(); - Point2D first = edgesH.keySet().iterator().next(); - polygon.add(new PolygonVertex(first, Direction.HORIZONTAL)); - edgesH.remove(first); - - while (true) { - PolygonVertex curr = polygon.get(polygon.size() - 1); - PolygonVertex lastAddedVertex; - if (curr.direction == Direction.HORIZONTAL) { - nextVertex = edgesV.get(curr.point); - edgesV.remove(curr.point); - lastAddedVertex = new PolygonVertex(nextVertex, Direction.VERTICAL); - } else { - nextVertex = edgesH.get(curr.point); - edgesH.remove(curr.point); - lastAddedVertex = new PolygonVertex(nextVertex, Direction.HORIZONTAL); - } - polygon.add(lastAddedVertex); - - if (lastAddedVertex.equals(polygon.get(0))) { - // closed polygon - polygon.remove(polygon.size() - 1); - break; - } - } - - for (PolygonVertex vertex : polygon) { - edgesH.remove(vertex.point); - edgesV.remove(vertex.point); - } - polygons.add(polygon); - } - - // calculate grid-aligned minimum area rectangles for each found polygon - for (List poly : polygons) { - float top = Float.MAX_VALUE; - float left = Float.MAX_VALUE; - float bottom = Float.MIN_VALUE; - float right = Float.MIN_VALUE; - for (PolygonVertex pt : poly) { - top = (float) Math.min(top, pt.point.getY()); - left = (float) Math.min(left, pt.point.getX()); - bottom = (float) Math.max(bottom, pt.point.getY()); - right = (float) Math.max(right, pt.point.getX()); - } - rectangles.add(new Rectangle(top, left, right - left, bottom - top)); - } - - return rectangles; - } - - - private enum Direction { - HORIZONTAL, - VERTICAL - } - - static class PolygonVertex { - - Point2D point; - Direction direction; - - - PolygonVertex(Point2D point, Direction direction) { - - this.direction = direction; - this.point = point; - } - - - @Override - public boolean equals(Object other) { - - if (this == other) { - return true; - } - if (!(other instanceof PolygonVertex)) { - return false; - } - return this.point.equals(((PolygonVertex) other).point); - } - - - @Override - public int hashCode() { - - return this.point.hashCode(); - } - - - @Override - public String toString() { - - return String.format("%s[point=%s,direction=%s]", this.getClass().getName(), this.point.toString(), this.direction.toString()); - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/CohenSutherlandClipping.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/CohenSutherlandClipping.java deleted file mode 100644 index c39c6d6d..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/CohenSutherlandClipping.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * CohenSutherland.java - * -------------------- - * (c) 2007 by Intevation GmbH - * - * @author Sascha L. Teichmann (teichmann@intevation.de) - * @author Ludwig Reiter (ludwig@intevation.de) - * - * This program is free software under the LGPL (>=v2.1) - * Read the file LICENSE.txt coming with the sources for details. - */ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.awt.geom.Line2D; -import java.awt.geom.Rectangle2D; - -/** - * Implements the well known Cohen Sutherland line - * clipping algorithm (line against clip rectangle). - */ -@SuppressWarnings("all") -public final class CohenSutherlandClipping { - - private static final int INSIDE = 0; - private static final int LEFT = 1; - private static final int RIGHT = 2; - private static final int BOTTOM = 4; - private static final int TOP = 8; - private double xMin; - private double yMin; - private double xMax; - private double yMax; - - - /** - * Creates a Cohen Sutherland clipper with clip rect (0, 0, 0, 0). - */ - public CohenSutherlandClipping() { - - } - - - /** - * Creates a Cohen Sutherland clipper with the given clip rectangle. - * - * @param clip the clip rectangle to use - */ - public CohenSutherlandClipping(Rectangle2D clip) { - - setClip(clip); - } - - - /** - * Sets the clip rectangle. - * - * @param clip the clip rectangle - */ - public void setClip(Rectangle2D clip) { - - xMin = clip.getX(); - xMax = xMin + clip.getWidth(); - yMin = clip.getY(); - yMax = yMin + clip.getHeight(); - } - - - private final int regionCode(double x, double y) { - - int code = x < xMin ? LEFT : x > xMax ? RIGHT : INSIDE; - if (y < yMin) { - code |= BOTTOM; - } else if (y > yMax) { - code |= TOP; - } - return code; - } - - - /** - * Clips a given line against the clip rectangle. - * The modification (if needed) is done in place. - * - * @param line the line to clip - * @return true if line is clipped, false if line is - * totally outside the clip rect. - */ - public boolean clip(Line2D.Float line) { - - double p1x = line.getX1(); - double p1y = line.getY1(); - double p2x = line.getX2(); - double p2y = line.getY2(); - - double qx = 0d; - double qy = 0d; - - boolean vertical = p1x == p2x; - - double slope = vertical ? 0d : (p2y - p1y) / (p2x - p1x); - - int c1 = regionCode(p1x, p1y); - int c2 = regionCode(p2x, p2y); - - while (c1 != INSIDE || c2 != INSIDE) { - - if ((c1 & c2) != INSIDE) { - return false; - } - - int c = c1 == INSIDE ? c2 : c1; - - if ((c & LEFT) != INSIDE) { - qx = xMin; - qy = (Utils.feq(qx, p1x) ? 0 : qx - p1x) * slope + p1y; - } else if ((c & RIGHT) != INSIDE) { - qx = xMax; - qy = (Utils.feq(qx, p1x) ? 0 : qx - p1x) * slope + p1y; - } else if ((c & BOTTOM) != INSIDE) { - qy = yMin; - qx = vertical ? p1x : (Utils.feq(qy, p1y) ? 0 : qy - p1y) / slope + p1x; - } else if ((c & TOP) != INSIDE) { - qy = yMax; - qx = vertical ? p1x : (Utils.feq(qy, p1y) ? 0 : qy - p1y) / slope + p1x; - } - - if (c == c1) { - p1x = qx; - p1y = qy; - c1 = regionCode(p1x, p1y); - } else { - p2x = qx; - p2y = qy; - c2 = regionCode(p2x, p2y); - } - } - line.setLine(p1x, p1y, p2x, p2y); - return true; - } - -} -// end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/FileUtils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/FileUtils.java deleted file mode 100644 index b8da0292..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/FileUtils.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; - -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@UtilityClass -public class FileUtils { - - public File createTempFile(String filenamePrefix, String filenameSuffix) throws IOException { - - File tempFile = Files.createTempFile(filenamePrefix, filenameSuffix).toFile(); - setRWPermissionsOnlyForOwner(tempFile); - - return tempFile; - } - - - /** - * Deletes a file; logs a message with the reason if the deletion fails. - * This method is null-safe. - * - * @param file The file to delete. Can be null. - */ - public void deleteFile(File file) { - - if (file != null) { - try { - Files.deleteIfExists(file.toPath()); - } catch (IOException ex) { - log.warn("Could not delete file!", ex); - } - } - } - - - // We don't need to check the results of the permission setters below, - // since we're manipulating a file we created ourselves. - @SuppressWarnings({"ResultOfMethodCallIgnored", "squid:S899"}) - private void setRWPermissionsOnlyForOwner(File tempFile) { - - try { - tempFile.setReadable(true, true); - tempFile.setWritable(true, true); - tempFile.setExecutable(false); - } catch (SecurityException ex) { - // This should never happen since we're creating a temp file ourselves. - log.warn("Caught an exception during temp file creation. This should not happend. Check the code.", ex); - } - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/PositionUtils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/PositionUtils.java deleted file mode 100644 index 028b7e6c..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/PositionUtils.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.experimental.UtilityClass; - -@UtilityClass -@SuppressWarnings("all") -public final class PositionUtils { - - // TODO This currently uses pdf coord system. In the futher this should use java coord system. - // Note: DirAdj (TextDirection Adjusted) can not be user for this. - public boolean isWithinBodyTextFrame(Rectangle btf, TextPageBlock textBlock) { - - if (btf == null || textBlock == null) { - return false; - } - - double threshold = textBlock.getMostPopularWordHeight() * 3; - - if (textBlock.getPdfMinX() + threshold > btf.getTopLeft().getX() && textBlock.getPdfMaxX() - threshold < btf.getTopLeft() - .getX() + btf.getWidth() && textBlock.getPdfMinY() + threshold > btf.getTopLeft().getY() && textBlock.getPdfMaxY() - threshold < btf.getTopLeft() - .getY() + btf.getHeight()) { - return true; - } else { - return false; - } - - } - - - // TODO This currently uses pdf coord system. In the futher this should use java coord system. - // Note: DirAdj (TextDirection Adjusted) can not be user for this. - public boolean isOverBodyTextFrame(Rectangle btf, TextPageBlock textBlock, int rotation) { - - if (btf == null || textBlock == null) { - return false; - } - - if (rotation == 90 && textBlock.getPdfMaxX() < btf.getTopLeft().getX()) { - return true; - } - - if (rotation == 180 && textBlock.getPdfMaxY() < btf.getTopLeft().getY()) { - return true; - } - - if (rotation == 270 && textBlock.getPdfMinX() > btf.getTopLeft().getX() + btf.getWidth()) { - return true; - } - - if (rotation == 0 && textBlock.getPdfMinY() > btf.getTopLeft().getY() + btf.getHeight()) { - return true; - } else { - return false; - } - - } - - - // TODO This currently uses pdf coord system. In the futher this should use java coord system. - // Note: DirAdj (TextDirection Adjusted) can not be user for this. - public boolean isUnderBodyTextFrame(Rectangle btf, TextPageBlock textBlock, int rotation) { - - if (btf == null || textBlock == null) { - return false; - } - - if (rotation == 90 && textBlock.getPdfMinX() > btf.getTopLeft().getX() + btf.getWidth()) { - return true; - } - - if (rotation == 180 && textBlock.getPdfMinY() > btf.getTopLeft().getY() + btf.getHeight()) { - return true; - } - - if (rotation == 270 && textBlock.getPdfMaxX() < btf.getTopLeft().getX()) { - return true; - } - - if (rotation == 0 && textBlock.getPdfMaxY() < btf.getTopLeft().getY()) { - return true; - } else { - return false; - } - - } - - - // TODO This currently uses pdf coord system. In the futher this should use java coord system. - // Note: DirAdj (TextDirection Adjusted) can not be user for this. - public boolean isTouchingUnderBodyTextFrame(Rectangle btf, TextPageBlock textBlock) { - - //TODO Currently this is not working for rotated pages. - - if (btf == null || textBlock == null) { - return false; - } - - if (textBlock.getMinY() < btf.getTopLeft().getY()) { - return true; - } else { - return false; - } - - } - - - public float getHeightDifferenceBetweenChunkWordAndDocumentWord(TextPageBlock textBlock, Float documentMostPopularWordHeight) { - - return textBlock.getMostPopularWordHeight() - documentMostPopularWordHeight; - } - - - public Float getApproxLineCount(TextPageBlock textBlock) { - - return textBlock.getHeight() / textBlock.getMostPopularWordHeight(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/QuickSort.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/QuickSort.java deleted file mode 100644 index 55b8e861..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/QuickSort.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.util.ArrayDeque; -import java.util.Comparator; -import java.util.Deque; -import java.util.List; - -import lombok.experimental.UtilityClass; - -/** - * Copied and minimal modified from PDFBox. - */ -@UtilityClass -public final class QuickSort { - - private static final Comparator OBJCOMP = new Comparator() { - @Override - public int compare(Comparable object1, Comparable object2) { - - return object1.compareTo(object2); - } - }; - - - /** - * Sorts the given list using the given comparator. - * - * @param type of the objects to be sorted. - * @param list list to be sorted - * @param cmp comparator used to compare the objects within the list - */ - public static void sort(List list, Comparator cmp) { - - int size = list.size(); - if (size < 2) { - return; - } - quicksort(list, cmp); - } - - - /** - * Sorts the given list using compareTo as comparator. - * - * @param type of the objects to be sorted. - * @param list list to be sorted - */ - public static void sort(List list) { - - sort(list, (Comparator) OBJCOMP); - } - - - private static void quicksort(List list, Comparator cmp) { - - Deque stack = new ArrayDeque(); - stack.push(0); - stack.push(list.size()); - while (!stack.isEmpty()) { - int right = stack.pop(); - int left = stack.pop(); - if (right - left < 2) { - continue; - } - int p = left + ((right - left) / 2); - p = partition(list, cmp, p, left, right); - - stack.push(p + 1); - stack.push(right); - - stack.push(left); - stack.push(p); - } - } - - - private static int partition(List list, Comparator cmp, int p, int start, int end) { - - int l = start; - int h = end - 2; - T piv = list.get(p); - swap(list, p, end - 1); - - while (l < h) { - if (cmp.compare(list.get(l), piv) <= 0) { - l++; - } else if (cmp.compare(piv, list.get(h)) <= 0) { - h--; - } else { - swap(list, l, h); - } - } - int idx = h; - if (cmp.compare(list.get(h), piv) < 0) { - idx++; - } - swap(list, end - 1, idx); - return idx; - } - - - private static void swap(List list, int i, int j) { - - T tmp = list.get(i); - list.set(i, list.get(j)); - list.set(j, tmp); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/RulingTextDirAdjustUtil.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/RulingTextDirAdjustUtil.java deleted file mode 100644 index 0e9b047e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/RulingTextDirAdjustUtil.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public final class RulingTextDirAdjustUtil { - - /** - * Converts a ruling (line of a table) the same way TextPositions are converted in PDFBox. - * This will get the y position of the text, adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - *

- * See org.apache.pdfbox.text.TextPosition - */ - public Line2D.Float convertToDirAdj(Ruling ruling, float dir, float pageWidth, float pageHeight) { - - return new Line2D.Float(convertPoint(ruling.x1, ruling.y1, dir, pageWidth, pageHeight), convertPoint(ruling.x2, ruling.y2, dir, pageWidth, pageHeight)); - } - - - private Point2D convertPoint(float x, float y, float dir, float pageWidth, float pageHeight) { - - var xAdj = getXRot(x, y, dir, pageWidth, pageHeight); - var yLowerLeftRot = getYLowerLeftRot(x, y, dir, pageWidth, pageHeight); - var yAdj = dir == 0 || dir == 180 ? pageHeight - yLowerLeftRot : pageWidth - yLowerLeftRot; - return new Point2D.Float(xAdj, yAdj); - } - - - @SuppressWarnings("SuspiciousNameCombination") - private float getXRot(float x, float y, float dir, float pageWidth, float pageHeight) { - - if (dir == 0) { - return x; - } else if (dir == 90) { - return y; - } else if (dir == 180) { - return pageWidth - x; - } else if (dir == 270) { - return pageHeight - y; - } - return 0; - } - - - private float getYLowerLeftRot(float x, float y, float dir, float pageWidth, float pageHeight) { - - if (dir == 0) { - return y; - } else if (dir == 90) { - return pageWidth - x; - } else if (dir == 180) { - return pageHeight - y; - } else if (dir == 270) { - return x; - } - return 0; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/Utils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/Utils.java deleted file mode 100644 index c5489e0f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/Utils.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.math.BigDecimal; -import java.util.Comparator; -import java.util.List; - -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@UtilityClass -@SuppressWarnings("all") -public final class Utils { - - private final static float EPSILON = 0.1f; - - - public static boolean feq(double f1, double f2) { - - return (Math.abs(f1 - f2) < EPSILON); - } - - - public static float round(double d, int decimalPlace) { - - BigDecimal bd = BigDecimal.valueOf(d); - bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP); - return bd.floatValue(); - } - - - public static void sort(List list, Comparator comparator) { - - try { - QuickSort.sort(list, comparator); - } catch (IllegalArgumentException e) { - // This should not happen since we use QuickSort from PDFBox - log.warn(e.getMessage()); - } - } - -} - diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/AtomicPositionBlockData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/AtomicPositionBlockData.java deleted file mode 100644 index e346266f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/AtomicPositionBlockData.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.data; - -import java.awt.geom.Rectangle2D; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@AllArgsConstructor -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class AtomicPositionBlockData { - - Long id; - int[] stringIdxToPositionIdx; - float[][] positions; - - - public static AtomicPositionBlockData fromAtomicTextBlock(AtomicTextBlock atomicTextBlock) { - - return AtomicPositionBlockData.builder() - .id(atomicTextBlock.getId()) - .positions(toPrimitiveFloatMatrix(atomicTextBlock.getPositions())) - .stringIdxToPositionIdx(atomicTextBlock.getStringIdxToPositionIdx().stream().mapToInt(Integer::intValue).toArray()) - .build(); - } - - - private static float[][] toPrimitiveFloatMatrix(List positions) { - - float[][] positionMatrix = new float[positions.size()][]; - for (int i = 0; i < positions.size(); i++) { - positionMatrix[i] = toArray(positions.get(i)); - } - return positionMatrix; - } - - - private static float[] toArray(Rectangle2D positions) { - - return new float[]{(float) positions.getMinX(), (float) positions.getMinY(), (float) positions.getWidth(), (float) positions.getHeight()}; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/AtomicTextBlockData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/AtomicTextBlockData.java deleted file mode 100644 index 7afeabd4..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/AtomicTextBlockData.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.data; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@AllArgsConstructor -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class AtomicTextBlockData { - - Long id; - Long page; - String searchText; - int numberOnPage; - int start; - int end; - int[] lineBreaks; - - - public static AtomicTextBlockData fromAtomicTextBlock(AtomicTextBlock atomicTextBlock) { - - return AtomicTextBlockData.builder() - .id(atomicTextBlock.getId()) - .page(atomicTextBlock.getPage().getNumber().longValue()) - .searchText(atomicTextBlock.getSearchText()) - .numberOnPage(atomicTextBlock.getNumberOnPage()) - .start(atomicTextBlock.getBoundary().start()) - .end(atomicTextBlock.getBoundary().end()) - .lineBreaks(atomicTextBlock.getLineBreaks().stream().mapToInt(Integer::intValue).toArray()) - .build(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/DocumentData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/DocumentData.java deleted file mode 100644 index 3997d6b5..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/DocumentData.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.data; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@AllArgsConstructor -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class DocumentData { - - PageData[] pages; - AtomicTextBlockData[] atomicTextBlocks; - AtomicPositionBlockData[] atomicPositionBlocks; - DocumentTreeData documentTreeData; - - - public static DocumentData fromDocument(Document document) { - - var atomicPositionBlocks = document.streamTerminalTextBlocksInOrder() - .flatMap(textBlock -> textBlock.getAtomicTextBlocks().stream()) - .distinct() - .map(AtomicPositionBlockData::fromAtomicTextBlock) - .toArray(AtomicPositionBlockData[]::new); - - var atomicTextBlocks = document.streamTerminalTextBlocksInOrder() - .flatMap(textBlock -> textBlock.getAtomicTextBlocks().stream()) - .distinct() - .map(AtomicTextBlockData::fromAtomicTextBlock) - .toArray(AtomicTextBlockData[]::new); - - var pages = document.getPages().stream().map(PageData::fromPage).toArray(PageData[]::new); - - var documentTreeData = new DocumentTreeData(DocumentTreeData.EntryData.fromEntry(document.getDocumentTree().getRoot())); - return new DocumentData(pages, atomicTextBlocks, atomicPositionBlocks, documentTreeData); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/DocumentTreeData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/DocumentTreeData.java deleted file mode 100644 index 53823da6..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/DocumentTreeData.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.data; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.PropertiesMapper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@FieldDefaults(level = AccessLevel.PRIVATE) -public class DocumentTreeData { - - EntryData root; - - - public EntryData get(List tocId) { - - if (tocId.isEmpty()) { - return root; - } - EntryData entry = root.children.get(tocId.get(0)); - for (int id : tocId.subList(1, tocId.size())) { - entry = entry.children.get(id); - } - return entry; - } - - - public Stream streamAllEntries() { - - return Stream.concat(Stream.of(root), root.children.stream()).flatMap(DocumentTreeData::flatten); - } - - - public String toString() { - - return String.join("\n", streamAllEntries().map(EntryData::toString).toList()); - } - - - private static Stream flatten(EntryData entry) { - - return Stream.concat(Stream.of(entry), entry.children.stream().flatMap(DocumentTreeData::flatten)); - } - - - @Builder - @Getter - @AllArgsConstructor - @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) - public static class EntryData { - - NodeType type; - int[] treeId; - Long[] atomicBlockIds; - Long[] pageNumbers; - Map properties; - List children; - - - public static EntryData fromEntry(DocumentTree.Entry entry) { - - Long[] atomicBlockIds = toAtomicTextBlockIds(entry); - - Map properties = switch (entry.getType()) { - case TABLE -> PropertiesMapper.buildTableProperties((Table) entry.getNode()); - case TABLE_CELL -> PropertiesMapper.buildTableCellProperties((TableCell) entry.getNode()); - case IMAGE -> PropertiesMapper.buildImageProperties((Image) entry.getNode()); - default -> new HashMap<>(); - }; - var treeId = entry.getTreeId().stream().mapToInt(Integer::intValue).toArray(); - var pageNumbers = entry.getNode().getPages().stream().map(Page::getNumber).map(Integer::longValue).toArray(Long[]::new); - var subEntries = entry.getChildren().stream().map(EntryData::fromEntry).toList(); - return new EntryData(entry.getType(), treeId, atomicBlockIds, pageNumbers, properties, subEntries); - } - - - private static Long[] toAtomicTextBlockIds(DocumentTree.Entry entry) { - - if (entry.getNode().isLeaf()) { - return entry.getNode().getLeafTextBlock().getAtomicTextBlocks().stream().map(AtomicTextBlock::getId).toArray(Long[]::new); - } else { - return new Long[]{}; - } - } - - - @Override - public String toString() { - - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i : treeId) { - sb.append(i); - sb.append(","); - } - sb.delete(sb.length() - 1, sb.length()); - sb.append("]: "); - - sb.append(type); - sb.append(" atbs = "); - sb.append(atomicBlockIds.length); - - return sb.toString(); - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/PageData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/PageData.java deleted file mode 100644 index 75bd3166..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/PageData.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.data; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@AllArgsConstructor -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class PageData { - - int number; - int height; - int width; - int rotation; - - - public static PageData fromPage(Page page) { - - return new PageData(page.getNumber(), page.getHeight(), page.getWidth(), page.getRotation()); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/PropertiesMapper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/PropertiesMapper.java deleted file mode 100644 index 5b475217..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/PropertiesMapper.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper; - -import static java.lang.String.format; - -import java.awt.geom.Rectangle2D; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCell; - -import lombok.AccessLevel; -import lombok.experimental.FieldDefaults; -import lombok.experimental.UtilityClass; - -@UtilityClass -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class PropertiesMapper { - - String imageType = "imageType"; - private final String transparency = "transparency"; - private final String position = "position"; - String id = "id"; - String row = "row"; - String col = "col"; - String header = "header"; - String bBox = "bBox"; - String numberOfRows = "numberOfRows"; - String numberOfCols = "numberOfCols"; - - - public Map buildImageProperties(Image image) { - - Map properties = new HashMap<>(); - properties.put(imageType, image.getImageType().toString()); - properties.put(transparency, String.valueOf(image.isTransparent())); - properties.put(position, toString(image.getPosition())); - properties.put(id, image.getId()); - return properties; - } - - - private String toString(Rectangle2D rectangle2D) { - - return format("%f,%f,%f,%f", rectangle2D.getX(), rectangle2D.getY(), rectangle2D.getWidth(), rectangle2D.getHeight()); - } - - - public Map buildTableCellProperties(TableCell tableCell) { - - Map properties = new HashMap<>(); - properties.put(row, String.valueOf(tableCell.getRow())); - properties.put(col, String.valueOf(tableCell.getCol())); - properties.put(header, String.valueOf(tableCell.isHeader())); - - if (tableCell.getPages().size() > 1 || tableCell.getBBox().keySet().size() > 1) { - throw new IllegalArgumentException("TableCell can only occur on a single page!"); - } - String bBoxString = toString(tableCell.getBBox().get(tableCell.getPages().stream().findFirst().get())); - properties.put(bBox, bBoxString); - - return properties; - } - - - public Map buildTableProperties(Table table) { - - Map properties = new HashMap<>(); - properties.put(numberOfRows, String.valueOf(table.getNumberOfRows())); - properties.put(numberOfCols, String.valueOf(table.getNumberOfCols())); - return properties; - } - - - public void parseImageProperties(Map properties, Image.ImageBuilder builder) { - - builder.imageType(ImageType.fromString(properties.get(imageType))); - builder.transparent(Boolean.parseBoolean(properties.get(transparency))); - builder.position(parseRectangle2D(properties.get(position))); - builder.id(properties.get(id)); - } - - - public void parseTableCellProperties(Map properties, TableCell.TableCellBuilder builder) { - - builder.row(Integer.parseInt(properties.get(row))); - builder.col(Integer.parseInt(properties.get(col))); - builder.header(Boolean.parseBoolean(properties.get(header))); - builder.bBox(parseRectangle2D(properties.get(bBox))); - } - - - public void parseTableProperties(Map properties, Table.TableBuilder builder) { - - builder.numberOfRows(Integer.parseInt(properties.get(numberOfRows))); - builder.numberOfCols(Integer.parseInt(properties.get(numberOfCols))); - } - - - private Rectangle2D parseRectangle2D(String bBox) { - - List floats = Arrays.stream(bBox.split(",")).map(Float::parseFloat).toList(); - return new Rectangle2D.Float(floats.get(0), floats.get(1), floats.get(2), floats.get(3)); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/DocumentGraphFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/DocumentGraphFactory.java deleted file mode 100644 index a9701164..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/DocumentGraphFactory.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.factory; - -import static java.lang.String.format; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.toList; - -import java.awt.geom.Rectangle2D; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationFooter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationHeader; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Footer; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.GenericSemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Header; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Headline; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.TextPositionOperations; -import com.iqser.red.service.redaction.v1.server.redaction.utils.IdBuilder; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.experimental.FieldDefaults; -import lombok.experimental.UtilityClass; - -@UtilityClass -public class DocumentGraphFactory { - - public Document buildDocumentGraph(ClassificationDocument document) { - - Document documentGraph = new Document(); - Context context = new Context(documentGraph); - - document.getPages().forEach(context::buildAndAddPageWithCounter); - document.getSections().stream().flatMap(section -> section.getImages().stream()).forEach(image -> context.getImages().add(image)); - addSections(document, context); - addHeaderAndFooterToEachPage(document, context); - - documentGraph.setNumberOfPages(context.pages.size()); - documentGraph.setPages(context.pages.keySet()); - documentGraph.setDocumentTree(context.documentTree); - documentGraph.setTextBlock(documentGraph.getTextBlock()); - return documentGraph; - } - - - private void addSections(ClassificationDocument document, Context context) { - - document.getSections().forEach(section -> SectionNodeFactory.addSection(null, section.getPageBlocks(), section.getImages(), context)); - } - - - public void addParagraphOrHeadline(GenericSemanticNode parentNode, TextPageBlock originalTextBlock, Context context, List textBlocksToMerge) { - - Page page = context.getPage(originalTextBlock.getPage()); - - GenericSemanticNode node; - if (originalTextBlock.isHeadline()) { - node = Headline.builder().documentTree(context.getDocumentTree()).build(); - } else { - node = Paragraph.builder().documentTree(context.getDocumentTree()).build(); - } - - page.getMainBody().add(node); - - List textBlocks = new ArrayList<>(textBlocksToMerge); - AtomicTextBlock textBlock = context.textBlockFactory.fromContext(TextPositionOperations.mergeAndSortTextPositionSequenceByYThenX(textBlocks), node, context, page); - List treeId = context.documentTree.createNewChildEntryAndReturnId(parentNode, node); - node.setLeafTextBlock(textBlock); - node.setTreeId(treeId); - } - - - public void addImage(Section section, ClassifiedImage image, Context context) { - - Rectangle2D position = image.getPosition(); - Page page = context.getPage(image.getPage()); - Image imageNode = Image.builder() - .id(IdBuilder.buildId(Set.of(page), List.of(position), image.getImageType().name(), "image")) - .imageType(image.getImageType()) - .position(position) - .transparent(image.isHasTransparency()) - .page(page) - .documentTree(context.getDocumentTree()) - .build(); - page.getMainBody().add(imageNode); - - List tocId = context.getDocumentTree().createNewChildEntryAndReturnId(section, imageNode); - imageNode.setTreeId(tocId); - } - - - private void addHeaderAndFooterToEachPage(ClassificationDocument document, Context context) { - - Map> headers = document.getHeaders() - .stream() - .map(ClassificationHeader::getTextBlocks) - .flatMap(List::stream) - .collect(groupingBy(AbstractPageBlock::getPage, toList())); - - Map> footers = document.getFooters() - .stream() - .map(ClassificationFooter::getTextBlocks) - .flatMap(List::stream) - .collect(groupingBy(AbstractPageBlock::getPage, toList())); - - for (int pageIndex = 1; pageIndex <= document.getPages().size(); pageIndex++) { - if (headers.containsKey(pageIndex)) { - addHeader(headers.get(pageIndex), context); - } else { - addEmptyHeader(pageIndex, context); - } - } - - for (int pageIndex = 1; pageIndex <= document.getPages().size(); pageIndex++) { - if (footers.containsKey(pageIndex)) { - addFooter(footers.get(pageIndex), context); - } else { - addEmptyFooter(pageIndex, context); - } - } - } - - - private void addFooter(List textBlocks, Context context) { - - Page page = context.getPage(textBlocks.get(0).getPage()); - Footer footer = Footer.builder().documentTree(context.getDocumentTree()).build(); - AtomicTextBlock textBlock = context.textBlockFactory.fromContext(TextPositionOperations.mergeAndSortTextPositionSequenceByYThenX(textBlocks), footer, context, page); - List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(footer); - footer.setTreeId(tocId); - footer.setLeafTextBlock(textBlock); - page.setFooter(footer); - } - - - public void addHeader(List textBlocks, Context context) { - - Page page = context.getPage(textBlocks.get(0).getPage()); - Header header = Header.builder().documentTree(context.getDocumentTree()).build(); - AtomicTextBlock textBlock = context.textBlockFactory.fromNumberOnPage(TextPositionOperations.mergeAndSortTextPositionSequenceByYThenX(textBlocks), header, 0, page); - List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(header); - header.setTreeId(tocId); - header.setLeafTextBlock(textBlock); - page.setHeader(header); - } - - - private void addEmptyFooter(int pageIndex, Context context) { - - Page page = context.getPage(pageIndex); - Footer footer = Footer.builder().documentTree(context.getDocumentTree()).build(); - AtomicTextBlock textBlock = context.textBlockFactory.emptyTextBlock(footer, context, page); - List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(footer); - footer.setTreeId(tocId); - footer.setLeafTextBlock(textBlock); - page.setFooter(footer); - } - - - private void addEmptyHeader(int pageIndex, Context context) { - - Page page = context.getPage(pageIndex); - Header header = Header.builder().documentTree(context.getDocumentTree()).build(); - AtomicTextBlock textBlock = context.textBlockFactory.emptyTextBlockFromInteger(header, 0, page); - List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(header); - header.setTreeId(tocId); - header.setLeafTextBlock(textBlock); - page.setHeader(header); - } - - - @Getter - @Builder - @AllArgsConstructor - @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) - public final class Context { - - DocumentTree documentTree; - Map pages; - List

sections; - List images; - TextBlockFactory textBlockFactory; - - - public Context(Document document) { - - documentTree = new DocumentTree(document); - pages = new HashMap<>(); - sections = new LinkedList<>(); - images = new LinkedList<>(); - textBlockFactory = new TextBlockFactory(); - } - - - public void buildAndAddPageWithCounter(ClassificationPage classificationPage) { - - Page page = Page.fromClassificationPage(classificationPage); - //this counter counts the TextBlocks per page - //initial value is set to 1, because 0 is reserved for Header - pages.put(page, 1); - } - - - public int getAndIncrementTextBlockNumberOnPage(Page page) { - - Integer textBlockNumberOnPage = pages.get(page); - pages.merge(page, 1, Integer::sum); - return textBlockNumberOnPage; - } - - - public Page getPage(int pageIndex) { - - return pages.keySet() - .stream() - .filter(page -> page.getNumber() == pageIndex) - .findFirst() - .orElseThrow(() -> new NoSuchElementException(format("ClassificationPage with number %d not found", pageIndex))); - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/SearchTextWithTextPositionDto.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/SearchTextWithTextPositionDto.java deleted file mode 100644 index d6e7ca6e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/SearchTextWithTextPositionDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.factory; - -import java.awt.geom.Rectangle2D; -import java.util.Collections; -import java.util.List; - -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.experimental.FieldDefaults; - -@Builder -@Getter -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class SearchTextWithTextPositionDto { - - String searchText; - List lineBreaks; - List stringCoordsToPositionCoords; - List positions; - - - public static SearchTextWithTextPositionDto empty() { - - return SearchTextWithTextPositionDto.builder() - .searchText("") - .lineBreaks(Collections.emptyList()) - .positions(Collections.emptyList()) - .stringCoordsToPositionCoords(Collections.emptyList()) - .build(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/SearchTextWithTextPositionFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/SearchTextWithTextPositionFactory.java deleted file mode 100644 index eb4f8af8..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/SearchTextWithTextPositionFactory.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.factory; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.util.LinkedList; -import java.util.List; -import java.util.Objects; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.RedTextPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextDirection; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class SearchTextWithTextPositionFactory { - - public final int HEIGHT_PADDING = 2; - // when checking for a hyphen linebreak, we need to check after a linebreak if the last hyphen was less than three symbols away. - // We detect a linebreak as either a "\n" character or if two adjacent symbol's position differ in y-coordinates by at least one character height. - // If there is a hyphen linebreak, the hyphen will be 1 position in front of a "\n" or 2 positions in front of the character which has a lower y-coordinate - // This is why, we need to initialize this to < -2, otherwise, if the very first symbol is a \n we would detect a hyphen linebreak that isn't there. - // Also, Integer.MIN_VALUE is a bad idea due to potential overflow during arithmetic operations. This is why the default should be -3. - public final int MAX_HYPHEN_LINEBREAK_DISTANCE = 3; - - - public SearchTextWithTextPositionDto buildSearchTextToTextPositionModel(List sequences) { - - if (sequences.isEmpty() || sequences.stream().allMatch(sequence -> sequence.getTextPositions().isEmpty())) { - return SearchTextWithTextPositionDto.empty(); - } - - Context context = new Context(); - - RedTextPosition currentTextPosition = sequences.get(0).getTextPositions().get(0); - RedTextPosition previousTextPosition = RedTextPosition.builder().unicode(" ").position(currentTextPosition.getPosition()).build(); - - for (TextPositionSequence word : sequences) { - for (int i = 0; i < word.getTextPositions().size(); ++i) { - - currentTextPosition = word.getTextPositions().get(i); - if (isLineBreak(currentTextPosition, previousTextPosition)) { - removeHyphenLinebreaks(context); - context.lineBreaksStringIdx.add(context.stringIdx); - } - if (!isRepeatedWhitespace(currentTextPosition.getUnicode(), previousTextPosition.getUnicode())) { - if (isHyphen(currentTextPosition.getUnicode())) { - context.lastHyphenIdx = context.stringIdx; - } - appendCurrentTextPosition(context, currentTextPosition); - } - - previousTextPosition = currentTextPosition; - ++context.positionIdx; - } - - previousTextPosition = RedTextPosition.builder().unicode(" ").position(previousTextPosition.getPosition()).build(); - context.stringBuilder.append(" "); - context.stringIdxToPositionIdx.add(context.positionIdx); - ++context.stringIdx; - } - - assert context.stringBuilder.length() == context.stringIdxToPositionIdx.size(); - - List positions = sequences.stream() - .flatMap(sequence -> sequence.getTextPositions().stream().map(textPosition -> mapRedTextPositionToInitialUserSpace(textPosition, sequence))) - .toList(); - - return SearchTextWithTextPositionDto.builder() - .searchText(context.stringBuilder.toString()) - .lineBreaks(context.lineBreaksStringIdx) - .stringCoordsToPositionCoords(context.stringIdxToPositionIdx) - .positions(positions) - .build(); - } - - - private void appendCurrentTextPosition(Context context, RedTextPosition currentTextPosition) { - - context.stringBuilder.append(currentTextPosition.getUnicode()); - - // unicode characters with more than 16-bit encoding have a length > 1 in java strings - for (int j = 0; j < currentTextPosition.getUnicode().length(); j++) { - context.stringIdxToPositionIdx.add(context.positionIdx); - } - context.stringIdx += currentTextPosition.getUnicode().length(); - } - - - private void removeHyphenLinebreaks(Context context) { - - if (lastHyphenDirectlyBeforeLineBreak(context)) { - context.stringBuilder.delete(context.lastHyphenIdx, context.stringBuilder.length()); - context.stringIdxToPositionIdx = context.stringIdxToPositionIdx.subList(0, context.lastHyphenIdx); - context.stringIdx = context.lastHyphenIdx; - context.lastHyphenIdx = -MAX_HYPHEN_LINEBREAK_DISTANCE; - } - } - - - private boolean lastHyphenDirectlyBeforeLineBreak(Context context) { - - return context.stringIdx - context.lastHyphenIdx < MAX_HYPHEN_LINEBREAK_DISTANCE; - } - - - private boolean isLineBreak(RedTextPosition currentTextPosition, RedTextPosition previousTextPosition) { - - return Objects.equals(currentTextPosition.getUnicode(), "\n") || isDeltaYLargerThanTextHeight(currentTextPosition, previousTextPosition); - } - - - private boolean isDeltaYLargerThanTextHeight(RedTextPosition currentPosition, RedTextPosition previousPosition) { - - if (previousPosition == null) { - return false; - } - - float deltaY = Math.abs(currentPosition.getYDirAdj() - previousPosition.getYDirAdj()); - return deltaY >= currentPosition.getHeightDir(); - } - - - private boolean isRepeatedWhitespace(String currentUnicode, String previousUnicode) { - - return Objects.equals(previousUnicode, " ") && Objects.equals(currentUnicode, " "); - } - - - private boolean isHyphen(String unicodeCharacter) { - - return Objects.equals(unicodeCharacter, "-") || // - Objects.equals(unicodeCharacter, "~") || // - Objects.equals(unicodeCharacter, "‐") || // - Objects.equals(unicodeCharacter, "‒") || // - Objects.equals(unicodeCharacter, "⁻") || // - Objects.equals(unicodeCharacter, "−") || // - Objects.equals(unicodeCharacter, "﹣") || // - Objects.equals(unicodeCharacter, "゠") || // - Objects.equals(unicodeCharacter, "⁓") || // - Objects.equals(unicodeCharacter, "‑") || // - Objects.equals(unicodeCharacter, "\u00AD"); - } - - - private Rectangle2D mapRedTextPositionToInitialUserSpace(RedTextPosition textPosition, TextPositionSequence sequence) { - - float textHeight = sequence.getTextHeight() + HEIGHT_PADDING; - Rectangle2D rectangle2D = new Rectangle2D.Double(textPosition.getXDirAdj(), - textPosition.getYDirAdj() - textHeight, - textPosition.getWidthDirAdj(), - textHeight + HEIGHT_PADDING); - - AffineTransform transform = new AffineTransform(); - - if (sequence.getDir() == TextDirection.ZERO || sequence.getDir() == TextDirection.HALF_CIRCLE) { - transform.rotate(sequence.getDir().getRadians(), sequence.getPageWidth() / 2f, sequence.getPageHeight() / 2f); - transform.translate(0f, sequence.getPageHeight()); - } else if (sequence.getDir() == TextDirection.QUARTER_CIRCLE) { - transform.rotate(sequence.getDir().getRadians(), sequence.getPageWidth() / 2f, sequence.getPageWidth() / 2f); - transform.translate(0f, sequence.getPageWidth()); - } else { - transform.rotate(sequence.getDir().getRadians(), sequence.getPageHeight() / 2f, sequence.getPageHeight() / 2f); - transform.translate(0f, sequence.getPageWidth()); - } - transform.scale(1., -1.); - - return transform.createTransformedShape(rectangle2D).getBounds2D(); - } - - - private class Context { - - List stringIdxToPositionIdx = new LinkedList<>(); - List lineBreaksStringIdx = new LinkedList<>(); - StringBuilder stringBuilder = new StringBuilder(); - - int stringIdx; - int positionIdx; - - int lastHyphenIdx = -MAX_HYPHEN_LINEBREAK_DISTANCE; - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/SectionNodeFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/SectionNodeFactory.java deleted file mode 100644 index 1360e089..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/SectionNodeFactory.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.factory; - -import static java.lang.String.format; -import static java.util.Collections.emptyList; -import static java.util.stream.Collectors.groupingBy; - -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Stream; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.GenericSemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.TableMergingUtility; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class SectionNodeFactory { - - public void addSection(GenericSemanticNode parentNode, List pageBlocks, List images, DocumentGraphFactory.Context context) { - - if (pageBlocks.isEmpty()) { - return; - } - Map> blocksPerPage = pageBlocks.stream().collect(groupingBy(AbstractPageBlock::getPage)); - Section section = Section.builder().documentTree(context.getDocumentTree()).build(); - - context.getSections().add(section); - blocksPerPage.keySet().forEach(pageNumber -> addSectionNodeToPageNode(context, section, pageNumber)); - - section.setTreeId(getTreeId(parentNode, context, section)); - - addFirstHeadlineDirectlyToSection(pageBlocks, context, section); - if (containsTablesAndTextBlocks(pageBlocks)) { - splitPageBlocksIntoSubSections(pageBlocks).forEach(subSectionPageBlocks -> addSection(section, subSectionPageBlocks, emptyList(), context)); - } else { - addTablesAndParagraphsAndHeadlinesToSection(pageBlocks, context, section); - } - - images.stream().distinct().forEach(image -> DocumentGraphFactory.addImage(section, image, context)); - } - - - private List getTreeId(GenericSemanticNode parentNode, DocumentGraphFactory.Context context, Section section) { - - if (parentNode == null) { - return context.getDocumentTree().createNewMainEntryAndReturnId(section); - } else { - return context.getDocumentTree().createNewChildEntryAndReturnId(parentNode, section); - } - } - - - private void addFirstHeadlineDirectlyToSection(List pageBlocks, DocumentGraphFactory.Context context, Section section) { - - if (pageBlocks.get(0).isHeadline()) { - addTablesAndParagraphsAndHeadlinesToSection(List.of(pageBlocks.get(0)), context, section); - pageBlocks.remove(0); - } - } - - - private void addTablesAndParagraphsAndHeadlinesToSection(List pageBlocks, DocumentGraphFactory.Context context, Section section) { - - Set alreadyMerged = new HashSet<>(); - List remainingBlocks = new LinkedList<>(pageBlocks); - for (AbstractPageBlock abstractPageBlock : pageBlocks) { - - if (alreadyMerged.contains(abstractPageBlock)) { - continue; - } - - remainingBlocks.removeAll(alreadyMerged); - - if (abstractPageBlock instanceof TextPageBlock) { -// List textBlocksToMerge = findTextBlocksWithSameClassificationAndAlignsYAndSameOrientationUntilConvergence((TextPageBlock) abstractPageBlock, remainingBlocks); - List textBlocksToMerge = findTextBlocksWithSameClassificationAndAlignsYAndSameOrientation(List.of((TextPageBlock) abstractPageBlock), - remainingBlocks); - alreadyMerged.addAll(textBlocksToMerge); - DocumentGraphFactory.addParagraphOrHeadline(section, (TextPageBlock) abstractPageBlock, context, textBlocksToMerge); - } else if (abstractPageBlock instanceof TablePageBlock tablePageBlock) { - List tablesToMerge = TableMergingUtility.findConsecutiveTablesWithSameColCountAndSameHeaders(tablePageBlock, remainingBlocks); - alreadyMerged.addAll(tablesToMerge); - TableNodeFactory.addTable(section, tablesToMerge, context); - } else { - throw new RuntimeException(format("Unhandled AbstractPageBlockType %s!", abstractPageBlock.getClass())); - } - } - } - - - private boolean containsTablesAndTextBlocks(List pageBlocks) { - - return pageBlocks.stream().anyMatch(pageBlock -> pageBlock instanceof TablePageBlock) && pageBlocks.stream().anyMatch(pageBlock -> pageBlock instanceof TextPageBlock); - } - - - /** - * This function splits the list of PageBlocks around TablePageBlocks, such that SubSections can be created, that don't include tables. - * This is needed so we can execute rules on sections, that do not contain tables. - * See: document structure wiki - * - * @param pageBlocks a List of AbstractPageBlocks, which have at least one TablePageBlock and one ClassificationTextBlock - * @return List of Lists of AbstractPageBlocks, which include either a single Headline ClassificationTextBlock and a TablePageBlock or only ClassificationTextBlocks. - */ - private List> splitPageBlocksIntoSubSections(List pageBlocks) { - - List> splitList = splitIntoCoherentList(pageBlocks); - movePrecedingHeadlineToTableList(splitList); - return splitList.stream().filter(list -> !list.isEmpty()).toList(); - } - - - private void movePrecedingHeadlineToTableList(List> splitList) { - - for (int i = 0; i < splitList.size(); i++) { - if (listIsTablesOnly(splitList.get(i)) && i > 0) { - List previousList = splitList.get(i - 1); - AbstractPageBlock lastPageBlockInPreviousList = previousList.get(previousList.size() - 1); - if (lastPageBlockInPreviousList.isHeadline()) { - previousList.remove(previousList.size() - 1); - splitList.get(i).add(0, lastPageBlockInPreviousList); - } - } - } - } - - - private boolean listIsTablesOnly(List abstractPageBlocks) { - - return abstractPageBlocks.stream().allMatch(abstractPageBlock -> abstractPageBlock instanceof TablePageBlock); - } - - - /** - * @param pageBlocks a List of AbstractPageBlocks, which have at least one TablePageBlock and one ClassificationTextBlock - * @return List of Lists of AbstractPageBlocks, which are exclusively of type ClassificationTextBlock or TablePageBlock - */ - private List> splitIntoCoherentList(List pageBlocks) { - - List> splitList = new LinkedList<>(); - List currentList = new LinkedList<>(); - splitList.add(currentList); - - Class lastPageBlockClass = pageBlocks.get(0).getClass(); - for (AbstractPageBlock pageBlock : pageBlocks) { - if (lastPageBlockClass.isInstance(pageBlock)) { - currentList.add(pageBlock); - } else { - currentList = new LinkedList<>(); - currentList.add(pageBlock); - splitList.add(currentList); - lastPageBlockClass = pageBlock.getClass(); - } - } - return splitList; - } - - - @SuppressWarnings("PMD") - // experimental feature to be used later - private List findTextBlocksWithSameClassificationAndAlignsYAndSameOrientationUntilConvergence(TextPageBlock originalTextBlocks, - List pageBlocks) { - - int previousCount = 1; - List alignedBlocks = findTextBlocksWithSameClassificationAndAlignsYAndSameOrientation(List.of(originalTextBlocks), pageBlocks); - while (previousCount < alignedBlocks.size()) { - alignedBlocks = findTextBlocksWithSameClassificationAndAlignsYAndSameOrientation(alignedBlocks, pageBlocks); - previousCount = alignedBlocks.size(); - } - return alignedBlocks; - } - - - private static List findTextBlocksWithSameClassificationAndAlignsYAndSameOrientation(List textBlocksToMerge, List pageBlocks) { - - return Stream.concat(pageBlocks.stream() - .filter(abstractPageBlock -> !textBlocksToMerge.contains(abstractPageBlock)) - .filter(abstractPageBlock -> textBlocksToMerge.stream().allMatch(textBlockToMerge -> abstractPageBlock.getPage() == textBlockToMerge.getPage())) - .filter(abstractPageBlock -> textBlocksToMerge.stream().allMatch(textBlockToMerge -> abstractPageBlock.getOrientation().equals(textBlockToMerge.getOrientation()))) - .filter(abstractPageBlock -> textBlocksToMerge.stream().anyMatch(abstractPageBlock::intersectsY)) - //.filter(abstractPageBlock -> textBlocksToMerge.stream().anyMatch(abstractPageBlock::intersectsX)) - .filter(abstractPageBlock -> abstractPageBlock instanceof TextPageBlock) - .map(abstractPageBlock -> (TextPageBlock) abstractPageBlock), // - textBlocksToMerge.stream())// - .toList(); - } - - - private void addSectionNodeToPageNode(DocumentGraphFactory.Context context, Section section, Integer pageNumber) { - - Page page = context.getPage(pageNumber); - page.getMainBody().add(section); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/TableNodeFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/TableNodeFactory.java deleted file mode 100644 index 368fca4b..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/TableNodeFactory.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.factory; - -import static java.util.Collections.emptyList; - -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.GenericSemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.TextPositionOperations; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class TableNodeFactory { - - public final double TABLE_CELL_MERGE_CONTENTS_SIZE_THRESHOLD = 0.05; - - - public void addTable(GenericSemanticNode parentNode, List tablesToMerge, DocumentGraphFactory.Context context) { - - setPageNumberInCells(tablesToMerge); - Set pages = tablesToMerge.stream().map(AbstractPageBlock::getPage).map(context::getPage).collect(Collectors.toSet()); - List> mergedRows = tablesToMerge.stream().map(TablePageBlock::getRows).flatMap(Collection::stream).toList(); - - Table table = Table.builder() - .documentTree(context.getDocumentTree()) - .numberOfCols(mergedRows.isEmpty() ? 0 : mergedRows.get(0).size()) - .numberOfRows(mergedRows.size()) - .build(); - - pages.forEach(page -> addTableToPage(page, parentNode, table)); - - List treeId = context.getDocumentTree().createNewChildEntryAndReturnId(parentNode, table); - table.setTreeId(treeId); - addTableCells(mergedRows, table, context); - - ifTableHasNoHeadersSetFirstRowAsHeaders(table); - } - - - private void setPageNumberInCells(List tablesToMerge) { - - // For some reason I can't figure out, in some table cells, the ClassificationTextBlocks have 0 as page number - // So I am fixing this here, but this should actually be fixed upstream. - tablesToMerge.forEach(table -> table.getRows() - .stream() - .flatMap(Collection::stream) - .peek(cell -> cell.setPageNumber(table.getPage())) - .forEach(cell -> setPageNumberInTextBlocksWithPageNumberSetTo0(table, cell))); - } - - - private void setPageNumberInTextBlocksWithPageNumberSetTo0(TablePageBlock table, Cell cell) { - - cell.getTextBlocks().stream()// - .filter(tb -> tb.getPage() == 0)// - .forEach(tb -> tb.setPage(table.getPage())); - } - - - @SuppressWarnings("PMD.UnusedPrivateMethod") // PMD actually flags this wrong - private void addTableToPage(Page page, SemanticNode parentNode, Table table) { - - if (!page.getMainBody().contains(parentNode)) { - parentNode.getPages().add(page); - } - - page.getMainBody().add(table); - } - - - private void ifTableHasNoHeadersSetFirstRowAsHeaders(Table table) { - - if (table.streamHeaders().findAny().isEmpty()) { - table.streamRow(0).forEach(tableCellNode -> tableCellNode.setHeader(true)); - } - } - - - private void addTableCells(List> rows, Table table, DocumentGraphFactory.Context context) { - - for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) { - for (int colIndex = 0; colIndex < rows.get(rowIndex).size(); colIndex++) { - addTableCell(rows.get(rowIndex).get(colIndex), rowIndex, colIndex, table, context); - } - } - } - - - @SuppressWarnings("PMD.UnusedPrivateMethod") // PMD actually flags this wrong - private void addTableCell(Cell cell, int rowIndex, int colIndex, Table tableNode, DocumentGraphFactory.Context context) { - - Page page = context.getPage(cell.getPageNumber()); - - TableCell tableCell = TableCell.builder().documentTree(context.getDocumentTree()).row(rowIndex).col(colIndex).header(cell.isHeaderCell()).bBox(cell.getBounds2D()).build(); - page.getMainBody().add(tableCell); - - List treeId = context.getDocumentTree().createNewTableChildEntryAndReturnId(tableNode, tableCell); - tableCell.setTreeId(treeId); - - TextBlock textBlock; - if (cell.getTextBlocks().isEmpty()) { - tableCell.setLeafTextBlock(context.getTextBlockFactory().emptyTextBlock(tableNode, context, page)); - } else if (cell.getTextBlocks().size() == 1) { - textBlock = context.getTextBlockFactory().fromContext(cell.getTextBlocks().get(0).getSequences(), tableCell, context, page); - tableCell.setLeafTextBlock(textBlock); - } else if (firstTextBlockIsHeadline(cell)) { - SectionNodeFactory.addSection(tableCell, cell.getTextBlocks().stream().map(tb -> (AbstractPageBlock) tb).toList(), emptyList(), context); - } else if (cellAreaIsSmallerThanPageAreaTimesThreshold(cell, page)) { - List sequences = TextPositionOperations.mergeAndSortTextPositionSequenceByYThenX(cell.getTextBlocks()); - textBlock = context.getTextBlockFactory().fromContext(sequences, tableCell, context, page); - tableCell.setLeafTextBlock(textBlock); - } else { - cell.getTextBlocks().forEach(tb -> DocumentGraphFactory.addParagraphOrHeadline(tableCell, tb, context, List.of(tb))); - } - } - - - private boolean cellAreaIsSmallerThanPageAreaTimesThreshold(Cell cell, Page page) { - - return cell.getArea() < TABLE_CELL_MERGE_CONTENTS_SIZE_THRESHOLD * page.getHeight() * page.getWidth(); - } - - - private boolean firstTextBlockIsHeadline(Cell cell) { - - return cell.getTextBlocks().get(0).isHeadline(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/TextBlockFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/TextBlockFactory.java deleted file mode 100644 index dd79c6d2..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/TextBlockFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.factory; - -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; - -import lombok.AccessLevel; -import lombok.experimental.FieldDefaults; - -@FieldDefaults(level = AccessLevel.PRIVATE) -public class TextBlockFactory { - - int stringOffset; - long textBlockIdx; - - - public AtomicTextBlock fromContext(List sequences, SemanticNode parent, DocumentGraphFactory.Context context, Page page) { - - Integer numberOnPage = context.getAndIncrementTextBlockNumberOnPage(page); - return fromNumberOnPage(sequences, parent, numberOnPage, page); - } - - - public AtomicTextBlock fromNumberOnPage(List sequences, SemanticNode parent, Integer numberOnPage, Page page) { - - SearchTextWithTextPositionDto searchTextWithTextPositionDto = SearchTextWithTextPositionFactory.buildSearchTextToTextPositionModel(sequences); - int offset = stringOffset; - stringOffset += searchTextWithTextPositionDto.getSearchText().length(); - long idx = textBlockIdx; - textBlockIdx++; - return AtomicTextBlock.fromSearchTextWithTextPositionDto(searchTextWithTextPositionDto, parent, offset, idx, numberOnPage, page); - } - - - public AtomicTextBlock emptyTextBlock(SemanticNode parent, DocumentGraphFactory.Context context, Page page) { - - long idx = textBlockIdx; - textBlockIdx++; - return AtomicTextBlock.empty(idx, stringOffset, page, context.getAndIncrementTextBlockNumberOnPage(page), parent); - } - - - public AtomicTextBlock emptyTextBlockFromInteger(SemanticNode parent, Integer numberOnPage, Page page) { - - long idx = textBlockIdx; - textBlockIdx++; - return AtomicTextBlock.empty(idx, stringOffset, page, numberOnPage, parent); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/GenericSemanticNode.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/GenericSemanticNode.java deleted file mode 100644 index e5505d6f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/nodes/GenericSemanticNode.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes; - -public interface GenericSemanticNode extends SemanticNode { - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/TableMergingUtility.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/TableMergingUtility.java deleted file mode 100644 index 51995d0d..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/TableMergingUtility.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils; - -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Stream; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class TableMergingUtility { - - private static final double TABLE_ALIGNMENT_THRESHOLD = 2d; - - - public List findConsecutiveTablesWithSameColCountAndSameHeaders(TablePageBlock originalTablePageBlock, List pageBlocks) { - - List consecutiveTables = pageBlocks.stream() - .map(abstractPageBlock -> (TablePageBlock) abstractPageBlock) - .filter(tablePageBlock -> !tablePageBlock.equals(originalTablePageBlock)) - .toList(); - assert consecutiveTables.size() == pageBlocks.size() - 1; - - List consecutiveTablesWithSameColCountAndHeaders = new LinkedList<>(); - for (TablePageBlock consecutiveTable : consecutiveTables) { - if (consecutiveTable.getColCount() == originalTablePageBlock.getColCount() && !hasTableHeader(consecutiveTable) && outerBoundaryAlignsX(originalTablePageBlock, - consecutiveTable)) { - consecutiveTablesWithSameColCountAndHeaders.add(consecutiveTable); - } else { - break; - } - } - return Stream.concat(Stream.of(originalTablePageBlock), consecutiveTablesWithSameColCountAndHeaders.stream()).toList(); - } - - - private static boolean outerBoundaryAlignsX(TablePageBlock originalTablePageBlock, TablePageBlock consecutiveTable) { - - return Math.abs(consecutiveTable.getMinX() - originalTablePageBlock.getMinX()) < TABLE_ALIGNMENT_THRESHOLD && Math.abs(consecutiveTable.getMaxX() - originalTablePageBlock.getMaxX()) < TABLE_ALIGNMENT_THRESHOLD; - } - - - private boolean hasTableHeader(TablePageBlock table) { - - return table.getRows().stream().flatMap(Collection::stream).anyMatch(Cell::isHeaderCell); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/TextPositionOperations.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/TextPositionOperations.java deleted file mode 100644 index c2687ea2..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/TextPositionOperations.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils; - -import java.util.List; -import java.util.stream.Collectors; - -import org.apache.pdfbox.util.QuickSort; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -public class TextPositionOperations { - - private static final TextPositionSequenceComparator comparator = new TextPositionSequenceComparator(); - - - public static List mergeAndSortTextPositionSequenceByYThenX(List textBlocks) { - - var sequence = textBlocks.stream().flatMap(tb -> tb.getSequences().stream()).collect(Collectors.toList()); - - // because the TextPositionSequenceComparator is not transitive, but - // JDK7+ enforces transitivity on comparators, we need to use - // a custom quicksort implementation (which is slower, unfortunately). - QuickSort.sort(sequence, comparator); - return sequence; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/TextPositionSequenceComparator.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/TextPositionSequenceComparator.java deleted file mode 100644 index 8e171f5c..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/TextPositionSequenceComparator.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils; - -import java.util.Comparator; - -import org.apache.pdfbox.text.TextPosition; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -/** - * This class is a comparator for TextPosition operators. It handles - * pages with text in different directions by grouping the text based - * on direction and sorting in that direction. This allows continuous text - * in a given direction to be more easily grouped together. - * - * @author Ben Litchfield - */ -public class TextPositionSequenceComparator implements Comparator -{ - @Override - public int compare(TextPositionSequence pos1, TextPositionSequence pos2) - { - // only compare text that is in the same direction - int cmp1 = Float.compare(pos1.getDir().getDegrees(), pos2.getDir().getDegrees()); - if (cmp1 != 0) - { - return cmp1; - } - - // get the text direction adjusted coordinates - float x1 = pos1.getMinXDirAdj(); - float x2 = pos2.getMinXDirAdj(); - - float pos1YBottom = pos1.getMaxYDirAdj(); - float pos2YBottom = pos2.getMaxYDirAdj(); - - // note that the coordinates have been adjusted so 0,0 is in upper left - float pos1YTop = pos1YBottom - pos1.getTextHeight(); - float pos2YTop = pos2YBottom - pos2.getTextHeight(); - - float yDifference = Math.abs(pos1YBottom - pos2YBottom); - - // we will do a simple tolerance comparison - if (yDifference < .1 || - pos2YBottom >= pos1YTop && pos2YBottom <= pos1YBottom || - pos1YBottom >= pos2YTop && pos1YBottom <= pos2YBottom) - { - return Float.compare(x1, x2); - } - else if (pos1YBottom < pos2YBottom) - { - return -1; - } - else - { - return 1; - } - } -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/queue/RedactionMessageReceiver.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/queue/RedactionMessageReceiver.java index dfbf04ba..ac8ae1eb 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/queue/RedactionMessageReceiver.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/queue/RedactionMessageReceiver.java @@ -21,7 +21,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileErrorInfo; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.client.FileStatusProcessingUpdateClient; import com.iqser.red.service.redaction.v1.server.redaction.service.AnalyzeService; import com.iqser.red.service.redaction.v1.server.redaction.service.ManualRedactionSurroundingTextService; @@ -67,39 +66,15 @@ public class RedactionMessageReceiver { @SneakyThrows public void receiveAnalyzeRequest(AnalyzeRequest analyzeRequest, boolean priority) { - log.info("Processing priority: {} analyze request for file: {}", priority, analyzeRequest.getFileId()); + log.info(""); + log.info("Processing AnalyzeRequest for file: {}, priority: {} ", analyzeRequest.getFileId(), priority); + log.info(""); AnalyzeResult result; try { switch (analyzeRequest.getMessageType()) { - case REANALYSE: - log.info(""); - log.info("------------------------------Reanalysis------------------------------------------"); - log.info("Starting Reanalysis for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - log.debug(analyzeRequest.getManualRedactions().toString()); - result = analyzeService.reanalyze(analyzeRequest); - log.info("Successfully reanalyzed dossier {} file {} took: {} s", - analyzeRequest.getDossierId(), - analyzeRequest.getFileId(), - format("%.2f", result.getDuration() / 1000.0)); - log.info("----------------------------------------------------------------------------------"); - break; - - case STRUCTURE_ANALYSE: - log.info(""); - log.info("------------------------------Structure Analysis----------------------------------"); - log.info("Starting Structure Analysis for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - result = analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(analyzeRequest.getDossierId(), analyzeRequest.getFileId())); - log.info("Successfully analyzed structure dossier {} file {} took: {} s", - analyzeRequest.getDossierId(), - analyzeRequest.getFileId(), - format("%.2f", result.getDuration() / 1000.0)); - log.info("----------------------------------------------------------------------------------"); - break; - case ANALYSE: - log.info(""); log.info("------------------------------Full Analysis---------------------------------------"); log.info("Starting Analysis for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); log.debug(analyzeRequest.getManualRedactions().toString()); @@ -111,8 +86,19 @@ public class RedactionMessageReceiver { log.info("----------------------------------------------------------------------------------"); break; + case REANALYSE: + log.info("------------------------------Reanalysis------------------------------------------"); + log.info("Starting Reanalysis for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); + log.debug(analyzeRequest.getManualRedactions().toString()); + result = analyzeService.reanalyze(analyzeRequest); + log.info("Successfully reanalyzed dossier {} file {} took: {} s", + analyzeRequest.getDossierId(), + analyzeRequest.getFileId(), + format("%.2f", result.getDuration() / 1000.0)); + log.info("----------------------------------------------------------------------------------"); + break; + case SURROUNDING_TEXT: - log.info(""); log.info("------------------------------Add surrounding Text--------------------------------"); log.info("Starting surrounding text search for entries {} ", analyzeRequest.getManualRedactions().getEntriesToAdd()); result = manualRedactionSurroundingTextService.addSurroundingText(analyzeRequest.getDossierId(), @@ -128,7 +114,7 @@ public class RedactionMessageReceiver { default: throw new IllegalArgumentException("Unknown MessageType: " + analyzeRequest.getMessageType()); } - + log.info(""); result.setMessageType(analyzeRequest.getMessageType()); fileStatusProcessingUpdateClient.analysisSuccessful(analyzeRequest.getDossierId(), analyzeRequest.getFileId(), result); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/CustomEntityCreationAdapter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/CustomEntityCreationAdapter.java index 3742c2d6..6958e879 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/CustomEntityCreationAdapter.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/CustomEntityCreationAdapter.java @@ -12,7 +12,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -21,14 +20,14 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionPosition; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.SearchImplementation; import lombok.extern.slf4j.Slf4j; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntities.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntities.java index 95e5f5fa..7a87ec76 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntities.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntities.java @@ -4,7 +4,7 @@ import java.util.LinkedList; import java.util.List; import java.util.stream.Stream; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapter.java index 677cd09a..70cd2315 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapter.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapter.java @@ -9,10 +9,10 @@ import java.util.stream.Stream; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; import com.iqser.red.service.redaction.v1.server.client.model.NerEntitiesModel; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/Dictionary.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/Dictionary.java index 6cf4fd71..b4dac375 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/Dictionary.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/Dictionary.java @@ -16,8 +16,8 @@ import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; import com.iqser.red.service.redaction.v1.server.exception.NotFoundException; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.MatchedRule; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns; import lombok.Data; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/DictionaryModel.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/DictionaryModel.java index 9e17b4c4..da25189e 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/DictionaryModel.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/DictionaryModel.java @@ -7,7 +7,7 @@ import java.util.stream.Collectors; import com.iqser.red.service.dictionarymerge.commons.DictionaryEntry; import com.iqser.red.service.dictionarymerge.commons.DictionaryEntryModel; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.MatchedRule; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/SearchImplementation.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/SearchImplementation.java index aa6eab52..cae7949b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/SearchImplementation.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/dictionary/SearchImplementation.java @@ -9,7 +9,7 @@ import java.util.stream.Collectors; import org.ahocorasick.trie.Trie; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import lombok.Data; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java index c24b3dee..69fba0a3 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java @@ -14,7 +14,6 @@ import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestBody; import com.iqser.gin4.commons.metrics.meters.FunctionTimerValues; -import com.iqser.red.service.dictionarymerge.commons.DictionaryEntryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; @@ -24,28 +23,15 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogChanges; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogLegalBasis; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; import com.iqser.red.service.redaction.v1.server.client.model.NerEntitiesModel; -import com.iqser.red.service.redaction.v1.server.exception.RedactionException; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.ImageServiceResponseAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.SimplifiedSectionText; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.SimplifiedText; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service.PdfSegmentationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.DocumentData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.DocumentGraphMapper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.factory.DocumentGraphFactory; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryIncrement; -import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryVersion; import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; @@ -70,63 +56,15 @@ public class AnalyzeService { EntityRedactionService entityRedactionService; RedactionLogCreatorService redactionLogCreatorService; RedactionStorageService redactionStorageService; - PdfSegmentationService pdfSegmentationService; RedactionChangeLogService redactionChangeLogService; LegalBasisClient legalBasisClient; RedactionServiceSettings redactionServiceSettings; - SectionGridCreatorService sectionGridCreatorService; - ImageServiceResponseAdapter imageServiceResponseAdapter; ImportedRedactionService importedRedactionService; SectionFinderService sectionFinderService; FunctionTimerValues redactmanagerAnalyzePagewiseValues; - @Timed("redactmanager_analyzeDocumentStructure") - public AnalyzeResult analyzeDocumentStructure(StructureAnalyzeRequest analyzeRequest) { - - long startTime = System.currentTimeMillis(); - - ClassificationDocument classifiedDoc; - - try { - var storedObjectStream = redactionStorageService.getStoredObject(RedactionStorageService.StorageIdUtils.getStorageId(analyzeRequest.getDossierId(), - analyzeRequest.getFileId(), - FileType.ORIGIN)); - log.info("Loaded PDF for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - Map> pdfImages = null; - if (redactionServiceSettings.isEnableImageClassification()) { - pdfImages = imageServiceResponseAdapter.convertImages(analyzeRequest.getDossierId(), analyzeRequest.getFileId()); - log.info("Loaded image service response for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - } - - classifiedDoc = pdfSegmentationService.parseDocument(analyzeRequest.getDossierId(), analyzeRequest.getFileId(), storedObjectStream, pdfImages); - log.info("Parsed document for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - } catch (Exception e) { - throw new RedactionException(e); - } - - Document document = DocumentGraphFactory.buildDocumentGraph(classifiedDoc); - log.info("Built Document Graph for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - - SectionGrid sectionGrid = sectionGridCreatorService.createSectionGrid(document); - log.info("Built section grid for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - - redactionStorageService.storeObject(analyzeRequest.getDossierId(), analyzeRequest.getFileId(), FileType.TEXT, DocumentData.fromDocument(document)); - redactionStorageService.storeObject(analyzeRequest.getDossierId(), analyzeRequest.getFileId(), FileType.SIMPLIFIED_TEXT, toSimplifiedText(document)); - redactionStorageService.storeObject(analyzeRequest.getDossierId(), analyzeRequest.getFileId(), FileType.SECTION_GRID, sectionGrid); - log.info("Stored document graph, text, simplified text, and section grid for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - - return AnalyzeResult.builder() - .dossierId(analyzeRequest.getDossierId()) - .fileId(analyzeRequest.getFileId()) - .duration(System.currentTimeMillis() - startTime) - .numberOfPages(document.getNumberOfPages()) - .analysisVersion(redactionServiceSettings.getAnalysisVersion()) - .build(); - } - - @Timed("redactmanager_analyze") public AnalyzeResult analyze(AnalyzeRequest analyzeRequest) { @@ -366,18 +304,4 @@ public class AnalyzeService { })); } } - - - private SimplifiedText toSimplifiedText(Document document) { - - List simplifiedSectionTexts = document.getMainSections().stream().map(this::toSimplifiedSectionText).toList(); - return SimplifiedText.builder().numberOfPages(document.getNumberOfPages()).sectionTexts(simplifiedSectionTexts).build(); - } - - - private SimplifiedSectionText toSimplifiedSectionText(Section section) { - - return SimplifiedSectionText.builder().sectionNumber(section.getTreeId().get(0)).text(section.getTextBlock().getSearchText()).build(); - } - } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java index abc763c5..6e1ccdf2 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java @@ -14,7 +14,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.stream.Collector; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; @@ -35,11 +34,11 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.redaction.v1.server.client.RulesClient; import com.iqser.red.service.redaction.v1.server.exception.RulesValidationException; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; @@ -52,13 +51,13 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor -@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = false) public class DroolsExecutionService { - RulesClient rulesClient; + final RulesClient rulesClient; Map kieContainers = new HashMap<>(); - Map rulesVersionPerDossierTemplateId = new HashMap<>(); - EntityEnrichmentService entityEnrichmentService; + final Map rulesVersionPerDossierTemplateId = new HashMap<>(); + final EntityEnrichmentService entityEnrichmentService; public KieContainer getKieContainer(String dossierTemplateId) { @@ -71,6 +70,12 @@ public class DroolsExecutionService { } } + public void invalidateKieContainerCache() { + // TODO: fix this cache! + // This cache fails 5 tests from redactionIntegrationTest + kieContainers = new HashMap<>(); + } + @Timed("redactmanager_executeRules") public List executeRules(KieContainer kieContainer, diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java index 09347f7e..ed195da6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java @@ -12,11 +12,11 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribu import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; import com.iqser.red.service.redaction.v1.server.redaction.adapter.CustomEntityCreationAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.SearchImplementation; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ManualRedactionSurroundingTextService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ManualRedactionSurroundingTextService.java index 405af603..af219805 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ManualRedactionSurroundingTextService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ManualRedactionSurroundingTextService.java @@ -15,15 +15,15 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; import com.iqser.red.service.redaction.v1.server.exception.NotFoundException; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.DocumentGraphMapper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionPosition; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; import io.micrometer.core.annotation.Timed; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java index 6f45290b..cbec7fde 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java @@ -10,13 +10,13 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionPosition; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -112,7 +112,7 @@ public class RedactionLogCreatorService { public RedactionLogEntry createRedactionLogEntry(Image image, String dossierTemplateId) { - String imageType = image.getImageType().equals(ImageType.OTHER) ? "image" : image.getImageType().toString().toLowerCase(); + String imageType = image.getImageType().equals(ImageType.OTHER) ? "image" : image.getImageType().toString().toLowerCase(Locale.ROOT); return RedactionLogEntry.builder() .id(image.getId()) .color(getColor(image.getImageType().toString().toLowerCase(Locale.ROOT), dossierTemplateId, image.isApplied())) diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionFinderService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionFinderService.java index 49b2cdeb..4fb92f20 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionFinderService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionFinderService.java @@ -16,7 +16,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryIncrement; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryIncrementValue; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.SearchImplementation; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionGridCreatorService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionGridCreatorService.java deleted file mode 100644 index 9f4bd0a1..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionGridCreatorService.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.redaction.service; - -import java.awt.geom.Rectangle2D; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collector; -import java.util.stream.Stream; - -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.CellRectangle; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionRectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCell; - -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class SectionGridCreatorService { - - public SectionGrid createSectionGrid(Document document) { - - Map> sectionBBox = document.streamAllSubNodesOfType(NodeType.SECTION).map(SemanticNode::getBBox).collect(new SectionGridCollector()); - Map> paragraphBBox = document.streamAllSubNodesOfType(NodeType.PARAGRAPH).map(SemanticNode::getBBox).collect(new SectionGridCollector()); - Map> headlineBBox = document.streamAllSubNodesOfType(NodeType.HEADLINE).map(SemanticNode::getBBox).collect(new SectionGridCollector()); - Map> tableBBox = document.streamAllSubNodesOfType(NodeType.TABLE).map(node -> (Table) node).collect(new TableGridCollector()); - var sectionGrid = new SectionGrid(); - - sectionGrid.setRectanglesPerPage(mergeMapsByConcatenatingLists(// - mergeMapsByConcatenatingLists(paragraphBBox, headlineBBox), // - mergeMapsByConcatenatingLists(sectionBBox, tableBBox))); - return sectionGrid; - } - - - private static abstract class GridCollector implements Collector>, Map>> { - - @Override - public Supplier>> supplier() { - - return HashMap::new; - } - - - @Override - public Function>, Map>> finisher() { - - return Function.identity(); - } - - - @Override - public BinaryOperator>> combiner() { - - return SectionGridCreatorService::mergeMapsByConcatenatingLists; - } - - - @Override - public Set characteristics() { - - return Set.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT, Characteristics.UNORDERED); - } - - } - - private static class TableGridCollector extends GridCollector { - - @Override - public BiConsumer>, Table> accumulator() { - - return (map, table) -> table.getPages() - .forEach(page -> map.merge(page.getNumber(), List.of(toSectionRectangle(table, page, table.getPages().size())), SectionGridCreatorService::concatLists)); - } - - - private static SectionRectangle toSectionRectangle(Table table, Page page, int numberOfParts) { - - Rectangle2D rect = table.getBBox().get(page); - List tableCellRectangles = table.streamTableCells() - .map(TableCell::getBBox) - .map(map -> map.get(page)) - .filter(Objects::nonNull) - .map(rectangle2D -> new CellRectangle(new Point((float) rectangle2D.getX(), (float) rectangle2D.getY()), - (float) rectangle2D.getWidth(), - (float) rectangle2D.getHeight())) - .toList(); - return new SectionRectangle(new Point((float) rect.getX(), (float) rect.getY()), - (float) rect.getWidth(), - (float) rect.getHeight(), - 1, - numberOfParts, - tableCellRectangles); - } - - } - - private static class SectionGridCollector extends GridCollector> { - - @Override - public BiConsumer>, Map> accumulator() { - - return (mapToKeep, mapToMerge) -> mapToMerge.forEach((page, rectangle) -> mapToKeep.merge(page.getNumber(), - List.of(toSectionRectangle(rectangle, mapToMerge.values().size())), - SectionGridCreatorService::concatLists)); - - } - - - private static SectionRectangle toSectionRectangle(Rectangle2D rect, int numberOfParts) { - - return new SectionRectangle(new Point((float) rect.getX(), (float) rect.getY()), (float) rect.getWidth(), (float) rect.getHeight(), 1, numberOfParts, null); - } - - } - - - private static Map> mergeMapsByConcatenatingLists(Map> mapToKeep, - Map> mapToMerge) { - - mapToMerge.forEach((page, rectangle) -> mapToKeep.merge(page, rectangle, SectionGridCreatorService::concatLists)); - return mapToKeep; - } - - - private static List concatLists(List l1, List l2) { - - return Stream.concat(l1.stream(), l2.stream()).toList(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/IdBuilder.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/IdBuilder.java index d1a3da42..7547c4a5 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/IdBuilder.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/IdBuilder.java @@ -9,7 +9,7 @@ import java.util.stream.Collectors; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; import lombok.experimental.UtilityClass; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/ResourceLoader.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/ResourceLoader.java index 2f8f4d28..893381ac 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/ResourceLoader.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/ResourceLoader.java @@ -15,7 +15,7 @@ public final class ResourceLoader { public Set load(String classpathPath) { - URL resource = ResourceLoader.class.getClassLoader().getResource(classpathPath); + URL resource = Thread.currentThread().getContextClassLoader().getResource(classpathPath); if (resource == null) { throw new IllegalArgumentException("could not load classpath resource: " + classpathPath); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SeparatorUtils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SeparatorUtils.java index 544c44c3..2d216334 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SeparatorUtils.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SeparatorUtils.java @@ -3,8 +3,8 @@ package com.iqser.red.service.redaction.v1.server.redaction.utils; import java.util.Set; import java.util.regex.Pattern; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java index dba81456..2e9c6c18 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java @@ -10,9 +10,13 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; import com.iqser.red.service.redaction.v1.server.client.model.NerEntitiesModel; import com.iqser.red.service.redaction.v1.server.exception.NotFoundException; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.DocumentData; +import com.iqser.red.service.redaction.v1.server.document.data.DocumentData; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPage; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPositionData; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentStructure; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentTextData; import com.knecon.fforesight.tenantcommons.TenantContext; import io.micrometer.core.annotation.Timed; @@ -82,7 +86,12 @@ public class RedactionStorageService { public DocumentData getDocumentData(String dossierId, String fileId) { try { - return storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT), DocumentData.class); + return DocumentData.builder() + .documentStructure(storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_STRUCTURE), DocumentStructure.class)) + .documentTextData(storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_TEXT), DocumentTextData[].class)) + .documentPositionData(storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_POSITION), DocumentPositionData[].class)) + .documentPages(storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_PAGES), DocumentPage[].class)) + .build(); } catch (StorageObjectDoesNotExist e) { log.debug("DocumentData not available."); return null; diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/AbstractRedactionIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/AbstractRedactionIntegrationTest.java index 0ba5be71..b0b3d1f5 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/AbstractRedactionIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/AbstractRedactionIntegrationTest.java @@ -40,7 +40,11 @@ import com.iqser.red.service.redaction.v1.server.redaction.service.ManualRedacti import com.iqser.red.service.redaction.v1.server.redaction.utils.ResourceLoader; import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; +import com.iqser.red.service.redaction.v1.server.utils.LayoutParsingRequestProvider; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingFinishedEvent; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingPipeline; import com.knecon.fforesight.tenantcommons.TenantContext; import com.knecon.fforesight.tenantcommons.TenantsClient; @@ -112,6 +116,9 @@ public abstract class AbstractRedactionIntegrationTest { @Autowired protected ManualRedactionSurroundingTextService manualRedactionSurroundingTextService; + @Autowired + private LayoutParsingPipeline layoutParsingPipeline; + @MockBean protected AmazonS3 amazonS3; @@ -242,7 +249,7 @@ public abstract class AbstractRedactionIntegrationTest { @SneakyThrows protected static String loadFromClassPath(String path) { - URL resource = ResourceLoader.class.getClassLoader().getResource(path); + URL resource = Thread.currentThread().getContextClassLoader().getResource(path); if (resource == null) { throw new IllegalArgumentException("could not load classpath resource:" + path); } @@ -417,7 +424,7 @@ public abstract class AbstractRedactionIntegrationTest { private List toDictionaryEntry(List entries) { if (entries == null) { - entries = Collections.emptyList(); + return Collections.emptyList(); } return entries.stream().map(this::toDictionaryEntry).collect(Collectors.toList()); @@ -437,6 +444,14 @@ public abstract class AbstractRedactionIntegrationTest { } + @SneakyThrows + protected LayoutParsingFinishedEvent analyzeDocumentStructure(LayoutParsingType layoutParsingType, AnalyzeRequest request) { + + + return layoutParsingPipeline.parseLayoutAndSaveFilesToStorage(LayoutParsingRequestProvider.build(layoutParsingType, request)); + } + + @SneakyThrows protected AnalyzeRequest prepareStorage(String file, String cvServiceResponseFile) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumineFloraTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumineFloraTest.java index 0e5b4516..9a882f88 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumineFloraTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumineFloraTest.java @@ -25,12 +25,13 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequ import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse; import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; @ExtendWith(SpringExtension.class) @@ -51,7 +52,7 @@ public class DocumineFloraTest extends AbstractRedactionIntegrationTest { // "files/Documine/Flora/ProblemDocs/SOLICITA_VICTRATO-GOLD-II_Item 21_Mutacao_Genica (1).TABLES.json"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.DOCUMINE, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -77,7 +78,7 @@ public class DocumineFloraTest extends AbstractRedactionIntegrationTest { "files/Documine/Flora/A8591B/2009773e2e05919bb9e46aeedcc8b924.ORIGIN.TABLES.json"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.DOCUMINE, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -104,7 +105,7 @@ public class DocumineFloraTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/Documine/Flora/ProblemDocs/SOLICITA_VICTRATO-GOLD-II_Item 15_Toxicidade Oral Aguda.pdf"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.DOCUMINE, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -123,6 +124,7 @@ public class DocumineFloraTest extends AbstractRedactionIntegrationTest { @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) static class RedactionIntegrationTestConfiguration { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/HeadlinesGoldStandardIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/HeadlinesGoldStandardIntegrationTest.java deleted file mode 100644 index 66d2da03..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/HeadlinesGoldStandardIntegrationTest.java +++ /dev/null @@ -1,217 +0,0 @@ -package com.iqser.red.service.redaction.v1.server; - -import java.io.InputStream; -import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.ClassPathResource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ChangeType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.DocumentGraphMapper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.redaction.service.AnalyzeService; -import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; -import com.iqser.red.storage.commons.StorageAutoConfiguration; -import com.iqser.red.storage.commons.service.StorageService; -import com.knecon.fforesight.tenantcommons.TenantContext; -import com.knecon.fforesight.tenantcommons.TenantsClient; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.SneakyThrows; -import lombok.ToString; - -@ExtendWith(SpringExtension.class) -@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@Import(HeadlinesGoldStandardIntegrationTest.RedactionIntegrationTestConfiguration.class) -public class HeadlinesGoldStandardIntegrationTest { - - @MockBean - private TenantsClient tenantsClient; - - @Autowired - private AnalyzeService analyzeService; - - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private RedactionStorageService redactionStorageService; - - @Autowired - private StorageService storageService; - - private final static String TEST_DOSSIER_TEMPLATE_ID = "123"; - private final static String TEST_DOSSIER_ID = "123"; - private final static String TEST_FILE_ID = "123"; - - - @Test - public void testHeadlineDetection() { - - List metrics = new ArrayList<>(); - metrics.add(getMetrics("files/RSS/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1).pdf", - "files/Headlines/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1)_REDACTION_LOG.json")); - metrics.add(getMetrics("files/Trinexapac/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23.pdf", - "files/Headlines/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23_REDACTION_LOG.json")); - metrics.add(getMetrics("files/Metolachlor/S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf", "files/Headlines/S-Metolachlor_RAR_01_Volume_1_2018-09-06_REDACTION_LOG.json")); - - double precision = metrics.stream().mapToDouble(Metrics::getPrecision).average().orElse(1.0); - double recall = metrics.stream().mapToDouble(Metrics::getRecall).average().orElse(1.0); - - System.out.println("Precision is: " + precision + " recall is: " + recall); - - Assertions.assertThat(precision).isGreaterThanOrEqualTo(0.44f); - Assertions.assertThat(recall).isGreaterThanOrEqualTo(0.69f); - } - - - @SneakyThrows - private Metrics getMetrics(String fileUrl, String redactionLogUrl) { - - ClassPathResource redactionLogResource = new ClassPathResource(redactionLogUrl); - - Set goldStandardHeadlines = new HashSet<>(); - var goldStandardLog = objectMapper.readValue(redactionLogResource.getInputStream(), RedactionLog.class); - goldStandardLog.getRedactionLogEntry().removeIf(r -> !r.isRedacted() || r.getChanges().get(r.getChanges().size() - 1).getType().equals(ChangeType.REMOVED)); - goldStandardLog.getRedactionLogEntry().forEach(e -> goldStandardHeadlines.add(new Headline(e.getPositions().get(0).getPage(), e.getValue()))); - - AnalyzeRequest request = prepareStorage(fileUrl); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); - - var documentGraph = DocumentGraphMapper.toDocumentGraph(redactionStorageService.getDocumentData(TEST_DOSSIER_ID, TEST_FILE_ID)); - var foundHeadlines = documentGraph.streamAllSubNodes() - .map(SemanticNode::getHeadline) - .distinct() - .map(headlineNode -> new Headline(headlineNode.getPages().stream().findFirst().get().getNumber(), headlineNode.getTextBlock().getSearchText().stripTrailing())) - .toList(); - - Set correct = new HashSet<>(); - Set missing; - Set falsePositive = new HashSet<>(); - for (Headline headline : foundHeadlines) { - if (goldStandardHeadlines.contains(headline)) { - correct.add(headline); - } else { - falsePositive.add(headline); - } - } - - missing = goldStandardHeadlines.stream().filter(h -> !correct.contains(h)).collect(Collectors.toSet()); - - float precision = (float) correct.size() / (float) foundHeadlines.size(); - float recall = (float) correct.size() / ((float) correct.size() + (float) missing.size()); - - return new Metrics(precision, recall); - } - - - @Configuration - @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class/*, StorageAutoConfiguration.class*/}) - @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) - public static class RedactionIntegrationTestConfiguration { - - @Bean - @Primary - public StorageService inmemoryStorage() { - - return new FileSystemBackedStorageService(); - } - - } - - - @AfterEach - public void cleanupStorage() { - - if (this.storageService instanceof FileSystemBackedStorageService) { - ((FileSystemBackedStorageService) this.storageService).clearStorage(); - } - } - - - @SneakyThrows - private AnalyzeRequest prepareStorage(String file) { - - return prepareStorage(file, "files/cv_service_empty_response.json"); - } - - - @SneakyThrows - private AnalyzeRequest prepareStorage(String file, String cvServiceResponseFile) { - - ClassPathResource pdfFileResource = new ClassPathResource(file); - ClassPathResource cvServiceResponseFileResource = new ClassPathResource(cvServiceResponseFile); - - return prepareStorage(pdfFileResource.getInputStream(), cvServiceResponseFileResource.getInputStream()); - } - - - @SneakyThrows - private AnalyzeRequest prepareStorage(InputStream fileStream, InputStream cvServiceResponseFileStream) { - - AnalyzeRequest request = AnalyzeRequest.builder() - .dossierTemplateId(TEST_DOSSIER_TEMPLATE_ID) - .dossierId(TEST_DOSSIER_ID) - .fileId(TEST_FILE_ID) - .lastProcessed(OffsetDateTime.now()) - .build(); - - storageService.storeObject(TenantContext.getTenantId(), - RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.TABLES), - cvServiceResponseFileStream); - storageService.storeObject(TenantContext.getTenantId(), RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.ORIGIN), fileStream); - - return request; - } - - - @Data - @EqualsAndHashCode - @AllArgsConstructor - @ToString - private class Metrics { - - private float precision; - private float recall; - - } - - @Data - @EqualsAndHashCode - @AllArgsConstructor - @ToString - private class Headline { - - private int page; - private String headline; - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionAcceptanceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionAcceptanceTest.java index 8c91f660..fb277871 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionAcceptanceTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionAcceptanceTest.java @@ -1,7 +1,6 @@ package com.iqser.red.service.redaction.v1.server; import static org.mockito.Mockito.when; -import static org.wildfly.common.Assert.assertFalse; import static org.wildfly.common.Assert.assertTrue; import java.io.FileOutputStream; @@ -34,12 +33,13 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSON import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse; import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; @ExtendWith(SpringExtension.class) @@ -51,6 +51,7 @@ public class RedactionAcceptanceTest extends AbstractRedactionIntegrationTest { @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) public static class RedactionIntegrationTestConfiguration { @@ -101,7 +102,7 @@ public class RedactionAcceptanceTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/new/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections.pdf"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -158,7 +159,7 @@ public class RedactionAcceptanceTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/new/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections.pdf"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java index 5eef2b49..3bb3842a 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java @@ -66,21 +66,23 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.DocumentGraphMapper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.redaction.service.DroolsExecutionService; import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; @@ -94,8 +96,12 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { @Autowired private EntityEnrichmentService entityEnrichmentService; + @Autowired + private DroolsExecutionService droolsExecutionService; + @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import({LayoutParsingServiceProcessorConfiguration.class}) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) public static class RedactionIntegrationTestConfiguration { @@ -107,6 +113,11 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { } } + @BeforeEach + public void invalidateCaches() { + + droolsExecutionService.invalidateKieContainerCache(); + } @BeforeEach @@ -145,7 +156,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { public void test270Rotated() { AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/270Rotated.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); assertThat(result).isNotNull(); } @@ -156,7 +167,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { public void testLargeScannedFileOOM() { AnalyzeRequest request = uploadFileToStorage("scanned/VV-377031.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); assertThat(result).isNotNull(); } @@ -168,7 +179,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/merge_images.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); Map> duplicates = new HashMap<>(); @@ -209,7 +220,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { // Lastname M., Doe J., Mustermann M. AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/ExpansionTest.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -225,7 +236,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/new/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections.pdf"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -247,7 +258,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/RSS/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1).pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); assertThat(result.getAddedFileAttributes().size()).isEqualTo(1); @@ -264,7 +275,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/new/test-ignore-hint.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -298,8 +309,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); System.out.println("noExceptionShouldBeThrownForAnyFiles"); - ClassLoader loader = getClass().getClassLoader(); - URL url = loader.getResource("files"); + URL url = Thread.currentThread().getContextClassLoader().getResource("files"); Path path = Paths.get(URI.create(url.toString())); when(dictionaryClient.getDictionaryForType(anyString(), anyLong())).thenReturn(new Type()); Files.walk(path)// @@ -308,7 +318,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { .forEach(currentPath -> { AnalyzeRequest request = uploadFileToStorage(currentPath.toString()); System.out.println("Redacting file : " + currentPath.getFileName()); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); long fstart = System.currentTimeMillis(); AnalyzeResult result = analyzeService.analyze(request); @@ -360,7 +370,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { .value("true") .build())); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -414,13 +424,12 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { ManualRedactions manualRedactions = new ManualRedactions(); manualRedactions.setEntriesToAdd(Set.of(ManualRedactionEntry.builder() - .value("Redact") - .addToDictionary(true) - .addToDossierDictionary(true) - .positions(List.of(new Rectangle(new Point(95.96979999999999f, 515.7984f), 19.866899999999987f, 46.953f, 2) - )).type("dossier_redaction").build())); - - + .value("Redact") + .addToDictionary(true) + .addToDossierDictionary(true) + .positions(List.of(new Rectangle(new Point(95.96979999999999f, 515.7984f), 19.866899999999987f, 46.953f, 2))) + .type("dossier_redaction") + .build())); request.setManualRedactions(manualRedactions); @@ -460,7 +469,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(fileName); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); dictionary.get(DICTIONARY_AUTHOR).add("report"); @@ -516,7 +525,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { .value("true") .build())); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -614,7 +623,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { List types = objectMapper.readValue(typeResource.getInputStream(), typeRefForTypes); AnalyzeRequest request = uploadFileToStorage("files/new/PublishedInformationTest.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); ManualRedactions manualRedactions = new ManualRedactions(); manualRedactions.getIdsToRemove() .add(IdRemoval.builder() @@ -673,7 +682,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/Metolachlor/S-Metolachlor_RAR_02_Volume_2_2018-09-06.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -694,7 +703,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { String filePath = "files/new/crafted document.pdf"; AnalyzeRequest request = uploadFileToStorage(filePath); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); String testEntityValue1 = "Desiree"; @@ -766,7 +775,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { String tableServiceResponseFile = "files/cv_table_response_VV-511309.json"; AnalyzeRequest request = prepareStorage(fileName, tableServiceResponseFile); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -790,7 +799,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { String tableServiceResponseFile = "files/cv_table_response_VV-511309.json"; AnalyzeRequest request = prepareStorage(fileName, tableServiceResponseFile); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -811,7 +820,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/new/unicodeProblem.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -833,7 +842,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/new/RotateTestFile.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -859,7 +868,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/new/RotateTestFileSimple.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -881,7 +890,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/NoHeaderTable.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -934,7 +943,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { request.setManualRedactions(manualRedactions); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -993,7 +1002,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(pdfFile); request.setManualRedactions(manualRedactions); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); manualRedactions.getEntriesToAdd().add(manualRedactionEntry); @@ -1026,7 +1035,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/Phantom Cells.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -1046,7 +1055,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/sponsor_companies.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -1108,7 +1117,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(pdfFile); request.setManualRedactions(manualRedactions); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); manualRedactions.getEntriesToAdd().add(manualRedactionEntry); @@ -1163,7 +1172,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/Metolachlor/S-Metolachlor_RAR_02_Volume_2_2018-09-06.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -1219,7 +1228,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(pdfFile); request.setManualRedactions(manualRedactions); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder() @@ -1252,7 +1261,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.IMPORTED_REDACTIONS), importedRedactions.getInputStream()); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -1292,7 +1301,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(fileName); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationV2Test.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationV2Test.java index 3b656fdf..68f8060a 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationV2Test.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationV2Test.java @@ -24,9 +24,10 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSON import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; @@ -40,6 +41,7 @@ public class RedactionIntegrationV2Test extends AbstractRedactionIntegrationTest @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) static class RedactionIntegrationTestConfiguration { @@ -112,7 +114,7 @@ public class RedactionIntegrationV2Test extends AbstractRedactionIntegrationTest when(dictionaryClient.getVersion(TEST_DOSSIER_TEMPLATE_ID)).thenReturn(3L); mockDictionaryCalls(0L); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -150,7 +152,7 @@ public class RedactionIntegrationV2Test extends AbstractRedactionIntegrationTest dictionary.put(DICTIONARY_AUTHOR, List.of(entryAuthorDictionary)); falsePositive.put(DICTIONARY_PII, List.of("Dr. Alan Miller COMPLETION DATE:")); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java index a1f81376..3b22caa0 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java @@ -72,18 +72,22 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogComment; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogLegalBasis; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.client.DictionaryClient; import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; import com.iqser.red.service.redaction.v1.server.client.RulesClient; import com.iqser.red.service.redaction.v1.server.controller.RedactionController; -import com.iqser.red.service.redaction.v1.server.redaction.service.ManualRedactionSurroundingTextService; import com.iqser.red.service.redaction.v1.server.redaction.service.AnalyzeService; +import com.iqser.red.service.redaction.v1.server.redaction.service.ManualRedactionSurroundingTextService; import com.iqser.red.service.redaction.v1.server.redaction.utils.ResourceLoader; import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; +import com.iqser.red.service.redaction.v1.server.utils.LayoutParsingRequestProvider; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingFinishedEvent; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingPipeline; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; import com.knecon.fforesight.tenantcommons.TenantsClient; @@ -123,8 +127,8 @@ public class RulesTest { private final static String TEST_DOSSIER_TEMPLATE_ID = "123"; private final static String TEST_DOSSIER_ID = "123"; private String TEST_FILE_ID = "123"; - private int counter = 0; - private int fileSize = 0; + private int counter; + private int fileSize; private final Map> dictionary = new HashMap<>(); private final Map> dossierDictionary = new HashMap<>(); private final Map> falsePositive = new HashMap<>(); @@ -237,6 +241,8 @@ public class RulesTest { @Autowired private RedactionStorageService redactionStorageService; @Autowired + private LayoutParsingPipeline layoutParsingPipeline; + @Autowired private StorageService storageService; @Autowired private ManualRedactionSurroundingTextService manualRedactionSurroundingTextService; @@ -399,7 +405,7 @@ public class RulesTest { loadNerForTest(); AnalyzeRequest request = prepareStorage(fileName); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeService.analyze(request); RedactionLog redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -422,7 +428,7 @@ public class RulesTest { loadNerForTest(); AnalyzeRequest request = prepareStorage(fileName); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER); analyzeService.analyze(request); RedactionLog redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -798,7 +804,7 @@ public class RulesTest { private static String loadFromClassPath(String path) { - URL resource = ResourceLoader.class.getClassLoader().getResource(path); + URL resource = Thread.currentThread().getContextClassLoader().getResource(path); if (resource == null) { throw new IllegalArgumentException("could not load classpath resource: " + path); } @@ -815,8 +821,17 @@ public class RulesTest { } + @SneakyThrows + protected LayoutParsingFinishedEvent analyzeDocumentStructure(LayoutParsingType layoutParsingType) { + + return layoutParsingPipeline.parseLayoutAndSaveFilesToStorage(LayoutParsingRequestProvider.build(layoutParsingType, + AnalyzeRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build())); + } + + @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) public static class RulesTestConfiguration { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java index 0fbc010b..7f3d43d6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java @@ -1,7 +1,5 @@ package com.iqser.red.service.redaction.v1.server.annotate; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations.toPDRectangleBBox; - import java.awt.Color; import java.awt.geom.Rectangle2D; import java.io.ByteArrayOutputStream; @@ -14,17 +12,19 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.io.MemoryUsageSetting; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts; import org.apache.pdfbox.pdmodel.graphics.color.PDColor; import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationHighlight; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationText; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup; import org.springframework.stereotype.Service; import com.google.common.primitives.Floats; @@ -36,6 +36,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.CellRectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionRectangle; +import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; import com.iqser.red.service.redaction.v1.server.exception.RedactionException; import com.iqser.red.service.redaction.v1.server.redaction.service.DictionaryService; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; @@ -73,7 +74,7 @@ public class AnnotationService { var redactionLog = redactionStorageService.getRedactionLog(annotateRequest.getDossierId(), annotateRequest.getFileId()); var sectionsGrid = redactionStorageService.getSectionGrid(annotateRequest.getDossierId(), annotateRequest.getFileId()); - try (PDDocument pdDocument = PDDocument.load(storedObjectStream, MemoryUsageSetting.setupTempFileOnly())) { + try (PDDocument pdDocument = Loader.loadPDF(storedObjectStream, MemoryUsageSetting.setupTempFileOnly())) { pdDocument.setAllSecurityToBeRemoved(true); dictionaryService.updateDictionary(annotateRequest.getDossierTemplateId(), annotateRequest.getDossierId()); @@ -123,6 +124,17 @@ public class AnnotationService { } } + public static PDRectangle toPDRectangleBBox(List rectangles) { + + Rectangle2D rectangle2D = RectangleTransformations.rectangleBBox(rectangles); + + PDRectangle annotationPosition = new PDRectangle(); + annotationPosition.setLowerLeftX((float) rectangle2D.getMinX()); + annotationPosition.setLowerLeftY((float) rectangle2D.getMinY()); + annotationPosition.setUpperRightX((float) rectangle2D.getMaxX()); + annotationPosition.setUpperRightY((float) rectangle2D.getMaxY()); + return annotationPosition; + } private List createAnnotation(RedactionLogEntry redactionLogEntry, int page, int rotation, PDRectangle cropBox) { @@ -134,7 +146,7 @@ public class AnnotationService { return annotations; } - PDAnnotationTextMarkup annotation = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT); + PDAnnotationHighlight annotation = new PDAnnotationHighlight(); annotation.constructAppearances(); PDRectangle pdRectangle = toPDRectangleBBox(rectangles); annotation.setRectangle(pdRectangle); @@ -232,7 +244,7 @@ public class AnnotationService { contentStream.beginText(); contentStream.setNonStrokingColor(Color.DARK_GRAY); - contentStream.setFont(PDType1Font.TIMES_ROMAN, 8f); + contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.TIMES_ROMAN), 8f); if (sectionRectangle.getTableCells() == null) { contentStream.newLineAtOffset(sectionRectangle.getTopLeft().getX(), sectionRectangle.getTopLeft().getY() + sectionRectangle.getHeight()); } else { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/entity/RedactionEntityTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/entity/RedactionEntityTest.java index 2c261855..bcea5ea7 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/entity/RedactionEntityTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/entity/RedactionEntityTest.java @@ -5,9 +5,9 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; public class RedactionEntityTest { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BoundaryTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BoundaryTest.java index 488cf027..d7918ca3 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BoundaryTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BoundaryTest.java @@ -11,8 +11,6 @@ import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; - class BoundaryTest { Boundary startBoundary; diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BuildDocumentIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BuildDocumentIntegrationTest.java index d90b30d2..07dea061 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BuildDocumentIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BuildDocumentIntegrationTest.java @@ -1,12 +1,6 @@ package com.iqser.red.service.redaction.v1.server.document.graph; -import java.io.InputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -16,20 +10,18 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; -import org.springframework.core.io.ClassPathResource; import org.springframework.test.context.junit.jupiter.SpringExtension; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.redaction.v1.server.AbstractRedactionIntegrationTest; import com.iqser.red.service.redaction.v1.server.Application; import com.iqser.red.service.redaction.v1.server.FileSystemBackedStorageService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.ImageServiceResponseAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service.PdfSegmentationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.factory.DocumentGraphFactory; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import lombok.SneakyThrows; @@ -40,6 +32,7 @@ public class BuildDocumentIntegrationTest extends AbstractRedactionIntegrationTe @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) public static class TestConfiguration { @@ -52,50 +45,36 @@ public class BuildDocumentIntegrationTest extends AbstractRedactionIntegrationTe } - @Autowired - private PdfSegmentationService segmentationService; - - @Autowired - private ImageServiceResponseAdapter imageServiceResponseAdapter; - - @SneakyThrows protected Document buildGraph(String filename) { + String fileNameWithPdf = filename; if (!filename.endsWith(".pdf")) { - filename = filename + ".pdf"; + fileNameWithPdf = filename + ".pdf"; } - if (filename.equals("files/Metolachlor/S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf")) { - prepareStorage(filename, "files/cv_service_empty_response.json", filename.replace(".pdf", ".IMAGE_INFO.json")); + AnalyzeRequest request; + if (fileNameWithPdf.equals("files/Metolachlor/S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf")) { + request = prepareStorage(fileNameWithPdf, "files/cv_service_empty_response.json", fileNameWithPdf.replace(".pdf", ".IMAGE_INFO.json")); } else { - uploadFileToStorage(filename); + request = uploadFileToStorage(fileNameWithPdf); } - ClassPathResource fileResource = new ClassPathResource(filename); - try (InputStream inputStream = fileResource.getInputStream()) { - Map> pdfImages = imageServiceResponseAdapter.convertImages(TEST_DOSSIER_ID, TEST_FILE_ID); - ClassificationDocument classifiedDoc = segmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, inputStream, pdfImages); - return DocumentGraphFactory.buildDocumentGraph(classifiedDoc); - } + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); + return DocumentGraphMapper.toDocumentGraph(redactionStorageService.getDocumentData(request.getDossierId(), request.getFileId())); } @SneakyThrows protected Document buildGraphNoImages(String filename) { + String fileNameWithPdf = filename; if (!filename.endsWith(".pdf")) { - filename = filename + ".pdf"; + fileNameWithPdf = filename + ".pdf"; } - uploadFileToStorage(filename); - - ClassPathResource fileResource = new ClassPathResource(filename); - - try (InputStream inputStream = fileResource.getInputStream()) { - Map> pdfImages = new HashMap<>(); - ClassificationDocument classifiedDoc = segmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, inputStream, pdfImages); - return DocumentGraphFactory.buildDocumentGraph(classifiedDoc); - } + var request = uploadFileToStorage(fileNameWithPdf); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); + return DocumentGraphMapper.toDocumentGraph(redactionStorageService.getDocumentData(request.getDossierId(), request.getFileId())); } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentEntityInsertionIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentEntityInsertionIntegrationTest.java index 7b9958ea..96a70a1f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentEntityInsertionIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentEntityInsertionIntegrationTest.java @@ -16,21 +16,19 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Headline; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Headline; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.NodeType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; public class DocumentEntityInsertionIntegrationTest extends BuildDocumentIntegrationTest { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentMappingIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentMappingIntegrationTest.java deleted file mode 100644 index c02ec70f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentMappingIntegrationTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.graph; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.wildfly.common.Assert.assertTrue; - -import org.junit.jupiter.api.Test; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.AtomicPositionBlockData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.AtomicTextBlockData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.DocumentData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.DocumentTreeData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.PageData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.DocumentGraphMapper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.PropertiesMapper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.knecon.fforesight.tenantcommons.TenantContext; - -import lombok.SneakyThrows; - -public class DocumentMappingIntegrationTest extends BuildDocumentIntegrationTest { - - @Test - @SneakyThrows - public void testGraphMapping() { - - String filename = "files/new/crafted document"; - - Document document = buildGraph(filename); - DocumentData documentData = DocumentData.fromDocument(document); - - storageService.storeJSONObject(TenantContext.getTenantId(), filename + "_PAGES" + ".json", documentData.getPages()); - storageService.storeJSONObject(TenantContext.getTenantId(), filename + "_TEXT" + ".json", documentData.getAtomicTextBlocks()); - storageService.storeJSONObject(TenantContext.getTenantId(), filename + "_POSITIONS" + ".json", documentData.getAtomicPositionBlocks()); - storageService.storeJSONObject(TenantContext.getTenantId(), filename + "_STRUCTURE" + ".json", documentData.getDocumentTreeData()); - - PageData[] pageData = storageService.readJSONObject(TenantContext.getTenantId(), filename + "_PAGES" + ".json", PageData[].class); - AtomicTextBlockData[] atomicTextBlockData = storageService.readJSONObject(TenantContext.getTenantId(), filename + "_TEXT" + ".json", AtomicTextBlockData[].class); - AtomicPositionBlockData[] atomicPositionBlockData = storageService.readJSONObject(TenantContext.getTenantId(), - filename + "_POSITIONS" + ".json", - AtomicPositionBlockData[].class); - DocumentTreeData documentTreeData = storageService.readJSONObject(TenantContext.getTenantId(), filename + "_STRUCTURE" + ".json", DocumentTreeData.class); - - DocumentData documentData2 = DocumentData.builder() - .pages(pageData) - .documentTreeData(documentTreeData) - .atomicTextBlocks(atomicTextBlockData) - .atomicPositionBlocks(atomicPositionBlockData) - .build(); - Document newDocument = DocumentGraphMapper.toDocumentGraph(documentData2); - - assertTrue(allTablesHavePositiveNumberOfRowsAndColumns(document)); - assertTrue(allTablesHavePositiveNumberOfRowsAndColumns(documentData)); - assertTrue(allTablesHavePositiveNumberOfRowsAndColumns(documentData2)); - assertTrue(allTablesHavePositiveNumberOfRowsAndColumns(newDocument)); - - assertEquals(document.toString(), newDocument.toString()); - assertEquals(document.getDocumentTree().toString(), newDocument.getDocumentTree().toString()); - } - - - private static boolean allTablesHavePositiveNumberOfRowsAndColumns(Document document) { - - return document.streamAllSubNodes() - .filter(semanticNode -> semanticNode instanceof Table) - .map(semanticNode -> (Table) semanticNode) - .allMatch(tableNode -> tableNode.getNumberOfCols() > 0 && tableNode.getNumberOfRows() > 0); - } - - - private static boolean allTablesHavePositiveNumberOfRowsAndColumns(DocumentData documentData) { - - return documentData.getDocumentTreeData() - .streamAllEntries() - .filter(entryData -> entryData.getType().equals(NodeType.TABLE)) - .map(DocumentTreeData.EntryData::getProperties) - .map(properties -> { - var builder = Table.builder(); - PropertiesMapper.parseTableProperties(properties, builder); - return builder.build(); - }) - .allMatch(tableNode -> tableNode.getNumberOfCols() > 0 && tableNode.getNumberOfRows() > 0); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentPerformanceIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentPerformanceIntegrationTest.java index fd964cb2..9b44657b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentPerformanceIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentPerformanceIntegrationTest.java @@ -11,6 +11,7 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,16 +32,16 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribu import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.PdfVisualisationUtility; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; @@ -250,8 +251,7 @@ public class DocumentPerformanceIntegrationTest extends BuildDocumentIntegration var tmpFileName = "/tmp/" + filename.split("/")[2] + "_ENTITY_BBOX.pdf"; var fileResource = new ClassPathResource(filename + ".pdf"); - try (var fileStream = fileResource.getInputStream()) { - PDDocument pdDocument = PDDocument.load(fileStream); + try (var fileStream = fileResource.getInputStream(); PDDocument pdDocument = Loader.loadPDF(fileStream)) { for (Page page : document.getPages()) { List entityPositionsOnPage = page.getEntities() @@ -282,7 +282,6 @@ public class DocumentPerformanceIntegrationTest extends BuildDocumentIntegration } File outputFile = new File(tmpFileName); pdDocument.save(outputFile); - pdDocument.close(); } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentTableIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentTableIntegrationTest.java index dab62c2e..675b92e3 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentTableIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentTableIntegrationTest.java @@ -4,10 +4,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCell; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; public class DocumentTableIntegrationTest extends BuildDocumentIntegrationTest { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentVisualizationIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentVisualizationIntegrationTest.java index 48bcc90c..84e870cb 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentVisualizationIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentVisualizationIntegrationTest.java @@ -2,16 +2,16 @@ package com.iqser.red.service.redaction.v1.server.document.graph; import java.awt.Color; import java.io.File; -import java.io.IOException; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.core.io.ClassPathResource; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.PdfVisualisationUtility; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility; import lombok.SneakyThrows; @@ -73,20 +73,20 @@ public class DocumentVisualizationIntegrationTest extends BuildDocumentIntegrati } - private static void visualizeSemanticNodes(String filename, Document document, TextBlock textBlock) throws IOException { + @SneakyThrows + private static void visualizeSemanticNodes(String filename, Document document, TextBlock textBlock) { var tmpFileName = "/tmp/" + filename.split("/")[2] + "_SEMANTIC_NODES_BBOX.pdf"; var fileResource = new ClassPathResource(filename + ".pdf"); - try (var fileStream = fileResource.getInputStream()) { - PDDocument pdDocument = PDDocument.load(fileStream); + try (var fileStream = fileResource.getInputStream(); PDDocument pdDocument = Loader.loadPDF(fileStream)) { + PdfVisualisationUtility.drawDocumentGraph(pdDocument, document); PdfVisualisationUtility.drawTextBlock(pdDocument, textBlock, PdfVisualisationUtility.Options.builder().stroke(true).strokeWidth(0.1f).strokeColor(Color.YELLOW).build()); File outputFile = new File(tmpFileName); pdDocument.save(outputFile); - pdDocument.close(); } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/ManualResizeRedactionIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/ManualResizeRedactionIntegrationTest.java index ec0d3674..8ec79895 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/ManualResizeRedactionIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/ManualResizeRedactionIntegrationTest.java @@ -31,14 +31,14 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionPosition; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; @Import(ManualResizeRedactionIntegrationTest.TestConfiguration.class) public class ManualResizeRedactionIntegrationTest extends BuildDocumentIntegrationTest { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/MigrationPocTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/MigrationPocTest.java index 76ac38a5..dac48779 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/MigrationPocTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/MigrationPocTest.java @@ -23,12 +23,11 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSON import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; +import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; import com.iqser.red.service.redaction.v1.server.redaction.adapter.CustomEntityCreationAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.DocumentData; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper.DocumentGraphMapper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; import com.iqser.red.service.redaction.v1.server.redaction.service.RedactionLogCreatorService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; @@ -78,14 +77,14 @@ public class MigrationPocTest extends BuildDocumentIntegrationTest { public void testMigration() { AnalyzeRequest request = uploadFileToStorage("files/new/crafted document.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var newRedactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); var originalRedactionLog = getOriginalRedactionLog(); // IMPORTANT: always use the graph which is mapped from the DocumentData, since rounding errors occur during storage. - Document document = DocumentGraphMapper.toDocumentGraph(DocumentData.fromDocument(buildGraph("files/new/crafted document.pdf"))); + Document document = DocumentGraphMapper.toDocumentGraph(redactionStorageService.getDocumentData(request.getDossierId(), request.getFileId())); redactionLogAdapter.toRedactionEntity(originalRedactionLog, document); var migratedRedactionLogEntries = redactionLogCreatorService.createRedactionLog(document, TEST_DOSSIER_TEMPLATE_ID); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/SearchImplementationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/SearchImplementationTest.java index b80613b4..047037fc 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/SearchImplementationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/SearchImplementationTest.java @@ -7,11 +7,11 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.SearchImplementation; public class SearchImplementationTest extends BuildDocumentIntegrationTest { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ColumnDetectionServiceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ColumnDetectionServiceTest.java deleted file mode 100644 index 0d0712dc..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ColumnDetectionServiceTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Rectangle2D; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.junit.jupiter.api.Test; -import org.springframework.core.io.ClassPathResource; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing.PDFLinesTextStripper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.PdfVisualisationUtility; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; - -import lombok.SneakyThrows; - -class ColumnDetectionServiceTest { - - @Test - @SneakyThrows - public void testColumnDetection() { - - String filename = "files/Documine/Flora/ProblemDocs/S37Struktur.pdf"; - var tmpFileName = "/tmp/" + filename.split("/")[2] + "_COLUMNS.pdf"; - try (InputStream inputStream = new ClassPathResource(filename).getInputStream()) { - - PDDocument pdDocument = PDDocument.load(inputStream); - System.out.println("start column detection"); - long start = System.currentTimeMillis(); - - for (int pageNumber = 1; pageNumber < pdDocument.getNumberOfPages() + 1; pageNumber++) { - - PDFLinesTextStripper stripper = new PDFLinesTextStripper(); - PDPage pdPage = pdDocument.getPage(pageNumber - 1); - stripper.setPageNumber(pageNumber); - stripper.setStartPage(pageNumber); - stripper.setEndPage(pageNumber); - stripper.setPdpage(pdPage); - stripper.getText(pdDocument); - - List columns = ColumnDetectionService.detectColumns(stripper.getTextPositionSequences(), RectangleTransformations.toRectangle2D(pdPage.getCropBox())); - System.out.printf("found %d columns on page %d%n", columns.size(), pageNumber); - PdfVisualisationUtility.drawRectangle2DList(pdDocument, pageNumber, columns, PdfVisualisationUtility.Options.builder().stroke(true).build()); - } - - System.out.printf("finished col detection, took %d ms", System.currentTimeMillis() - start); - - try (var out = new FileOutputStream(tmpFileName)) { - pdDocument.save(out); - pdDocument.close(); - } - } - - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/LineDetectionServiceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/LineDetectionServiceTest.java deleted file mode 100644 index b8480776..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/LineDetectionServiceTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.core.io.ClassPathResource; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing.PDFLinesTextStripper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.PdfVisualisationUtility; - -import lombok.SneakyThrows; - -class LineDetectionServiceTest { - - @Test - @Disabled - @SneakyThrows - public void testLineDetection() { - - String filename = "files/BDR/Plenarprotokoll 1 (keine Druchsache!) (1).pdf"; - var tmpFileName = "/tmp/" + filename.split("/")[2] + "_LINES.pdf"; - try (InputStream inputStream = new ClassPathResource(filename).getInputStream()) { - - PDDocument pdDocument = PDDocument.load(inputStream); - System.out.println("start column detection"); - long start = System.currentTimeMillis(); - - for (int pageNumber = 1; pageNumber < pdDocument.getNumberOfPages() + 1; pageNumber++) { - - PDFLinesTextStripper stripper = new PDFLinesTextStripper(); - PDPage pdPage = pdDocument.getPage(pageNumber - 1); - stripper.setPageNumber(pageNumber); - stripper.setStartPage(pageNumber); - stripper.setEndPage(pageNumber); - stripper.setPdpage(pdPage); - stripper.getText(pdDocument); - - List> linesWithGaps = LineDetectionService.findLinesWithGaps(stripper.getTextPositionSequences()); - System.out.printf("found %d lines on page %d%n", linesWithGaps.size(), pageNumber); - for (int i = 0; i < linesWithGaps.size(); i++) { - PdfVisualisationUtility.drawRectangle2DList(pdDocument, pageNumber, linesWithGaps.get(i), PdfVisualisationUtility.Options.builder().stroke(true).build()); - PdfVisualisationUtility.drawText(String.format("%d", i), - pdDocument, - new Point2D.Double(linesWithGaps.get(i).get(0).getX() - (5 + (5 * countNumberOfDigits(i))), linesWithGaps.get(i).get(0).getY() + 2), - pageNumber, - PdfVisualisationUtility.Options.builder().stroke(true).build()); - - } - } - - System.out.printf("finished line detection, took %d ms", System.currentTimeMillis() - start); - - try (var out = new FileOutputStream(tmpFileName)) { - pdDocument.save(out); - pdDocument.close(); - } - } - } - - - private int countNumberOfDigits(int num) { - - if (num == 0) { - return 1; - } - int count = 0; - for (; num != 0; num /= 10, ++count) { - } - return count; - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/ConsecutiveBoundaryCollectorTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/ConsecutiveBoundaryCollectorTest.java deleted file mode 100644 index 222c6648..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/ConsecutiveBoundaryCollectorTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph; - -import static org.junit.jupiter.api.Assertions.*; - -class ConsecutiveBoundaryCollectorTest { - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/sectionidentifiers/SectionIdentifierTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/sectionidentifiers/SectionIdentifierTest.java deleted file mode 100644 index 36d89b62..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/sectionidentifiers/SectionIdentifierTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.sectionidentifiers; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SectionIdentifier; - -class SectionIdentifierTest { - - @Test - public void testParentOf() { - - var headline = SectionIdentifier.fromSearchText("1 Did you ever hear the tragedy of Darth Plagueis The Wise?"); - var headline1 = SectionIdentifier.fromSearchText("1.0 I thought not. It’s not a story the Jedi would tell you."); - var headline2 = SectionIdentifier.fromSearchText("1.1 It’s a Sith legend. Darth Plagueis was a Dark Lord of the Sith, "); - var headline3 = SectionIdentifier.fromSearchText("1.2.3 so powerful and so wise he could use the Force to influence the midichlorians to create life…"); - var headline4 = SectionIdentifier.fromSearchText("1.2.3.4 He had such a knowledge of the dark side that he could even keep the ones he cared about from dying."); - var headline5 = SectionIdentifier.fromSearchText("1.2.3.4.5 The dark side of the Force is a pathway to many abilities some consider to be unnatural."); - var headline6 = SectionIdentifier.fromSearchText("2.0 He became so powerful…"); - var headline7 = SectionIdentifier.fromSearchText("10000.0 the only thing he was afraid of was losing his power,"); - var headline8 = SectionIdentifier.fromSearchText("A.0 which eventually, of course, he did."); - var headline9 = SectionIdentifier.fromSearchText("Unfortunately, he taught his apprentice everything he knew, then his apprentice killed him in his sleep."); - var headline10 = SectionIdentifier.fromSearchText("2.1.2 Ironic."); - var headline11 = SectionIdentifier.fromSearchText("2.He could save others from death,"); - var headline12 = SectionIdentifier.fromSearchText(" 2. but not himself."); - - var paragraph1 = SectionIdentifier.asChildOf(headline); - assertTrue(paragraph1.isChildOf(headline)); - assertTrue(headline.isParentOf(paragraph1)); - assertFalse(paragraph1.isParentOf(headline)); - - assertFalse(headline.isParentOf(headline1)); - assertTrue(headline.isParentOf(headline2)); - assertTrue(headline.isParentOf(headline3)); - assertTrue(headline.isParentOf(headline4)); - assertTrue(headline.isParentOf(headline5)); - assertTrue(headline1.isParentOf(headline2)); - assertFalse(headline1.isParentOf(headline1)); - assertTrue(headline3.isParentOf(headline4)); - assertFalse(headline4.isParentOf(headline5)); - assertFalse(headline2.isParentOf(headline3)); - assertFalse(headline2.isParentOf(headline4)); - assertTrue(headline1.isParentOf(headline3)); - assertTrue(headline1.isParentOf(headline4)); - assertFalse(headline1.isParentOf(headline6)); - assertFalse(headline1.isParentOf(headline7)); - assertFalse(headline8.isParentOf(headline1)); - assertFalse(headline8.isParentOf(headline2)); - assertFalse(headline8.isParentOf(headline3)); - assertFalse(headline8.isParentOf(headline4)); - assertFalse(headline9.isParentOf(headline9)); - assertTrue(headline10.isChildOf(headline11)); - assertTrue(headline10.isChildOf(headline12)); - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/AtomicTextBlockTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/AtomicTextBlockTest.java deleted file mode 100644 index 76bb80e1..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/graph/textblock/AtomicTextBlockTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; - -import org.junit.jupiter.api.Test; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; - -class AtomicTextBlockTest { - - @Test - void subSequenceWithLineBreaks1() { - - String searchText = "1234 6789 "; - var atb = AtomicTextBlock.builder().searchText(searchText).lineBreaks(List.of(5, 7)).boundary(new Boundary(0, searchText.length())).build(); - String searchTextWithLineBreaks = atb.searchTextWithLineBreaks(); - assertEquals("1234\n6789\n", searchTextWithLineBreaks); - } - - - @Test - void subSequenceWithLineBreaks2() { - - String searchText = "1234 6789 "; - var atb = AtomicTextBlock.builder().searchText(searchText).lineBreaks(List.of(5, 7, 8, 9)).boundary(new Boundary(0, searchText.length())).build(); - String searchTextWithLineBreaks = atb.searchTextWithLineBreaks(); - assertEquals("1234\n6789\n", searchTextWithLineBreaks); - } - - - @Test - void subSequenceWithLineBreaks3() { - - String searchText = "1234 6789 1234 "; - var atb = AtomicTextBlock.builder().searchText(searchText).lineBreaks(List.of(5, 7)).boundary(new Boundary(0, searchText.length())).build(); - String searchTextWithLineBreaks = atb.searchTextWithLineBreaks(); - assertEquals("1234\n6789\n1234\n", searchTextWithLineBreaks); - } - - - @Test - void subSequenceWithLineBreaks4() { - - String searchText = "1234 6789 1234 "; - var atb = AtomicTextBlock.builder().searchText(searchText).lineBreaks(List.of(5, 7)).boundary(new Boundary(0, searchText.length())).build(); - var textBlock = new ConcatenatedTextBlock(List.of(atb)); - String searchTextWithLineBreaks = textBlock.searchTextWithLineBreaks(); - assertEquals("1234\n6789\n1234\n", searchTextWithLineBreaks); - } - - - @Test - void subSequenceWithLineBreaks5() { - - String searchText1 = "1234 6789 "; - String searchText2 = "1234 "; - var atb1 = AtomicTextBlock.builder().searchText(searchText1).lineBreaks(List.of(5, 7)).boundary(new Boundary(0, searchText1.length())).build(); - var atb2 = AtomicTextBlock.builder() - .searchText(searchText2) - .lineBreaks(List.of()) - .boundary(new Boundary(searchText1.length(), searchText1.length() + searchText2.length())) - .build(); - var textBlock = new ConcatenatedTextBlock(List.of(atb1, atb2)); - String searchTextWithLineBreaks = textBlock.searchTextWithLineBreaks(); - assertEquals("1234\n6789\n1234\n", searchTextWithLineBreaks); - } - - - @Test - void subSequenceWithLineBreaks6() { - - String searchText1 = "1234 6789 "; - String searchText2 = "1234 "; - String searchText3 = "1234 8475678900 "; - var atb1 = AtomicTextBlock.builder().searchText(searchText1).lineBreaks(List.of(5, 7)).boundary(new Boundary(0, searchText1.length())).build(); - var atb2 = AtomicTextBlock.builder() - .searchText(searchText2) - .lineBreaks(List.of()) - .boundary(new Boundary(searchText1.length(), searchText1.length() + searchText2.length())) - .build(); - var atb3 = AtomicTextBlock.builder() - .searchText(searchText3) - .lineBreaks(List.of(atb2.getBoundary().end() + 6)) - .boundary(new Boundary(atb2.getBoundary().end(), atb2.getBoundary().end() + searchText3.length())) - .build(); - var textBlock = new ConcatenatedTextBlock(List.of(atb1, atb2, atb3)); - String searchTextWithLineBreaks = textBlock.searchTextWithLineBreaks(); - assertEquals("1234\n6789\n1234\n1234 8475678900\n", searchTextWithLineBreaks); - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformationsTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformationsTest.java deleted file mode 100644 index 6bc9603f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformationsTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.awt.geom.Rectangle2D; -import java.util.List; - -import org.junit.jupiter.api.Test; - -class RectangleTransformationsTest { - - @Test - public void testRectangle2DBBox() { - - var r1 = new Rectangle2D.Double(0, 0, 1, 1); - var r2 = new Rectangle2D.Double(1, 1, 1, 1); - var result = RectangleTransformations.rectangle2DBBox(List.of(r1, r2)); - assertEquals(0, result.getX()); - assertEquals(0, result.getY()); - assertEquals(2, result.getWidth()); - assertEquals(2, result.getHeight()); - } - - - @Test - public void testRectangle2DBBox2() { - - var r1 = new Rectangle2D.Double(0, 0, -1, -1); - var r2 = new Rectangle2D.Double(1, 1, 1, 1); - var result = RectangleTransformations.rectangle2DBBox(List.of(r1, r2)); - assertEquals(-1, result.getX()); - assertEquals(-1, result.getY()); - assertEquals(3, result.getWidth()); - assertEquals(3, result.getHeight()); - } - - - @Test - public void testRectangle2DBBox3() { - - var r1 = new Rectangle2D.Double(0, 0, -1, -1); - var r2 = new Rectangle2D.Double(1, 1, 1, 1); - var result = RectangleTransformations.rectangle2DBBox(List.of(r2, r1)); - assertEquals(-1, result.getX()); - assertEquals(-1, result.getY()); - assertEquals(3, result.getWidth()); - assertEquals(3, result.getHeight()); - } - - - @Test - public void testRectangle2DBBox4() { - - var r1 = new Rectangle2D.Double(2, 0, -1, -1); - var r2 = new Rectangle2D.Double(0, 2, 1, -1); - var result = RectangleTransformations.rectangle2DBBox(List.of(r2, r1)); - assertEquals(0, result.getX()); - assertEquals(-1, result.getY()); - assertEquals(2, result.getWidth()); - assertEquals(3, result.getHeight()); - } - - - @Test - public void testRectangle2DBBox5() { - - var r1 = new Rectangle2D.Double(2, 0, -1, -1); - var r2 = new Rectangle2D.Double(0, 2, 1, -1); - var r3 = new Rectangle2D.Double(3, 2, 1, 1); - var result = RectangleTransformations.rectangle2DBBox(List.of(r2, r1, r3)); - assertEquals(0, result.getX()); - assertEquals(-1, result.getY()); - assertEquals(4, result.getWidth()); - assertEquals(4, result.getHeight()); - } - - - @Test - public void testRectangle2DBBox6() { - - var r1 = new Rectangle2D.Double(0, 0, -1, -1); - var r2 = new Rectangle2D.Double(-1, -1, -1, -1); - var result = RectangleTransformations.rectangle2DBBox(List.of(r1, r2)); - assertEquals(-2, result.getX()); - assertEquals(-2, result.getY()); - assertEquals(2, result.getWidth()); - assertEquals(2, result.getHeight()); - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequenceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequenceTest.java deleted file mode 100644 index 0ac3e145..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequenceTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.parsing.model; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.ByteArrayInputStream; -import java.nio.charset.StandardCharsets; - -import org.apache.pdfbox.util.Matrix; -import org.junit.jupiter.api.Test; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextDirection; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.storage.commons.properties.StorageProperties; -import com.iqser.red.storage.commons.service.ObjectSerializer; - -import lombok.SneakyThrows; - -public class TextPositionSequenceTest { - - private static final String TEXT_POSITION_SEQUENCE_AS_JSON = "{\n" // - + " \"page\": 1,\n" // - + " \"textPositions\": [],\n" // - + " \"dir\": 180.0,\n" // - + " \"rotation\": 0,\n" // - + " \"pageHeight\": 800,\n" // - + " \"pageWidth\": 600\n" // - + "}"; - - private final ObjectSerializer objectSerializer = new ObjectSerializer(new ObjectMapper(), new StorageProperties()); - - - @Test - @SneakyThrows - public void testDeserializationWithJackson() { - - TextPositionSequence textPositionSequence = objectSerializer.deserializeWithJackson(new ByteArrayInputStream(TEXT_POSITION_SEQUENCE_AS_JSON.getBytes(StandardCharsets.UTF_8)), - TextPositionSequence.class); - - assertPropertiesAfterJsonDeserialization(textPositionSequence); - } - - - private void assertPropertiesAfterJsonDeserialization(TextPositionSequence textPositionSequence) { - - assertThat(textPositionSequence.getPage()).isEqualTo(1); - assertThat(textPositionSequence.getTextPositions()).hasSize(0); - assertThat(textPositionSequence.getDir()).isEqualTo(TextDirection.HALF_CIRCLE); - assertThat(textPositionSequence.getRotation()).isEqualTo(0); - assertThat(textPositionSequence.getPageHeight()).isEqualTo(800f); - assertThat(textPositionSequence.getPageWidth()).isEqualTo(600f); - } - - - private Matrix createIdentityMatrix() { - - return new Matrix(); - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java index 92b965b9..2b29489a 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java @@ -8,13 +8,13 @@ import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.when; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.amqp.rabbit.core.RabbitTemplate; @@ -47,7 +47,6 @@ import com.iqser.red.service.redaction.v1.server.client.DictionaryClient; import com.iqser.red.service.redaction.v1.server.client.FileStatusProcessingUpdateClient; import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; import com.iqser.red.service.redaction.v1.server.client.RulesClient; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.TableServiceResponseAdapter; import com.iqser.red.service.redaction.v1.server.queue.RedactionMessageReceiver; import com.iqser.red.service.redaction.v1.server.redaction.service.DictionaryService; import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; @@ -85,9 +84,6 @@ public class LiveDataIntegrationTest { @MockBean private LegalBasisClient legalBasisClient; - @MockBean - private TableServiceResponseAdapter tableServiceResponseAdapter; - @Autowired private ResourcePatternResolver resourcePatternResolver; @@ -133,7 +129,7 @@ public class LiveDataIntegrationTest { @BeforeEach public void prepareTest() { - when(tableServiceResponseAdapter.convertTables(anyString(), anyString())).thenReturn(new HashMap<>()); + //when(tableServiceResponseAdapter.convertTables(anyString(), anyString())).thenReturn(new HashMap<>()); TenantContext.setTenantId("redaction"); when(dictionaryClient.getVersion(anyString())).thenReturn(1L); @@ -206,6 +202,7 @@ public class LiveDataIntegrationTest { @Test + @Disabled public void testUpdateDictionary() { dictionaryService.updateDictionary("dossierTemplateId", "dossierId"); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java index 57ad24ba..12f2d2c2 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java @@ -12,6 +12,7 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -21,14 +22,14 @@ import org.springframework.core.io.ClassPathResource; import com.iqser.red.commons.jackson.ObjectMapperFactory; import com.iqser.red.service.redaction.v1.server.client.model.NerEntitiesModel; import com.iqser.red.service.redaction.v1.server.document.graph.BuildDocumentIntegrationTest; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityEnrichmentService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.PdfVisualisationUtility; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionPosition; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; +import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -68,27 +69,28 @@ class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest { assertTrue(entityRecognitionEntities.stream().allMatch(entity -> entity.boundary().start() < entity.boundary().end())); ClassPathResource resource = new ClassPathResource(filePath); - PDDocument pdDocument = PDDocument.load(resource.getInputStream()); - Stream unchangedAddressParts = NerEntitiesAdapter.toNerEntities(parseNerEntities(nerEntitiesFilePath), document) - .getNerEntityList() - .stream() - .filter(e -> !e.type().equals("CBI_author")); - List redactionEntities = Stream.concat(entityRecognitionEntities.stream(), unchangedAddressParts) - .map(e -> entityCreationService.byBoundary(e.boundary(), e.type(), EntityType.ENTITY, document)) - .filter(Optional::isPresent) - .map(Optional::get) - .toList(); - redactionEntities.stream() - .collect(Collectors.groupingBy(e -> e.getPages().stream().findFirst().get().getNumber())) - .forEach((pageNumber, entities) -> drawNerEntitiesAsPartsAndCombined(pageNumber, - getPositionsFromEntityOfType("CBI_author", entities), - getPositionsFromEntityNotOfType(List.of("CBI_author", "CBI_address"), entities), - getPositionsFromEntityOfType("CBI_address", entities), - pdDocument)); + try (PDDocument pdDocument = Loader.loadPDF(resource.getInputStream())) { - File outputFile = new File("/tmp/nerEntities.pdf"); - pdDocument.save(outputFile); - pdDocument.close(); + Stream unchangedAddressParts = NerEntitiesAdapter.toNerEntities(parseNerEntities(nerEntitiesFilePath), document) + .getNerEntityList() + .stream() + .filter(e -> !e.type().equals("CBI_author")); + List redactionEntities = Stream.concat(entityRecognitionEntities.stream(), unchangedAddressParts) + .map(e -> entityCreationService.byBoundary(e.boundary(), e.type(), EntityType.ENTITY, document)) + .filter(Optional::isPresent) + .map(Optional::get) + .toList(); + redactionEntities.stream() + .collect(Collectors.groupingBy(e -> e.getPages().stream().findFirst().get().getNumber())) + .forEach((pageNumber, entities) -> drawNerEntitiesAsPartsAndCombined(pageNumber, + getPositionsFromEntityOfType("CBI_author", entities), + getPositionsFromEntityNotOfType(List.of("CBI_author", "CBI_address"), entities), + getPositionsFromEntityOfType("CBI_address", entities), + pdDocument)); + + File outputFile = new File("/tmp/nerEntities.pdf"); + pdDocument.save(outputFile); + } } @@ -116,26 +118,26 @@ class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest { assertTrue(cbiAddressEntities.stream().allMatch(entity -> entity.getBoundary().start() < entity.getBoundary().end())); ClassPathResource resource = new ClassPathResource(filePath); - PDDocument pdDocument = PDDocument.load(resource.getInputStream()); - List validatedEntities = NerEntitiesAdapter.toNerEntities(parseNerEntities(nerEntitiesFilePath), document) - .getNerEntityList() - .stream() - .map(e -> entityCreationService.byBoundary(e.boundary(), e.type(), EntityType.ENTITY, document)) - .filter(Optional::isPresent) - .map(Optional::get) - .toList(); - Stream.concat(cbiAddressEntities.stream(), validatedEntities.stream()) - .collect(Collectors.groupingBy(e -> e.getPages().stream().findFirst().get().getNumber())) - .forEach((pageNumber, entities) -> drawNerEntitiesAsPartsAndCombined(pageNumber, - getPositionsFromEntityOfType("CBI_author", entities), - getPositionsFromEntityNotOfType(List.of("CBI_author", "CBI_address"), entities), - getPositionsFromEntityOfType("CBI_address", entities), - pdDocument)); + try (PDDocument pdDocument = Loader.loadPDF(resource.getInputStream())) { - File outputFile = new File("/tmp/nerEntities.pdf"); - pdDocument.save(outputFile); - pdDocument.close(); + List validatedEntities = NerEntitiesAdapter.toNerEntities(parseNerEntities(nerEntitiesFilePath), document) + .getNerEntityList() + .stream() + .map(e -> entityCreationService.byBoundary(e.boundary(), e.type(), EntityType.ENTITY, document)) + .filter(Optional::isPresent) + .map(Optional::get) + .toList(); + Stream.concat(cbiAddressEntities.stream(), validatedEntities.stream()) + .collect(Collectors.groupingBy(e -> e.getPages().stream().findFirst().get().getNumber())) + .forEach((pageNumber, entities) -> drawNerEntitiesAsPartsAndCombined(pageNumber, + getPositionsFromEntityOfType("CBI_author", entities), + getPositionsFromEntityNotOfType(List.of("CBI_author", "CBI_address"), entities), + getPositionsFromEntityOfType("CBI_address", entities), + pdDocument)); + File outputFile = new File("/tmp/nerEntities.pdf"); + pdDocument.save(outputFile); + } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/utils/RegExPatternTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/utils/RegExPatternTest.java index 476b9268..8b10d245 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/utils/RegExPatternTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/utils/RegExPatternTest.java @@ -64,7 +64,6 @@ public class RegExPatternTest { String word = "Porch JR, " + "Kendall TZ, " + "Krueger HO"; - word.replaceAll(",", " ").replaceAll(" ", " "); Pattern pattern = Pattern.compile("[A-ZÄÖÜ][\\wäöüéèê]{2,}( [A-ZÄÖÜ]{1,2}\\.)+"); Matcher matcher = pattern.matcher(word); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/utils/ResourceLoader.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/utils/ResourceLoader.java index db4c30c2..c1153a6d 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/utils/ResourceLoader.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/utils/ResourceLoader.java @@ -23,7 +23,7 @@ public final class ResourceLoader { List files; try { - files = IOUtils.readLines(ResourceLoader.class.getClassLoader().getResourceAsStream(name), "UTF-8"); + files = IOUtils.readLines(Thread.currentThread().getContextClassLoader().getResourceAsStream(name), "UTF-8"); } catch (IOException e) { throw new IllegalArgumentException("could not load classpath resource: " + name, e); } @@ -39,7 +39,7 @@ public final class ResourceLoader { public Set load(String classpathPath) { - URL resource = ResourceLoader.class.getClassLoader().getResource(classpathPath); + URL resource = Thread.currentThread().getContextClassLoader().getResource(classpathPath); if (resource == null) { throw new IllegalArgumentException("could not load classpath resource: " + classpathPath); } @@ -53,7 +53,7 @@ public final class ResourceLoader { public String loadToString(String classpathPath) { - URL resource = ResourceLoader.class.getClassLoader().getResource(classpathPath); + URL resource = Thread.currentThread().getContextClassLoader().getResource(classpathPath); if (resource == null) { throw new IllegalArgumentException("could not load classpath resource: " + classpathPath); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationServiceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationServiceTest.java deleted file mode 100644 index 0dbed963..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationServiceTest.java +++ /dev/null @@ -1,604 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.segmentation; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.awt.geom.Rectangle2D; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.stream.Collectors; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.kie.api.runtime.KieContainer; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.ClassPathResource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import com.amazonaws.services.s3.AmazonS3; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.redaction.v1.server.Application; -import com.iqser.red.service.redaction.v1.server.FileSystemBackedStorageService; -import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image.ImageServiceResponse; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service.BlockificationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service.PdfSegmentationService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service.RulingCleaningService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service.TableExtractionService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; -import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; -import com.iqser.red.storage.commons.StorageAutoConfiguration; -import com.iqser.red.storage.commons.service.StorageService; -import com.knecon.fforesight.tenantcommons.TenantContext; -import com.knecon.fforesight.tenantcommons.TenantsClient; - -import lombok.SneakyThrows; - -@ExtendWith(SpringExtension.class) -@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@Import(PdfSegmentationServiceTest.TestConfiguration.class) -public class PdfSegmentationServiceTest { - - @MockBean - private TenantsClient tenantsClient; - - @Autowired - private PdfSegmentationService pdfSegmentationService; - - @Autowired - private RulingCleaningService rulingCleaningService; - - @Autowired - private TableExtractionService tableExtractionService; - - @Autowired - private BlockificationService blockificationService; - - @MockBean - private KieContainer kieContainer; - - @MockBean - private AmazonS3 amazonS3; - - @MockBean - private RabbitTemplate rabbitTemplate; - - @MockBean - private LegalBasisClient legalBasisClient; - - @Autowired - private StorageService storageService; - - @Autowired - private ObjectMapper objectMapper; - - private final static String TEST_DOSSIER_ID = "123"; - private final static String TEST_FILE_ID = "123"; - - @Configuration - @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) - @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) - public static class TestConfiguration { - - @Bean - @Primary - public StorageService inmemoryStorage() { - - return new FileSystemBackedStorageService(); - } - - } - - - @SneakyThrows - private void prepareStorage() { - - storageService.storeObject(TenantContext.getTenantId(), - RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.TABLES), - new ClassPathResource("files/cv_service_empty_response.json").getInputStream()); - } - - - @Test - @SneakyThrows - public void testMapping() { - - prepareStorage(); - ClassPathResource responseJson = new ClassPathResource("files/image_response.json"); - ImageServiceResponse imageServiceResponse = objectMapper.readValue(responseJson.getInputStream(), ImageServiceResponse.class); - - Map> images = new HashMap<>(); - imageServiceResponse.getData() - .forEach(imageMetadata -> images.computeIfAbsent(imageMetadata.getPosition().getPageNumber(), x -> new ArrayList<>()) - .add(new ClassifiedImage(new Rectangle2D.Double(imageMetadata.getPosition().getX1(), - imageMetadata.getPosition().getY1(), - imageMetadata.getGeometry().getWidth(), - imageMetadata.getGeometry().getHeight()), - ImageType.valueOf(imageMetadata.getClassification().getLabel().toUpperCase(Locale.ROOT)), - imageMetadata.isAlpha(), - imageMetadata.getPosition().getPageNumber()))); - - System.out.println("object"); - } - - - @Test - public void testPDFSegmentationWithComplexTable() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/Minimal Examples/Spanning Cells.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - assertThat(document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList())).isNotEmpty(); - TablePageBlock table = document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList()).get(0); - assertThat(table.getColCount()).isEqualTo(6); - assertThat(table.getRowCount()).isEqualTo(13); - assertThat(table.getRows().stream().mapToInt(List::size).sum()).isEqualTo(6 * 13); - } - - - @Test - public void testTableExtraction() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/Minimal Examples/Merge Table.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - assertThat(document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList())).isNotEmpty(); - TablePageBlock firstTable = document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList()).get(0); - assertThat(firstTable.getColCount()).isEqualTo(8); - assertThat(firstTable.getRowCount()).isEqualTo(1); - TablePageBlock secondTable = document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList()).get(1); - assertThat(secondTable.getColCount()).isEqualTo(8); - assertThat(secondTable.getRowCount()).isEqualTo(2); - List> firstTableHeaderCells = firstTable.getRows().get(0).stream().map(Collections::singletonList).collect(Collectors.toList()); - assertThat(secondTable.getRows().stream().allMatch(row -> row.stream().map(Cell::getHeaderCells).toList().equals(firstTableHeaderCells))).isTrue(); - } - - - @Test - public void testMultiPageMetadataPropagation() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/Minimal Examples/Merge Multi Page Table.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - assertThat(document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList())).isNotEmpty(); - TablePageBlock firstTable = document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList()).get(0); - assertThat(firstTable.getColCount()).isEqualTo(9); - assertThat(firstTable.getRowCount()).isEqualTo(5); - TablePageBlock secondTable = document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList()).get(1); - assertThat(secondTable.getColCount()).isEqualTo(9); - assertThat(secondTable.getRowCount()).isEqualTo(6); - List> firstTableHeaderCells = firstTable.getRows().get(firstTable.getRowCount() - 1).stream().map(Cell::getHeaderCells).collect(Collectors.toList()); - assertThat(secondTable.getRows().stream().allMatch(row -> row.stream().map(Cell::getHeaderCells).toList().equals(firstTableHeaderCells))).isTrue(); - } - - - @Test - public void testHeaderCellsForRotatedTable() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/Minimal Examples/Rotated Table Headers.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - assertThat(document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList())).isNotEmpty(); - TablePageBlock firstTable = document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList()).get(0); - assertThat(firstTable.getColCount()).isEqualTo(8); - assertThat(firstTable.getRowCount()).isEqualTo(1); - TablePageBlock secondTable = document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).collect(Collectors.toList()).get(1); - assertThat(secondTable.getColCount()).isEqualTo(8); - assertThat(secondTable.getRowCount()).isEqualTo(6); - List> firstTableHeaderCells = firstTable.getRows().get(0).stream().map(Collections::singletonList).collect(Collectors.toList()); - assertThat(secondTable.getRows().stream().allMatch(row -> row.stream().map(Cell::getHeaderCells).toList().equals(firstTableHeaderCells))).isTrue(); - } - - - @Test - public void testDoc56Page170() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/56 Fludioxonil_RAR_12_Volume_3CA_B-7_2018-02-21_Page170.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 4); - - validateTable(document, 0, 1, 1, 0, 0); - validateTable(document, 1, 2, 2, 0, 0); - validateTable(document, 2, 7, 20, 0, 140); - validateTable(document, 3, 8, 31, 0, 170); - - } - - - @Test - public void testVV931175Page1() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/VV-931175_Page1.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 1); - - validateTable(document, 0, 8, 8, 0, 2); - - List> values = Arrays.asList(Arrays.asList("Annex point Reference within DAR/RAR", - "Author, date", - "Study title", - "Analytical method Author, date, No.", - "Technique, LOQ of the method, validated working range", - "Method meets analytical validation criteria", - "Remarks (in case validation criteria are not met)", - "Acceptability of the method"), - Arrays.asList("", - "Part (a) Methods in soil, water, sediment, air and any additional matrices used in support of environmental fate studies", - "Part (a) Methods in soil, water, sediment, air and any additional matrices used in support of environmental fate studies", - "Part (a) Methods in soil, water, sediment, air and any additional matrices used in support of environmental fate studies", - "Part (a) Methods in soil, water, sediment, air and any additional matrices used in support of environmental fate studies", - "", - "Part (a) Methods in soil, water, sediment, air and any additional matrices used in support of environmental fate studies", - "Part (a) Methods in soil, water, sediment, air and any additional matrices used in support of environmental fate studies"), - Arrays.asList("CA 7.1.2.1.1 DAR (2009)", - "Evans P.G. 2001 TMJ4569B, VV-323245", - "Azoxystrobin Laboratory Degradation Study in Three Soil Types, Sampled from Holland and the United Kingdom", - "Method: RAM 269 Johnson R.I., Tummon O.J., Earl M. 1995 RJ1864B, VV-377731 Johnson R.I., Tummon O.J., Earl M. 1998 RAM 269/02, VV-124072 Johnson R.I., Tummon O.J., Earl M. 2000 RAM 269/03, VV-123986 Validation: Robinson N.J. 2001 TMJ4617B, VV-895845 in a Trial Carried", - "LC-MS/MS LOQ: 0.01 mg/kg (R401553 (SYN50165 7), R402173 (SYN501114 )) or 0.02 mg/kg (azoxystrobin, R230310, R234886) Working range: 0.02-1.0 or 0.01-0.5 mg/kg (depending on analyte) Other supporting quantificati on methods: HPLC-UV GC-MSD", - "Y", - "N/A", - "Y")); - - validateTable(document, 0, values); - - } - - - @Test - public void testDoc27Page6() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/27 A8637C - EU AIR3 - MCP Section 1 - Identity of the plant protection product_Page6.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 4); - - validateTable(document, 0, 3, 2, 0, 0); - validateTable(document, 1, 3, 2, 0, 0); - validateTable(document, 2, 3, 3, 0, 0); - validateTable(document, 3, 3, 3, 0, 0); - - } - - - @Test - public void testDocA20622APartB9Page185() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/A20622A izRMS (CZ) fRR Part B9_Page185.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 2); - - validateTable(document, 0, 5, 5, 0, 23); - validateTable(document, 1, 11, 9, 0, 36); - - } - - - @Test - public void testDocA20622APartB7Page123() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/A20622A izZRMS (CZ) fRR Part B7_Page123.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 6); - - validateTable(document, 0, 2, 1, 0, 0); - validateTable(document, 1, 2, 1, 0, 0); - validateTable(document, 2, 2, 5, 0, 0); - validateTable(document, 3, 2, 5, 0, 0); - validateTable(document, 4, 2, 4, 0, 0); - validateTable(document, 5, 2, 1, 0, 0); - - } - - - @Test - public void testDoc77Page111() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/77 Pirimicarb_RAR_08_Volume_3CA_B-6_2017-12-04_Page11.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 3); - - validateTable(document, 0, 7, 9, 0, 0); - validateTable(document, 1, 2, 1, 0, 0); - validateTable(document, 2, 2, 10, 0, 0); - - } - - - @Test - public void testDoc95Page532() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/95 Trinexapac-ethyl_RAR_08_Volume_3CA_B-6_2018-01-10_Page532.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 1); - validateTable(document, 0, 9, 9, 0, 0); - - } - - - @Test - public void testDoc52Page175() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/52 Fludioxonil_RAR_07_Volume_3CA_B-5_2018-02-21_Page175.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 1); - - validateTable(document, 0, 9, 5, 6, 0); - - } - - - @Test - public void testDoc52Page174() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/52 Fludioxonil_RAR_07_Volume_3CA_B-5_2018-02-21_Page174.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 1); - validateTable(document, 0, 9, 6, 7, 0); - - } - - - @Test - public void testDoc19Page35() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/19 Chlorothalonil RAR 08 Volume 3CA B 6b metabolites Oct 2017_Page35.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 1); - validateTable(document, 0, 10, 6, 0, 1); - - } - - - @Test - public void testDoc19Page161() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/19 Chlorothalonil RAR 08 Volume 3CA B 6b metabolites Oct 2017_Page161.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 2); - validateTable(document, 0, 2, 2, 0, 0); - validateTable(document, 1, 1, 1, 0, 0); - - } - - - @Test - public void testDoc47Page30() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource( - "files/SinglePages/47 Cyprodinil - EU AIR3 - MCA Section 5 Supplement - Toxicological and metabolism studies on the active substance_Page30.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 2); - - validateTable(document, 0, 7, 8, 1, 0); - validateTable(document, 1, 7, 8, 1, 0); - - } - - - @Test - public void testDoc49Page61() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource( - "files/SinglePages/49 Cyprodinil - EU AIR3 - MCA Section 8 Supplement - Ecotoxicological studies on the active substance_Page61.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 2); - - validateTable(document, 0, 4, 17, 0, 0); - validateTable(document, 1, 7, 12, 0, 0); - - } - - - @Test - public void testDoc81Page54() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/81 Pirimicarb_RAR_20_Volume_3CP_A10788A (_Pirimor_)_B-9_2017-12-04_Page54.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 2); - - validateTable(document, 0, 5, 14, 4, 0); - validateTable(document, 1, 7, 12, 0, 0); - - } - - - @Test - public void testDoc88Page134() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/85 Pydiflumetofen_DAR_08_Volume_3CA_B-6_2017-07-26_Page134.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 2); - - validateTable(document, 0, 5, 17, 3, 0); - validateTable(document, 1, 5, 16, 2, 0); - - } - - - @Test - public void testDocThiabendazolePage18() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/Thiabendazole DAR Addendum for ED_April_2020_Page18.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 4); - - validateTable(document, 0, 4, 4, 0, 0); - validateTable(document, 1, 1, 1, 0, 0); - validateTable(document, 2, 2, 3, 0, 0); - validateTable(document, 3, 1, 1, 0, 0); - - } - - - @Test - public void testDoc15Page18() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/15 - Pretilachlor - Acute Oral Toxicity (Up and Down Procedure) - Rat_Page18.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 1); - - validateTable(document, 0, 11, 8, 0, 0); - - } - - - @Test - public void testDoc28Page23() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource( - "files/SinglePages/28 A8637C - EU AIR3 - MCP Section 10 - Ecotoxicological studies on the plant protection product_Page23.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 2); - - validateTable(document, 0, 6, 8, 0, 2); - validateTable(document, 1, 6, 8, 0, 1); - - } - - - @Test - public void testDoc24Page17() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/24 - SYN549522 - Acute Oral Toxicity - Rats_Page17.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 1); - - validateTable(document, 0, 9, 5, 2, 0); - - } - - - @Test - public void testDoc30Page5() throws IOException { - - prepareStorage(); - ClassPathResource pdfFileResource = new ClassPathResource("files/SinglePages/30 - Dicamba - Acute Oral Toxicity - Rats_Page5.pdf"); - - ClassificationDocument document = pdfSegmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, pdfFileResource.getInputStream(), null); - - validateTableSize(document, 1); - - validateTable(document, 0, 3, 5, 0, 0); - - } - - - private void validateTable(ClassificationDocument document, int tableIndex, int colCount, int rowCount, int emptyCellsCountCorrect, int emptyCellsCountIncorrect) { - - TablePageBlock table = document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).toList().get(tableIndex); - List> rows = table.getRows(); - int emptyCellsFoundFound = rows.stream().flatMap(List::stream).toList().stream().filter(f -> f.toString().equals("")).toList().size(); - - assertThat(emptyCellsFoundFound).isEqualTo(emptyCellsCountCorrect + emptyCellsCountIncorrect); - - assertThat(table.getColCount()).isEqualTo(colCount); - assertThat(table.getRowCount()).isEqualTo(rowCount); - - } - - - private void validateTable(ClassificationDocument document, int tableIndex, List> values) { - - TablePageBlock table = document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).toList().get(tableIndex); - List> rows = table.getRows(); - - List rowsFlattened = rows.stream().flatMap(List::stream).toList(); - List valuesFlattened = values.stream().flatMap(List::stream).toList(); - - for (int i = 0; i < valuesFlattened.size(); i++) { - Cell cell = rowsFlattened.get(i); - String value = valuesFlattened.get(i); - assertThat(cell.toString()).isEqualTo(value); - } - - } - - - private void validateTableSize(ClassificationDocument document, int tableSize) { - - assertThat(document.getSections().stream().flatMap(paragraph -> paragraph.getTables().stream()).toList().size()).isEqualTo(tableSize); - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/stringmatching/StringMatchingPerformanceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/stringmatching/StringMatchingPerformanceTest.java index d4c62f21..8b7983d7 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/stringmatching/StringMatchingPerformanceTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/stringmatching/StringMatchingPerformanceTest.java @@ -3,6 +3,7 @@ package com.iqser.red.service.redaction.v1.server.stringmatching; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -25,7 +26,7 @@ public class StringMatchingPerformanceTest { @SneakyThrows public void testStringPerformance() { - String text = IOUtils.toString(new ClassPathResource("stringmatching/hamlet.txt").getInputStream()).toLowerCase(); + String text = IOUtils.toString(new ClassPathResource("stringmatching/hamlet.txt").getInputStream()).toLowerCase(Locale.ROOT); Set dictionary = IOUtils.readLines(new ClassPathResource("stringmatching/names.txt").getInputStream()) .stream() .map(String::toLowerCase) diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/utils/LayoutParsingRequestProvider.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/utils/LayoutParsingRequestProvider.java new file mode 100644 index 00000000..30b6d20d --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/utils/LayoutParsingRequestProvider.java @@ -0,0 +1,38 @@ +package com.iqser.red.service.redaction.v1.server.utils; + +import java.util.Optional; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingRequest; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; + +public class LayoutParsingRequestProvider { + + public static LayoutParsingRequest build(LayoutParsingType layoutParsingType, AnalyzeRequest request) { + + var originFileStorageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.ORIGIN); + var tablesFileStorageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.TABLES); + var imagesFileStorageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.IMAGE_INFO); + var sectionGridStorageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.SECTION_GRID); + var structureFileStorageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.DOCUMENT_STRUCTURE); + var textBlockFileStorageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.DOCUMENT_TEXT); + var positionBlockFileStorageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.DOCUMENT_POSITION); + var pageFileStorageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.DOCUMENT_PAGES); + var simplifiedTextStorageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.SIMPLIFIED_TEXT); + return LayoutParsingRequest.builder() + .layoutParsingType(layoutParsingType) + .originFileStorageId(originFileStorageId) + .tablesFileStorageId(Optional.of(tablesFileStorageId)) + .imagesFileStorageId(Optional.of(imagesFileStorageId)) + .structureFileStorageId(structureFileStorageId) + .textBlockFileStorageId(textBlockFileStorageId) + .positionBlockFileStorageId(positionBlockFileStorageId) + .pageFileStorageId(pageFileStorageId) + .sectionGridStorageId(sectionGridStorageId) + .simplifiedTextStorageId(simplifiedTextStorageId) + .build(); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/PdfVisualisationUtility.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/utils/PdfVisualisationUtility.java similarity index 88% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/PdfVisualisationUtility.java rename to redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/utils/PdfVisualisationUtility.java index 838c7c5c..45f4686f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/PdfVisualisationUtility.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/utils/PdfVisualisationUtility.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils; +package com.iqser.red.service.redaction.v1.server.utils; import java.awt.Color; import java.awt.geom.Point2D; @@ -11,13 +11,14 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.TextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; +import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.NodeType; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import lombok.AccessLevel; import lombok.Builder; @@ -70,7 +71,7 @@ public class PdfVisualisationUtility { contentStream.beginText(); contentStream.newLineAtOffset((float) location.getX(), (float) location.getY()); - contentStream.setFont(PDType1Font.HELVETICA_OBLIQUE, 10); + contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.HELVETICA_OBLIQUE), 10); contentStream.showText(string); contentStream.endText(); contentStream.close(); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl index 173edb8f..940df8b6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,21 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -34,13 +34,18 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl index d6c02c14..5976c581 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,21 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -34,13 +34,18 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl index 483eefd1..f6e82a60 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,20 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SectionIdentifier; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Headline; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -33,14 +34,18 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl index eaf2ed1b..51b5b098 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl @@ -1,25 +1,32 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; -import java.util.Set +import java.util.Set; import java.util.stream.Collectors; import java.util.Collection; import java.util.stream.Stream; +import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -27,14 +34,18 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl index 49eae02b..5f5e5da0 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,21 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -34,13 +34,18 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl index 7a451fa1..62f1085b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl @@ -1,23 +1,32 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; -import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.Collection; +import java.util.stream.Stream; +import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; -import java.util.Set import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -25,23 +34,23 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import java.util.stream.Collectors; -import java.util.Collection; -import java.util.stream.Stream; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType +import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService global ManualRedactionApplicationService manualRedactionApplicationService global Dictionary dictionary - // --------------------------------------- queries ------------------------------------------------------------------- query "getFileAttributes" diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Documine/Flora/ProblemDocs/S37Struktur.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Documine/Flora/ProblemDocs/S37Struktur.pdf deleted file mode 100644 index 8123bf3c..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Documine/Flora/ProblemDocs/S37Struktur.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1)_REDACTION_LOG.json b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1)_REDACTION_LOG.json deleted file mode 100644 index 7f82f26e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1)_REDACTION_LOG.json +++ /dev/null @@ -1,4831 +0,0 @@ -{ - "analysisVersion": 1, - "analysisNumber": 1, - "redactionLogEntry": [ - { - "id": "b41f9cb564c758dcd82fa6cb6436bed8", - "type": "logo", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 356, - "y": 727 - }, - "width": 184, - "height": 43, - "page": 1 - } - ], - "sectionNumber": 3, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588212862Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6bacd8c9c26bac79261221521fc45331", - "type": "headline", - "value": "STATEMENT OF DATA CONFIDENTIALITY CLAIMS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "STATEMENT OF DATA CONFIDENTIALITY CLAIMS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 139.44, - "y": 764.80005 - }, - "width": 350.93954, - "height": -12.959999, - "page": 2 - } - ], - "sectionNumber": 4, - "textBefore": null, - "textAfter": " This page", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588215772Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "de79ff6137b5bfc901bb23dde1bbcdd9", - "type": "headline", - "value": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 107, - "y": 764.3295 - }, - "width": 413, - "height": -15.329552, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": " Covance CRS", - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588216152Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e1531539aa49cd25140690f462b1a852", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 475, - "y": 30 - }, - "width": 60, - "height": 11, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588216522Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "12471d29b12c9a00c46c64a073169b63", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 81, - "y": 269 - }, - "width": 254, - "height": 29, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588216742Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4229496a76bef98d1413d1b9d97001e1", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 88, - "y": 488 - }, - "width": 424, - "height": 54, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217022Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e9b83535fccc4e59b8ae86a2934b7b52", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 179, - "y": 285 - }, - "width": 33, - "height": 17, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217252Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "301a85104e17aea75116d602b302e876", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": -2, - "y": 0 - }, - "width": 599, - "height": 842, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217462Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "66c776f42b7a7cbe9035bffcdd4ca5d6", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 232, - "y": 210 - }, - "width": 220, - "height": 41, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217682Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a96676325bb74f6aab97a79c1963ce3f", - "type": "signature", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 87, - "y": 327 - }, - "width": 447, - "height": 146, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217892Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e76b0888f8b4390571662e452c85152b", - "type": "logo", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 90, - "y": 669 - }, - "width": 72, - "height": 26, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588218112Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "30a1a147beb3830efaebd2857ee5b346", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 359, - "y": 281 - }, - "width": 23, - "height": 9, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588218442Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0911e80fd3aadafcd7480e86c4b69d1f", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 89, - "y": 559 - }, - "width": 433, - "height": 80, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588218672Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ea73c2f11bbc89e7217bac27f3e9ee3b", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 90, - "y": 713 - }, - "width": 449, - "height": 50, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588218962Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f15a5bcac8f5dd6af4d63e0cd11450d7", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 195, - "y": 654 - }, - "width": 325, - "height": 39, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588219182Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "225c6156e8b975b5a6d7123065d6efed", - "type": "logo", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 87, - "y": 240 - }, - "width": 109, - "height": 13, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588219412Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "58d1e587411e3190165d4c0f007ddbdc", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 85, - "y": 36 - }, - "width": 125, - "height": 11, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588219622Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a92657500d845e6f4d1ad11584654c1a", - "type": "headline", - "value": "FLAGGING STATEMENT", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "FLAGGING STATEMENT", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 231.12003, - "y": 764.80005 - }, - "width": 167.67566, - "height": -12.959999, - "page": 4 - } - ], - "sectionNumber": 6, - "textBefore": null, - "textAfter": " This page", - "comments": null, - "startOffset": 0, - "endOffset": 18, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588219832Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "60ea0a98c2c648982c56bc22a52d3c04", - "type": "headline", - "value": "QUALITY ASSURANCE STATEMENT", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 192, - "y": 764.80005 - }, - "width": 245.67554, - "height": -12.959999, - "page": 5 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": " Covance Study", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220042Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a79928778379fe4a4fd9aa24da8a3297", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 84, - "y": 745 - }, - "width": 442, - "height": 27, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220252Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3754b10373f78fe6b59f8665e77f0e2e", - "type": "signature", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 84, - "y": 651 - }, - "width": 161, - "height": 51, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220552Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fe57ae475a1ac0355eb66a4b65794c69", - "type": "signature", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 356, - "y": 691 - }, - "width": 167, - "height": 24, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220772Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0d11640e9705da841a7b898b8f71c088", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 84, - "y": 40 - }, - "width": 125, - "height": 12, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220982Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32f6a05ab0ae5597bd45df1b5b694456", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": -2, - "y": 0 - }, - "width": 599, - "height": 842, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588221202Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f92d1a93688ff712a34f6e260d8e720d", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 474, - "y": 37 - }, - "width": 59, - "height": 11, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588221412Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "170a06cee938d216502769dc65192b07", - "type": "headline", - "value": "GENERAL INFORMATION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "GENERAL INFORMATION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 226.32, - "y": 764.80005 - }, - "width": 177.06888, - "height": -12.959999, - "page": 7 - } - ], - "sectionNumber": 8, - "textBefore": null, - "textAfter": " Contributors The", - "comments": null, - "startOffset": 0, - "endOffset": 19, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588221632Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "630e327a3a1c27ecd6c8fdc2cefcf965", - "type": "headline", - "value": "TABLE OF CONTENTS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "TABLE OF CONTENTS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 239.28003, - "y": 764.80005 - }, - "width": 151.00159, - "height": -12.959999, - "page": 9 - } - ], - "sectionNumber": 9, - "textBefore": null, - "textAfter": " STATEMENT OF", - "comments": null, - "startOffset": 0, - "endOffset": 17, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588221842Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "33f83ddf95eaf11320f4b8520de08f82", - "type": "headline", - "value": "TABLE OF CONTENTS", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "TABLE OF CONTENTS", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 638.56006 - }, - "width": 129.07193, - "height": -12, - "page": 9 - } - ], - "sectionNumber": 9, - "textBefore": "GENERAL INFORMATION 7 ", - "textAfter": " 9 1.0", - "comments": null, - "startOffset": 182, - "endOffset": 199, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588222062Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:39:50.258167Z", - "requestedDate": "2022-10-10T11:39:50.243395Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b4f651ea14f5f8991cd85748027fae64", - "type": "headline", - "value": "3.6 Post Mortem", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "3.6 Post Mortem", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 268.24023 - }, - "width": 15.119995, - "height": -12, - "page": 9 - }, - { - "topLeft": { - "x": 176.16, - "y": 268.24023 - }, - "width": 62.197998, - "height": -12, - "page": 9 - } - ], - "sectionNumber": 10, - "textBefore": null, - "textAfter": " Investigations......................................................................17 3.6.1", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588222282Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:40:04.910167Z", - "requestedDate": "2022-10-10T11:40:04.896231Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "68f21034845f37ff48f422ecc315dce9", - "type": "headline", - "value": "1.2 Results", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2 Results", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 357.27997 - }, - "width": 16.320007, - "height": -12.480011, - "page": 11 - }, - { - "topLeft": { - "x": 135.11998, - "y": 357.27997 - }, - "width": 40.318558, - "height": -12.480011, - "page": 11 - } - ], - "sectionNumber": 24, - "textBefore": null, - "textAfter": " One female", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588222512Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3a0b510c4c2144ac6a3e5c9291c215ff", - "type": "headline", - "value": "1.0 EXECUTIVE SUMMARY", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.0 EXECUTIVE SUMMARY", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 764.80005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 11 - }, - { - "topLeft": { - "x": 135.12001, - "y": 764.80005 - }, - "width": 161.46382, - "height": -12.959999, - "page": 11 - } - ], - "sectionNumber": 11, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 21, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588222802Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dbc0bc0749a348954ed1516fdd677066", - "type": "headline", - "value": "1.1 Study Design", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1 Study Design", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 736.96 - }, - "width": 16.320007, - "height": -12.479996, - "page": 11 - }, - { - "topLeft": { - "x": 135.12001, - "y": 736.96 - }, - "width": 73.20433, - "height": -12.479996, - "page": 11 - } - ], - "sectionNumber": 23, - "textBefore": null, - "textAfter": " The study", - "comments": null, - "startOffset": 0, - "endOffset": 16, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588223112Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "530cbe7174d462525c1eda04a3761cc2", - "type": "headline", - "value": "1.3 Conclusion", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3 Conclusion", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75999, - "y": 641.2001 - }, - "width": 16.320007, - "height": -12.479996, - "page": 12 - }, - { - "topLeft": { - "x": 135.12, - "y": 641.2001 - }, - "width": 62.16086, - "height": -12.479996, - "page": 12 - } - ], - "sectionNumber": 25, - "textBefore": null, - "textAfter": " The acute", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588223332Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3db193391bafd61be054a85d1391bf7e", - "type": "headline", - "value": "2.2 Test System", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 Test System", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 599.9201 - }, - "width": 16.320007, - "height": -12.480011, - "page": 13 - }, - { - "topLeft": { - "x": 135.11998, - "y": 599.9201 - }, - "width": 66.94849, - "height": -12.480011, - "page": 13 - } - ], - "sectionNumber": 28, - "textBefore": null, - "textAfter": " The rat", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588223552Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3d7397cae3d1bafa3881e1d367f962f3", - "type": "headline", - "value": "2.1 Purpose", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1 Purpose", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 740.08 - }, - "width": 16.320007, - "height": -12.479996, - "page": 13 - }, - { - "topLeft": { - "x": 135.12001, - "y": 740.08 - }, - "width": 45.35399, - "height": -12.479996, - "page": 13 - } - ], - "sectionNumber": 27, - "textBefore": null, - "textAfter": " The purpose", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588223782Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32f2057ed69a4c083e0907dac58c2ddb", - "type": "headline", - "value": "2.3 Route of Administration", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3 Route of Administration", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 514.72015 - }, - "width": 16.320007, - "height": -12.480011, - "page": 13 - }, - { - "topLeft": { - "x": 135.12001, - "y": 514.72015 - }, - "width": 135.59624, - "height": -12.480011, - "page": 13 - } - ], - "sectionNumber": 29, - "textBefore": null, - "textAfter": " The rats", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224002Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f017b0b68061767b4b44e6f1afde074b", - "type": "headline", - "value": "2.0 INTRODUCTION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.0 INTRODUCTION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 767.68005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 13 - }, - { - "topLeft": { - "x": 135.12001, - "y": 767.68005 - }, - "width": 111.788956, - "height": -12.959999, - "page": 13 - } - ], - "sectionNumber": 26, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 16, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224302Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5f0873b8101e449d4b24a233175c3e82", - "type": "headline", - "value": "3.2 Vehicle", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.2 Vehicle", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 364.23993 - }, - "width": 16.320007, - "height": -12.480011, - "page": 14 - }, - { - "topLeft": { - "x": 135.11998, - "y": 364.23993 - }, - "width": 40.80336, - "height": -12.480011, - "page": 14 - } - ], - "sectionNumber": 32, - "textBefore": null, - "textAfter": " The vehicle", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224522Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "290b33d5b801f87db64af0660055197f", - "type": "headline", - "value": "3.1 Test Item", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1 Test Item", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.760025, - "y": 740.08 - }, - "width": 16.320007, - "height": -12.479996, - "page": 14 - }, - { - "topLeft": { - "x": 135.12003, - "y": 740.08 - }, - "width": 53.27304, - "height": -12.479996, - "page": 14 - } - ], - "sectionNumber": 31, - "textBefore": null, - "textAfter": " Information supplied", - "comments": null, - "startOffset": 0, - "endOffset": 13, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224752Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0533288005e6abb2949d53794d9e8ea6", - "type": "headline", - "value": "3.3 Formulation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3 Formulation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75999, - "y": 306.87994 - }, - "width": 16.320007, - "height": -12.47998, - "page": 14 - }, - { - "topLeft": { - "x": 135.12, - "y": 306.87994 - }, - "width": 70.08145, - "height": -12.47998, - "page": 14 - } - ], - "sectionNumber": 33, - "textBefore": null, - "textAfter": " The test", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224972Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3173f503abcec6ffad03779c42d0cc69", - "type": "headline", - "value": "3.0 MATERIALS AND METHODS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.0 MATERIALS AND METHODS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 767.68005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 14 - }, - { - "topLeft": { - "x": 135.12001, - "y": 767.68005 - }, - "width": 193.73906, - "height": -12.959999, - "page": 14 - } - ], - "sectionNumber": 30, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588225202Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "14996c5dcc5b8d4734298e087b6b2d20", - "type": "headline", - "value": "3.4 Experimental Design", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4 Experimental Design", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 710.08 - }, - "width": 16.320007, - "height": -12.479996, - "page": 15 - }, - { - "topLeft": { - "x": 135.12001, - "y": 710.08 - }, - "width": 116.64143, - "height": -12.479996, - "page": 15 - } - ], - "sectionNumber": 34, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588225412Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3e0900b0d71aba1617fbafeae5ca5492", - "type": "headline", - "value": "3.4.1 Animals information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.1 Animals information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76002, - "y": 683.44006 - }, - "width": 152.12204, - "height": -12, - "page": 15 - } - ], - "sectionNumber": 35, - "textBefore": null, - "textAfter": " Healthy nulliparous", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588225622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6870ade35ed5129a98d1f4a4d776e7f3", - "type": "headline", - "value": "3.4.2 Animal care and husbandry", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.2 Animal care and husbandry", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 461.68018 - }, - "width": 188.874, - "height": -12, - "page": 15 - } - ], - "sectionNumber": 36, - "textBefore": null, - "textAfter": " Animals were", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588225832Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "02c472e422fdd8839ad3f2086b07f819", - "type": "headline", - "value": "3.5 Serial Observations", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.5 Serial Observations", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.760124, - "y": 267.28015 - }, - "width": 16.320007, - "height": -12.47998, - "page": 16 - }, - { - "topLeft": { - "x": 135.12012, - "y": 267.28015 - }, - "width": 109.19232, - "height": -12.47998, - "page": 16 - } - ], - "sectionNumber": 38, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588226052Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "20228b458298dc509ebfd71894ecf3f5", - "type": "headline", - "value": "3.4.3 Dose administration", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.3 Dose administration", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76007, - "y": 420.8802 - }, - "width": 148.99199, - "height": -12, - "page": 16 - } - ], - "sectionNumber": 37, - "textBefore": null, - "textAfter": " The appropriate", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588226342Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "844844d3d3bc2b748b4fc74f29dfe901", - "type": "headline", - "value": "3.5.1 Mortality", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.5.1 Mortality", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76012, - "y": 240.64014 - }, - "width": 94.56798, - "height": -12, - "page": 16 - } - ], - "sectionNumber": 39, - "textBefore": null, - "textAfter": " Cages of", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588226572Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "537acdd95eaaefaec2d68105130dc2ea", - "type": "headline", - "value": "3.8 Quality Assurance Procedures", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.8 Quality Assurance Procedures", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76, - "y": 307.12 - }, - "width": 16.320007, - "height": -12.47998, - "page": 17 - }, - { - "topLeft": { - "x": 135.12, - "y": 307.12 - }, - "width": 168.71005, - "height": -12.47998, - "page": 17 - } - ], - "sectionNumber": 48, - "textBefore": null, - "textAfter": " Details of", - "comments": null, - "startOffset": 0, - "endOffset": 32, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588226792Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4202563183bd96b05bd59cc4c8fb3b9d", - "type": "headline", - "value": "3.5.2 Clinical observations", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.5.2 Clinical observations", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 765.76 - }, - "width": 152.988, - "height": -12, - "page": 17 - } - ], - "sectionNumber": 40, - "textBefore": null, - "textAfter": " Animals were", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588227012Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "63ffd0eb3b020cfbd398d267f18c0ad3", - "type": "headline", - "value": "3.7 Computer Systems", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.7 Computer Systems", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 414.39996 - }, - "width": 16.320007, - "height": -12.480011, - "page": 17 - }, - { - "topLeft": { - "x": 135.11998, - "y": 414.39996 - }, - "width": 104.86275, - "height": -12.480011, - "page": 17 - } - ], - "sectionNumber": 47, - "textBefore": null, - "textAfter": " The computer", - "comments": null, - "startOffset": 0, - "endOffset": 20, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588227582Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a220a7ed3d694580fc5856bb58a52ae3", - "type": "headline", - "value": "3.6.1 Macroscopic pathology", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.6.1 Macroscopic pathology", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 498.87997 - }, - "width": 164.15994, - "height": -12, - "page": 17 - } - ], - "sectionNumber": 43, - "textBefore": null, - "textAfter": " All animals", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588227792Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "29c33460d5fa7a8d04055fd1896e6f08", - "type": "headline", - "value": "3.5.3 Body weight", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.5.3 Body weight", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 626.5601 - }, - "width": 109.12001, - "height": -12, - "page": 17 - } - ], - "sectionNumber": 41, - "textBefore": null, - "textAfter": " The weight", - "comments": null, - "startOffset": 0, - "endOffset": 17, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228012Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bf45f01a69c3a583c07f6001575f7234", - "type": "headline", - "value": "4.3 Body Weight", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.3 Body Weight", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76002, - "y": 390.39996 - }, - "width": 16.320007, - "height": -12.480011, - "page": 18 - }, - { - "topLeft": { - "x": 135.12003, - "y": 390.39996 - }, - "width": 72.23863, - "height": -12.480011, - "page": 18 - } - ], - "sectionNumber": 52, - "textBefore": null, - "textAfter": " Appendix 2,", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228222Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7cc8a3ac3ae7386f74898ed47126fc1c", - "type": "headline", - "value": "4.1 Mortality", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.1 Mortality", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 740.08 - }, - "width": 16.320007, - "height": -12.479996, - "page": 18 - }, - { - "topLeft": { - "x": 135.12001, - "y": 740.08 - }, - "width": 53.281555, - "height": -12.479996, - "page": 18 - } - ], - "sectionNumber": 50, - "textBefore": null, - "textAfter": " Table 1", - "comments": null, - "startOffset": 0, - "endOffset": 13, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228442Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3239729d4947ef8750fa21b7ee59193d", - "type": "headline", - "value": "4.4 Macroscopic Examination", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.4 Macroscopic Examination", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76003, - "y": 291.51996 - }, - "width": 16.320007, - "height": -12.47998, - "page": 18 - }, - { - "topLeft": { - "x": 135.12003, - "y": 291.51996 - }, - "width": 145.44818, - "height": -12.47998, - "page": 18 - } - ], - "sectionNumber": 53, - "textBefore": null, - "textAfter": " Appendix 4", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228672Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "959a69a9befa0b6c0fa47c19e632f6a7", - "type": "headline", - "value": "4.0 RESULTS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.0 RESULTS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 767.68005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 18 - }, - { - "topLeft": { - "x": 135.12001, - "y": 767.68005 - }, - "width": 63.649445, - "height": -12.959999, - "page": 18 - } - ], - "sectionNumber": 49, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228892Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4d009a492e65ae6070df83a714ffbf8b", - "type": "headline", - "value": "4.2 Clinical Signs", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.2 Clinical Signs", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76004, - "y": 572.32007 - }, - "width": 16.320007, - "height": -12.480011, - "page": 18 - }, - { - "topLeft": { - "x": 135.12004, - "y": 572.32007 - }, - "width": 76.075455, - "height": -12.480011, - "page": 18 - } - ], - "sectionNumber": 51, - "textBefore": null, - "textAfter": " Appendix 1", - "comments": null, - "startOffset": 0, - "endOffset": 18, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588229172Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0a7abab489ed001e564599df339b9d4a", - "type": "headline", - "value": "5.0 CONCLUSION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "5.0 CONCLUSION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 764.80005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 19 - }, - { - "topLeft": { - "x": 135.12001, - "y": 764.80005 - }, - "width": 94.511765, - "height": -12.959999, - "page": 19 - } - ], - "sectionNumber": 54, - "textBefore": null, - "textAfter": " The acute", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588229402Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8968e500a8b3664d3ab87ef445bd9cf6", - "type": "headline", - "value": "6.0 REFERENCES", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "6.0 REFERENCES", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 764.80005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 20 - }, - { - "topLeft": { - "x": 135.12001, - "y": 764.80005 - }, - "width": 94.12416, - "height": -12.959999, - "page": 20 - } - ], - "sectionNumber": 55, - "textBefore": null, - "textAfter": " OECD Guideline", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588229622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ef8d4bd4b2e8c8478482350bd25cb3d7", - "type": "headline", - "value": "TABLES SECTION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "TABLES SECTION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 253.92001, - "y": 764.80005 - }, - "width": 121.63989, - "height": -12.959999, - "page": 21 - } - ], - "sectionNumber": 56, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588229852Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "37cee5f3ba927d0b126c957b25549179", - "type": "headline", - "value": "TABLE 1 Mortality Data", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "TABLE 1 Mortality Data", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 503.91998 - }, - "width": 53.759987, - "height": -12.479996, - "page": 22 - }, - { - "topLeft": { - "x": 215.28, - "y": 503.91998 - }, - "width": 83.27768, - "height": -12.479996, - "page": 22 - } - ], - "sectionNumber": 70, - "textBefore": null, - "textAfter": " * The", - "comments": null, - "startOffset": 0, - "endOffset": 22, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230072Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c5182532407db5a98e3680cf665f03a8", - "type": "headline", - "value": "APPENDICES SECTION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDICES SECTION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 236.88, - "y": 764.80005 - }, - "width": 155.9599, - "height": -12.959999, - "page": 23 - } - ], - "sectionNumber": 71, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 18, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230292Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9adc14260604fa79a8cbe70d62ef9cb6", - "type": "headline", - "value": "APPENDIX 1 Signs Associated with Dosing", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 1 Signs Associated with Dosing", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 503.91998 - }, - "width": 254.87512, - "height": -12.479996, - "page": 24 - } - ], - "sectionNumber": 81, - "textBefore": null, - "textAfter": " Only animals", - "comments": null, - "startOffset": 0, - "endOffset": 39, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230512Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dfdefbed33bdad22404dc28af422be8a", - "type": "headline", - "value": "APPENDIX 1 Signs Associated with Dosing (cont)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 1 Signs Associated with Dosing (cont)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 503.91998 - }, - "width": 76.78837, - "height": -12.479996, - "page": 25 - }, - { - "topLeft": { - "x": 229.68, - "y": 503.91998 - }, - "width": 196.79706, - "height": -12.479996, - "page": 25 - } - ], - "sectionNumber": 91, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230722Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "80048119dde8be5018f89c2f486daafd", - "type": "headline", - "value": "APPENDIX 2 Individual Body Weight (g)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 2 Individual Body Weight (g)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 501.03998 - }, - "width": 245.51334, - "height": -12.479996, - "page": 26 - } - ], - "sectionNumber": 104, - "textBefore": null, - "textAfter": " * Prior", - "comments": null, - "startOffset": 0, - "endOffset": 37, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230942Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "19cd1b5c99036c6f6cc203bd1a500380", - "type": "headline", - "value": "APPENDIX 3 Individual Body Weight Change (g)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 3 Individual Body Weight Change (g)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 501.03998 - }, - "width": 291.35333, - "height": -12.479996, - "page": 27 - } - ], - "sectionNumber": 117, - "textBefore": null, - "textAfter": " - Not", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588231172Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1ce7a3f5c1117b3b88cd8ac9499ef606", - "type": "headline", - "value": "APPENDIX 4 Macroscopic Findings", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 4 Macroscopic Findings", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 503.91998 - }, - "width": 215.7691, - "height": -12.479996, - "page": 28 - } - ], - "sectionNumber": 139, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588231382Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "645c0b100059bd8d692f37eacf14f720", - "type": "headline", - "value": "APPENDIX 5 Certificate of Analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 5 Certificate of Analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 765.27997 - }, - "width": 216.7236, - "height": -12.479996, - "page": 29 - } - ], - "sectionNumber": 140, - "textBefore": null, - "textAfter": " syngenta GLP", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588231592Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3b0c9aff63ecb4c945a55c66075859f6", - "type": "headline", - "value": "CGA 100251", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA 100251", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 288, - "y": 534.82745 - }, - "width": 40.049927, - "height": -10.827423, - "page": 30 - } - ], - "sectionNumber": 141, - "textBefore": "100251 MES 630/1 ", - "textAfter": " CGA 26423", - "comments": null, - "startOffset": 21, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588231802Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:41:01.642701Z", - "requestedDate": "2022-10-10T11:41:01.631112Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6f4474461e96a27847aa79e21ea7dc93", - "type": "headline", - "value": "CGA 100251", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA 100251", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 291, - "y": 667.97406 - }, - "width": 21.856628, - "height": -12.97406, - "page": 30 - }, - { - "topLeft": { - "x": 316, - "y": 668.3759 - }, - "width": 30, - "height": -12.3759, - "page": 30 - } - ], - "sectionNumber": 141, - "textBefore": null, - "textAfter": " MES 630/1", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232012Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:43:23.82223Z", - "requestedDate": "2022-10-10T11:43:23.811375Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "289629484146fb54f2c09d6cb3a4a2d5", - "type": "headline", - "value": "CGA 100251", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA 100251", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 207, - "y": 410.8824 - }, - "width": 40.049927, - "height": -10.882385, - "page": 30 - } - ], - "sectionNumber": 141, - "textBefore": "— Content of ", - "textAfter": " * -", - "comments": null, - "startOffset": 399, - "endOffset": 409, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232232Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:41:07.50703Z", - "requestedDate": "2022-10-10T11:41:07.489352Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bffc092877c659395a7999826c4f1cdd", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "APPENDIX 5 Certificate of Analysis", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 90, - "y": 134 - }, - "width": 450, - "height": 636, - "page": 30 - } - ], - "sectionNumber": 140, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232442Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b0f4f19635bbec4b8161c140cd2f2d3c", - "type": "headline", - "value": "APPENDIX 6 GLP Compliance Statement", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 6 GLP Compliance Statement", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 765.27997 - }, - "width": 249.35074, - "height": -12.479996, - "page": 31 - } - ], - "sectionNumber": 142, - "textBefore": null, - "textAfter": " ae Department", - "comments": null, - "startOffset": 0, - "endOffset": 35, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232662Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a325178e3b1188d616467cbe88e454be", - "type": "headline", - "value": "GOOD LABORATORY PRACTICE", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "GOOD LABORATORY PRACTICE", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 234, - "y": 636.96014 - }, - "width": 157.05005, - "height": -12.960144, - "page": 32 - } - ], - "sectionNumber": 144, - "textBefore": null, - "textAfter": " STATEMENT OF", - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232932Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "44cb66d8c6436da850c2c9996b23d591", - "type": "headline", - "value": "THE DEPARTMENT OF HEALTH OF THE GOVERNMENT OF THE UNITED KINGDOM", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "THE DEPARTMENT OF HEALTH OF THE GOVERNMENT\nOF THE UNITED KINGDOM", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 180, - "y": 672.61774 - }, - "width": 266.125, - "height": -12.617752, - "page": 32 - }, - { - "topLeft": { - "x": 249, - "y": 660.996 - }, - "width": 128.775, - "height": -12.995956, - "page": 32 - } - ], - "sectionNumber": 143, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588233152Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bfe4921e930b74d8ebfb2f3f457f71fc", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "APPENDIX 6 GLP Compliance Statement", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 90, - "y": 117 - }, - "width": 450, - "height": 653, - "page": 32 - } - ], - "sectionNumber": 142, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588233352Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ef18362ea58a3235ab96bbd46321fb31", - "type": "headline", - "value": "3.6 Post Mortem Investigations", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.6 Post Mortem", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76, - "y": 542.8395 - }, - "width": 16.32, - "height": 11.572875, - "page": 17 - }, - { - "topLeft": { - "x": 135.12, - "y": 542.8395 - }, - "width": 149.2872, - "height": 11.572875, - "page": 17 - } - ], - "sectionNumber": 42, - "textBefore": null, - "textAfter": " All surviving", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588227232Z" - }, - { - "analysisNumber": 3, - "type": "CHANGED", - "dateTime": "2022-10-10T11:42:52.061730355Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:42:51.681Z", - "requestedDate": "2022-10-10T11:42:51.681232Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "3.6 Post Mortem Investigations" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cdfc26a047ad2c161db0c817dbdb223c", - "type": "manual", - "value": "Certificate of Analysis", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 260, - "y": 674.20294 - }, - "width": 116.07498, - "height": 15.263537, - "page": 30 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:41:35.114Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:41:35.114Z", - "requestedDate": "2022-10-10T11:41:35.114Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - } - ], - "legalBasis": [ - { - "name": "n-a.", - "description": "n-a.", - "reason": "n-a." - } - ], - "dictionaryVersion": 12, - "dossierDictionaryVersion": 1, - "rulesVersion": 3, - "legalBasisVersion": 2 -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23_REDACTION_LOG.json b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23_REDACTION_LOG.json deleted file mode 100644 index d7e56dfd..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23_REDACTION_LOG.json +++ /dev/null @@ -1,13485 +0,0 @@ -{ - "analysisVersion": 1, - "analysisNumber": 1, - "redactionLogEntry": [ - { - "id": "838781874e966a1798c89b17b39ce659", - "type": "headline", - "value": "1.1 Context in which the renewal assessment report was prepared", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1 Context in which the renewal assessment report was prepared", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 668.1894 - }, - "width": 322.98685, - "height": -10.929367, - "page": 8 - } - ], - "sectionNumber": 9, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283232962Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e55e7d1fc5fded34996c61a48d13a740", - "type": "headline", - "value": "1.1.2 Arrangements between rapporteur Member State and co-rapporteur Member State", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.2 Arrangements between rapporteur Member State and co-rapporteur Member State", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 319.65942 - }, - "width": 425.50845, - "height": -10.929382, - "page": 8 - } - ], - "sectionNumber": 11, - "textBefore": null, - "textAfter": " Latvia, acting", - "comments": null, - "startOffset": 0, - "endOffset": 81, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283235652Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1fd3b727ecba39c98e038b7d5f836c6d", - "type": "headline", - "value": "1.1.3 EU Regulatory history for use in Plant Protection Products", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.3 EU Regulatory history for use in Plant Protection Products", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 266.22937 - }, - "width": 309.31674, - "height": -10.929382, - "page": 8 - } - ], - "sectionNumber": 12, - "textBefore": null, - "textAfter": " Trinexapac was", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283235802Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ab0a095403ba7eb9acad7c748aa7ad64", - "type": "headline", - "value": "1.1.1 Purpose for which the renewal assessment report was prepared", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.1 Purpose for which the renewal assessment report was prepared", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 649.2294 - }, - "width": 329.00748, - "height": -10.929367, - "page": 8 - } - ], - "sectionNumber": 10, - "textBefore": null, - "textAfter": " Trinexapac is", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236192Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b0a95fd421d8a0f51b77330e76d3f01d", - "type": "headline", - "value": "1.1.4 Evaluations carried out under other regulatory contexts", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.4 Evaluations carried out under other regulatory contexts", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 642.2694 - }, - "width": 294.81012, - "height": -10.929367, - "page": 9 - } - ], - "sectionNumber": 13, - "textBefore": null, - "textAfter": " The RMS", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236422Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "eabdb204ae02a2ae1d3ffaeb7f14bb7e", - "type": "headline", - "value": "1.2.2 Producer or producers of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.2 Producer or producers of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 202.6294 - }, - "width": 247.68033, - "height": -10.929382, - "page": 10 - } - ], - "sectionNumber": 18, - "textBefore": null, - "textAfter": " See 1.2.1", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236572Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8e44c366d663333d792828d35f110d6b", - "type": "headline", - "value": "1.2.1 Name and address of applicant(s) for approval of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.1 Name and address of applicant(s) for approval of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 711.7494 - }, - "width": 358.9747, - "height": -10.929367, - "page": 10 - } - ], - "sectionNumber": 17, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 75, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236732Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ffb4e91b4199eff833ec2fcaad2838e2", - "type": "headline", - "value": "1.2 Applicant(s) information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2 Applicant(s) information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 754.7094 - }, - "width": 149.16586, - "height": -10.929359, - "page": 10 - } - ], - "sectionNumber": 14, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236882Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "319477cab9ac18c5532dd0a7bc8b59d7", - "type": "headline", - "value": "1.3.2 Chemical name (IUPAC and CA nomenclature)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.2 Chemical name (IUPAC and CA nomenclature)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 582.2394 - }, - "width": 256.5234, - "height": -10.929352, - "page": 11 - } - ], - "sectionNumber": 25, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 47, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237032Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b18e8a619602cb07bf7e55d1e60e157b", - "type": "headline", - "value": "1.3.4 CAS, EC and CIPAC numbers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.4 CAS, EC and CIPAC numbers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 350.01938 - }, - "width": 177.16785, - "height": -10.929352, - "page": 11 - } - ], - "sectionNumber": 27, - "textBefore": null, - "textAfter": " CAS: 95266-40-3", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237182Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "03cd9a9d6fc540d0ff8cf3030a09ee51", - "type": "headline", - "value": "1.3 Identity of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3 Identity of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 697.46936 - }, - "width": 177.5101, - "height": -10.929367, - "page": 11 - } - ], - "sectionNumber": 20, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237352Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c4b16f91e4568a26e0c22c8b9ee26346", - "type": "headline", - "value": "1.3.3 Producer's development code numbers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.3 Producer's development code numbers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 448.53937 - }, - "width": 214.44998, - "height": -10.929352, - "page": 11 - } - ], - "sectionNumber": 26, - "textBefore": null, - "textAfter": " CGA 163935", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237502Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6108674c4bb7019889f4d15e121d7dc8", - "type": "headline", - "value": "1.3.1 Common name proposed or ISO-accepted and synonyms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.1 Common name proposed or ISO-accepted and synonyms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 654.5094 - }, - "width": 299.23163, - "height": -10.929367, - "page": 11 - } - ], - "sectionNumber": 21, - "textBefore": null, - "textAfter": " Trinexapac-ethyl", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237652Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e6ade5bdcde5fba6d3d1d34abc111de5", - "type": "headline", - "value": "1.3.5 Molecular and structural formulae, molecular mass", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.5 Molecular and structural formulae, molecular mass", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 225.30939 - }, - "width": 274.7156, - "height": -10.929382, - "page": 11 - } - ], - "sectionNumber": 33, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237792Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "503db568638d82005e165d730dddfb3f", - "type": "headline", - "value": "1.2.3 Information relating to the collective provision of dossiers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.3 Information relating to the collective provision of dossiers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 303.06802, - "height": -10.929359, - "page": 11 - } - ], - "sectionNumber": 19, - "textBefore": null, - "textAfter": " See 1.2.1", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237942Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "877b0ed9c3c4509f049d168da63c779d", - "type": "headline", - "value": "1.3.8 Identity and content of additives (such as stabilisers) and impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8 Identity and content of additives (such as stabilisers) and impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 454.67938 - }, - "width": 349.52438, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 36, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 76, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238092Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4a27965ac4bc070c9466fe9090b64887", - "type": "headline", - "value": "1.3.9 Analytical profile of batches", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.9 Analytical profile of batches", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 177.78937 - }, - "width": 164.31729, - "height": -10.929382, - "page": 12 - } - ], - "sectionNumber": 40, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 35, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238252Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cd0e72f39d6f1aff32c7b10ab3857c6a", - "type": "headline", - "value": "1.3.8.2 Significant impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.2 Significant impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 339.45938 - }, - "width": 141.74483, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 38, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238392Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aa08466137f3730973847f684ea2f263", - "type": "headline", - "value": "1.3.6 Method of manufacture (synthesis pathway) of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.6 Method of manufacture (synthesis pathway) of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 599.15936 - }, - "width": 347.31644, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 34, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 71, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238542Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1188cbd3fcb36cff0a22413d041f4aa9", - "type": "headline", - "value": "1.3.7 Specification of purity of the active substance in g/kg", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.7 Specification of purity of the active substance in g/kg", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 526.9194 - }, - "width": 279.57703, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 35, - "textBefore": null, - "textAfter": " 950 g/kg", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238682Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cc44d534126212540a636625fd4085d8", - "type": "headline", - "value": "1.3.8.3 Relevant impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.3 Relevant impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 267.3094 - }, - "width": 132.55664, - "height": -10.929382, - "page": 12 - } - ], - "sectionNumber": 39, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238822Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "73bda4264dae9b5f56bb35137e130021", - "type": "headline", - "value": "1.3.8.1 Additives", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.1 Additives", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 411.69937 - }, - "width": 84.65697, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 37, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 17, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238962Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0596812460ae817606f287e1bd5224aa", - "type": "headline", - "value": "1.4.1 Applicant", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.1 Applicant", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 726.7494 - }, - "width": 78.54704, - "height": -10.929367, - "page": 13 - } - ], - "sectionNumber": 42, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239262Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "891a37512f629020893f9a0307eb095b", - "type": "headline", - "value": "1.4 Information on the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4 Information on the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 239.49973, - "height": -10.929359, - "page": 13 - } - ], - "sectionNumber": 41, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 47, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239412Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fa22339d01398dbf1ac65d9d922da9b1", - "type": "headline", - "value": "1.4.2 Producer of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.2 Producer of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 486.23715 - }, - "width": 223.55795, - "height": -10.447144, - "page": 13 - } - ], - "sectionNumber": 43, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239732Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dff75113696feb739118e3c4ab628d5e", - "type": "headline", - "value": "1.4.4.2 Information on the active substances", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.2 Information on the active substances", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 635.06714 - }, - "width": 212.2904, - "height": -10.447144, - "page": 14 - } - ], - "sectionNumber": 54, - "textBefore": null, - "textAfter": " The active", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240032Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2e3660d4884600cd2f21a2d6cb18336a", - "type": "headline", - "value": "1.4.4.3 Information on safeners, synergists and co-formulants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.3 Information on safeners, synergists and co-formulants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 209.58716 - }, - "width": 294.214, - "height": -10.447144, - "page": 14 - } - ], - "sectionNumber": 55, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240172Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2bce5a2a47a517a46431330a9048a086", - "type": "headline", - "value": "1.4.4.1 Composition of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.1 Composition of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 707.78937 - }, - "width": 247.40869, - "height": -10.929367, - "page": 14 - } - ], - "sectionNumber": 46, - "textBefore": null, - "textAfter": " Confidential information", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240322Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "987acde824537306bfb45ca83acd86cf", - "type": "headline", - "value": "1.4.6 Function", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.6 Function", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 696.9871 - }, - "width": 74.2861, - "height": -10.447144, - "page": 15 - } - ], - "sectionNumber": 57, - "textBefore": null, - "textAfter": " Plant growth", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240472Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d5eacac5f1442e228f3446587a08af45", - "type": "headline", - "value": "1.4.8 Effects on harmful organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.8 Effects on harmful organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 448.7794 - }, - "width": 171.14001, - "height": -10.929352, - "page": 15 - } - ], - "sectionNumber": 59, - "textBefore": null, - "textAfter": " Trinexapac-ethyl, present", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e47b8ceb9348a22c39f5e2fbff83f863", - "type": "headline", - "value": "1.4.7 Field of use envisaged", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.7 Field of use envisaged", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 581.7594 - }, - "width": 134.45407, - "height": -10.929352, - "page": 15 - } - ], - "sectionNumber": 58, - "textBefore": null, - "textAfter": " Agriculture. A8587F", - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240762Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "657ca15f20378916d184de4fc1155f15", - "type": "headline", - "value": "1.5 Detailed uses of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5 Detailed uses of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 298.53937 - }, - "width": 241.05637, - "height": -10.929382, - "page": 15 - } - ], - "sectionNumber": 60, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240902Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "89baac9241232271dccba2d5144aef6c", - "type": "headline", - "value": "1.4.5 Type and code of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.5 Type and code of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.2272 - }, - "width": 248.03363, - "height": -10.447144, - "page": 15 - } - ], - "sectionNumber": 56, - "textBefore": null, - "textAfter": " Micro-emulsion (ME)", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241052Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "706f1f89975b8303c80d84e213669d45", - "type": "headline", - "value": "1.5.1 Details of representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.1 Details of representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 508.10938 - }, - "width": 168.63585, - "height": -10.929359, - "page": 16 - } - ], - "sectionNumber": 67, - "textBefore": null, - "textAfter": " Remarks: (a)", - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241192Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ff50c0d405f58b7a7e813cd3dc4981a2", - "type": "headline", - "value": "1.5.4 Overview on authorisations in EU Member States", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.4 Overview on authorisations in EU Member States", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 619.46936 - }, - "width": 265.41058, - "height": -10.929367, - "page": 17 - } - ], - "sectionNumber": 70, - "textBefore": null, - "textAfter": " Trinexapac-ethyl containing", - "comments": null, - "startOffset": 0, - "endOffset": 52, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241492Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "05d216eb9d707a2d771ca13714ad8d0b", - "type": "headline", - "value": "1.5.2 Further information on representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.2 Further information on representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 753.6294 - }, - "width": 234.91212, - "height": -10.929359, - "page": 17 - } - ], - "sectionNumber": 68, - "textBefore": null, - "textAfter": " Please refer", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241642Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4d39b51743e0813dfc959129c212ef9e", - "type": "headline", - "value": "2 Summary of active substance hazard and of product risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2 Summary of active substance hazard and of product risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 703.2294 - }, - "width": 346.53125, - "height": -10.929367, - "page": 18 - } - ], - "sectionNumber": 71, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241802Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2e6dd0ca4cb4f6699ea81535cc6c440a", - "type": "headline", - "value": "2.1.1 Summary of identity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1.1 Summary of identity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 617.3094 - }, - "width": 129.2984, - "height": -10.929367, - "page": 18 - } - ], - "sectionNumber": 73, - "textBefore": null, - "textAfter": " Trinexapac-ethyl is", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241942Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "98dd5fa288e1d181a41af0c28026e3eb", - "type": "headline", - "value": "2.1 Identity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1 Identity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 660.2694 - }, - "width": 69.46161, - "height": -10.929367, - "page": 18 - } - ], - "sectionNumber": 72, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242182Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9ab9cef438726776888c16d3ec4f965a", - "type": "headline", - "value": "2.2 Physical and chemical properties", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 Physical and chemical properties", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 186.98244, - "height": -10.929359, - "page": 19 - } - ], - "sectionNumber": 74, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242352Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9cb730129ae62cdbc3b094f045ae1bed", - "type": "headline", - "value": "2.2.1 Summary of physical and chemical properties of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2.1 Summary of physical and chemical properties of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 725.6694 - }, - "width": 355.6372, - "height": -10.929367, - "page": 19 - } - ], - "sectionNumber": 75, - "textBefore": null, - "textAfter": " Summary and", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242502Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "39d8470e1bb3c9c841f018d162ed049a", - "type": "headline", - "value": "2.3.1 Summary of effectiveness", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.1 Summary of effectiveness", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 238.6294 - }, - "width": 151.81999, - "height": -10.929382, - "page": 20 - } - ], - "sectionNumber": 78, - "textBefore": null, - "textAfter": " Trinexapac-ethyl acts", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242652Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c63ae51dad547c274c1af33693df91e4", - "type": "headline", - "value": "2.3 Data on application and efficacy", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3 Data on application and efficacy", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 281.58936 - }, - "width": 183.65938, - "height": -10.929382, - "page": 20 - } - ], - "sectionNumber": 77, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242812Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "09503494afdf315008b83a2e74a7a392", - "type": "headline", - "value": "2.2.2 Summary of physical and chemical properties of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2.2 Summary of physical and chemical properties of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 394.95398, - "height": -10.929359, - "page": 20 - } - ], - "sectionNumber": 76, - "textBefore": null, - "textAfter": " Physical, chemical", - "comments": null, - "startOffset": 0, - "endOffset": 81, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242962Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "159adbfd75bc15c1224a0f569f621816", - "type": "headline", - "value": "2.4.1 Summary of methods and precautions concerning handling, storage, transport or fire", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.1 Summary of methods and precautions concerning handling, storage, transport or fire", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 275.70935 - }, - "width": 432.3023, - "height": -10.929382, - "page": 21 - } - ], - "sectionNumber": 83, - "textBefore": null, - "textAfter": " Sufficient information", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243112Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e83062929224448eb0ce0c0a8629a44d", - "type": "headline", - "value": "2.3.2 Summary of information on the development of resistance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.2 Summary of information on the development of resistance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 304.88965, - "height": -10.929359, - "page": 21 - } - ], - "sectionNumber": 79, - "textBefore": null, - "textAfter": " The development", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243252Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9ea2b4588666ebb4f76b5aa4b2323348", - "type": "headline", - "value": "2.3.3 Summary of adverse effects on treated crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.3 Summary of adverse effects on treated crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 627.3894 - }, - "width": 241.06743, - "height": -10.929367, - "page": 21 - } - ], - "sectionNumber": 80, - "textBefore": null, - "textAfter": " Trinexapac-ethyl containing", - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243392Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "63065558d36b28ddfa1fecb1c70a1517", - "type": "headline", - "value": "2.3.4 Summary of observations on other undesirable or unintended side-effects", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.4 Summary of observations on other undesirable or unintended side-effects", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 537.9594 - }, - "width": 376.2165, - "height": -10.929352, - "page": 21 - } - ], - "sectionNumber": 81, - "textBefore": null, - "textAfter": " Minimum waiting", - "comments": null, - "startOffset": 0, - "endOffset": 77, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e4016a029cd20284f63e2f2398b87f75", - "type": "headline", - "value": "2.4 Further information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4 Further information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 318.69934 - }, - "width": 128.36, - "height": -10.929382, - "page": 21 - } - ], - "sectionNumber": 82, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243832Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7392d5ababe4e7e91bb9d5c61dd6adb2", - "type": "headline", - "value": "10.6 Hydrogen cianide gas may develop in the headspace of containers at normal storage.", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "10.6 Hydrogen cianide gas may develop in the headspace of containers at normal storage.", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 191.57, - "y": 178.67822 - }, - "width": 290.0026, - "height": -9.658203, - "page": 24 - } - ], - "sectionNumber": 84, - "textBefore": null, - "textAfter": " Wear full", - "comments": null, - "startOffset": 0, - "endOffset": 87, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243972Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:46:52.889075Z", - "requestedDate": "2022-10-10T11:46:52.872981Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7699793041ba25b6c6765721299ea55d", - "type": "headline", - "value": "2.4.2 Summary of procedures for destruction or decontamination", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.2 Summary of procedures for destruction or decontamination", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 313.09235, - "height": -10.929359, - "page": 26 - } - ], - "sectionNumber": 85, - "textBefore": null, - "textAfter": " Active substance", - "comments": null, - "startOffset": 0, - "endOffset": 62, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244112Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c432182af58ae882185ca408b7d6c752", - "type": "headline", - "value": "2.4.3 Summary of emergency measures in case of an accident", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.3 Summary of emergency measures in case of an accident", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 675.6294 - }, - "width": 292.9886, - "height": -10.929367, - "page": 27 - } - ], - "sectionNumber": 86, - "textBefore": null, - "textAfter": " Active substance", - "comments": null, - "startOffset": 0, - "endOffset": 58, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244252Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "415b0058277b80fe8902279a9027cf90", - "type": "paragraph-headline", - "value": "neutralisation procedure", - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.4.3 Summary of emergency measures in case of an accident", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 769.1071 - }, - "width": 107.289154, - "height": -10.447144, - "page": 28 - } - ], - "sectionNumber": 86, - "textBefore": "A 8587 F ", - "textAfter": " Neutralisation is", - "comments": null, - "startOffset": 1892, - "endOffset": 1916, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244392Z" - }, - { - "analysisNumber": 7, - "type": "REMOVED", - "dateTime": "2022-10-10T11:48:01.352193501Z" - } - ], - "manualChanges": [], - "engines": [ - "DICTIONARY" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": true, - "dossierDictionaryEntry": false - }, - { - "id": "c67bb9e21a30eb210810324c7777bb77", - "type": "headline", - "value": "2.5 Methods of analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5 Methods of analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 687.14935 - }, - "width": 124.97073, - "height": -10.929367, - "page": 28 - } - ], - "sectionNumber": 87, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244542Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "51aa6ab9ef52ee65a8673ecae0de177a", - "type": "headline", - "value": "2.5.1 Methods used for the generation of pre-authorisation data", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.1 Methods used for the generation of pre-authorisation data", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 644.1894 - }, - "width": 305.0423, - "height": -10.929367, - "page": 28 - } - ], - "sectionNumber": 105, - "textBefore": null, - "textAfter": " A validated", - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244692Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b0c6277d4d1eba4fc571bb8d89a0aa5e", - "type": "headline", - "value": "2.5.2 Methods for post control and monitoring purposes", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2 Methods for post control and monitoring purposes", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 269.10895, - "height": -10.929359, - "page": 31 - } - ], - "sectionNumber": 106, - "textBefore": null, - "textAfter": " The criteria", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244832Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "712711e1578e851c0510d21311be90e8", - "type": "headline", - "value": "2.5.2.1 Methods for residue determination in food/feed of plant origin", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.1 Methods for residue determination in food/feed of plant origin", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 677.4271 - }, - "width": 295.48206, - "height": -10.447144, - "page": 31 - } - ], - "sectionNumber": 114, - "textBefore": null, - "textAfter": " For residue", - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244972Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6960c378c69c348c2dd7ee265d3d113f", - "type": "headline", - "value": "2.5.2.3 Methods for the determination of the active substance and/or metabolites in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.3 Methods for the determination of the active substance and/or metabolites in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 315.69714 - }, - "width": 375.21375, - "height": -10.447144, - "page": 32 - } - ], - "sectionNumber": 122, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283245112Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "917e863e1650399d3640a97ef656b642", - "type": "headline", - "value": "2.5.2.4 Metods for the determination of the active substance and/or metabolites in water", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.4 Metods for the determination of the active substance and/or metabolites in water", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 472.19714 - }, - "width": 379.7057, - "height": -10.447144, - "page": 33 - } - ], - "sectionNumber": 129, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283245572Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "76d1adcc5418fef1624fc77c299e429c", - "type": "headline", - "value": "5.2.5 Methods for the determination of the active substance and/or metabolites in air", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "5.2.5 Methods for the determination of the active substance and/or metabolites in air", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 641.90717 - }, - "width": 373.02252, - "height": -10.447144, - "page": 34 - } - ], - "sectionNumber": 133, - "textBefore": null, - "textAfter": " The proposed", - "comments": null, - "startOffset": 0, - "endOffset": 85, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283245792Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "af695849fc41ee3bc71593ef8a0a2f78", - "type": "headline", - "value": "2.5.2.6 Analytical methods (residue) for body fluids and tissues (Annex IIA 4.2.5; Annex IIIA 5.2)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.6 Analytical methods (residue) for body fluids and tissues (Annex IIA 4.2.5; Annex IIIA 5.2)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 372.21713 - }, - "width": 27.489601, - "height": -10.447144, - "page": 34 - }, - { - "topLeft": { - "x": 128.66, - "y": 372.21713 - }, - "width": 383.51993, - "height": -10.447144, - "page": 34 - } - ], - "sectionNumber": 137, - "textBefore": null, - "textAfter": " In comparison", - "comments": null, - "startOffset": 0, - "endOffset": 98, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283245932Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ddc4fe79b2fd6a74ba58564700bffc46", - "type": "headline", - "value": "2.6 Effects on human and animal health", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6 Effects on human and animal health", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 202.37218, - "height": -10.929359, - "page": 36 - } - ], - "sectionNumber": 138, - "textBefore": null, - "textAfter": " The toxicological", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246072Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7a82746290e51f8361209983dc4b9454", - "type": "headline", - "value": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 532.1994 - }, - "width": 391.97314, - "height": -10.929352, - "page": 36 - } - ], - "sectionNumber": 139, - "textBefore": null, - "textAfter": " No new", - "comments": null, - "startOffset": 0, - "endOffset": 78, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246212Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7abffea271de1fb03734a3f8aed94f1a", - "type": "headline", - "value": "D., 2017).", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "D., 2017).", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 116.967964, - "y": 458.1218 - }, - "width": 40.702034, - "height": -10.531799, - "page": 38 - } - ], - "sectionNumber": 140, - "textBefore": null, - "textAfter": " The purpose", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246362Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:48:33.343887Z", - "requestedDate": "2022-10-10T11:48:33.326505Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6de538e45189570cc61de3759dd64b63", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 72, - "y": 629 - }, - "width": 142, - "height": 115, - "page": 38 - } - ], - "sectionNumber": 139, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246502Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b895021acd73e41a498919782ec7f8b1", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 330, - "y": 628 - }, - "width": 149, - "height": 109, - "page": 38 - } - ], - "sectionNumber": 139, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246652Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "599596be5505ce7e7dc6932f7ee7585c", - "type": "headline", - "value": "C., 2006),", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "C., 2006),", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 292.35468, - "y": 591.4418 - }, - "width": 41.52533, - "height": -10.531799, - "page": 39 - } - ], - "sectionNumber": 142, - "textBefore": null, - "textAfter": " however, not", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246882Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:48:41.477503Z", - "requestedDate": "2022-10-10T11:48:41.45952Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "81d4d471023c34a6609a6f1ce942b260", - "type": "headline", - "value": "2.6.2 Summary of acute toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.2 Summary of acute toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 155.69504, - "height": -10.929359, - "page": 39 - } - ], - "sectionNumber": 141, - "textBefore": null, - "textAfter": " Trinexapac-ethyl was", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247032Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "03fa37c652a54f2c9bf1a0f7937101d0", - "type": "headline", - "value": "J., 2017)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "J., 2017)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 175.04875, - "y": 557.0018 - }, - "width": 36.997925, - "height": -10.531799, - "page": 39 - } - ], - "sectionNumber": 156, - "textBefore": null, - "textAfter": " trinexapac-ethyl tech.", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247182Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:48:45.334254Z", - "requestedDate": "2022-10-10T11:48:45.317318Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "10a8ffca889633e43d50440360a9a71d", - "type": "headline", - "value": "2.6.3 Summary of short term toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.3 Summary of short term toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 180.50194, - "height": -10.929359, - "page": 41 - } - ], - "sectionNumber": 167, - "textBefore": null, - "textAfter": " All studies", - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247322Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "106c0ce1b8f000a8d4704ae2ca200e0a", - "type": "headline", - "value": "A., 1999),", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "A., 1999),", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 578.9618 - }, - "width": 41.126, - "height": -10.531799, - "page": 44 - } - ], - "sectionNumber": 168, - "textBefore": null, - "textAfter": " the reduction", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247472Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:48:57.271834Z", - "requestedDate": "2022-10-10T11:48:57.25642Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f8a1a5280b059efdcee1ec7f2f4e16ae", - "type": "headline", - "value": "A., 1988)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "A., 1988)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 159.48392, - "y": 289.95178 - }, - "width": 38.162766, - "height": -10.531799, - "page": 45 - } - ], - "sectionNumber": 171, - "textBefore": null, - "textAfter": " and one", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247632Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:12.376643Z", - "requestedDate": "2022-10-10T11:49:12.362627Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "eef2528cd67e06595c00325b3b40a27f", - "type": "headline", - "value": "C., 1989)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "C., 1989)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 328.72195, - "y": 289.95178 - }, - "width": 38.624725, - "height": -10.531799, - "page": 45 - } - ], - "sectionNumber": 172, - "textBefore": null, - "textAfter": " were considered", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247782Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:09.088555Z", - "requestedDate": "2022-10-10T11:49:09.072705Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1dbe3f091ea7025791a5982ed92a986e", - "type": "headline", - "value": "F., 1989)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "F., 1989)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 305.83, - "y": 341.7018 - }, - "width": 39.07669, - "height": -10.53183, - "page": 45 - } - ], - "sectionNumber": 170, - "textBefore": null, - "textAfter": " was rejected", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247932Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:05.163578Z", - "requestedDate": "2022-10-10T11:49:05.144218Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d78c3013bd8eabc14da8430050633d12", - "type": "headline", - "value": "2.6.4 Summary of genotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.4 Summary of genotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 432.57938 - }, - "width": 150.05362, - "height": -10.929352, - "page": 45 - } - ], - "sectionNumber": 169, - "textBefore": null, - "textAfter": " Trinexapac-ethyl (CGA", - "comments": null, - "startOffset": 0, - "endOffset": 29, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248082Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "90080a4ef6f1449c4bbd0e0910623ecf", - "type": "headline", - "value": "M., 2010)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "M., 2010)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 205.81651, - "y": 431.9418 - }, - "width": 39.710175, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 176, - "textBefore": null, - "textAfter": " under metabolic-activation", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248232Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:24.894817Z", - "requestedDate": "2022-10-10T11:49:24.874883Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c31ffec51f19d98564b691f9ce975c0f", - "type": "headline", - "value": "2009).", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2009).", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 449.1018 - }, - "width": 25.889977, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 175, - "textBefore": null, - "textAfter": " Trinexapac-ethyl tech.", - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248392Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:28.31954Z", - "requestedDate": "2022-10-10T11:49:28.305156Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8d012ea7bc824f8929948facb857400d", - "type": "headline", - "value": "I., 2017", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "I., 2017", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 250.92778, - "y": 708.7118 - }, - "width": 31.672867, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 173, - "textBefore": null, - "textAfter": " and Gilby", - "comments": null, - "startOffset": 0, - "endOffset": 8, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248542Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:19.014273Z", - "requestedDate": "2022-10-10T11:49:19.002429Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "31be28ba0f1ae2aec12c9b14379ce323", - "type": "headline", - "value": "G., 2015)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "G., 2015)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 258.25986, - "y": 613.4318 - }, - "width": 39.966827, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 174, - "textBefore": null, - "textAfter": " in order", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248702Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:22.160165Z", - "requestedDate": "2022-10-10T11:49:22.144752Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "99acbecfe34b3a24c182bf75d82a9e4d", - "type": "headline", - "value": "J., 2010)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "J., 2010)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 163.54352, - "y": 414.6618 - }, - "width": 36.62317, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 212, - "textBefore": null, - "textAfter": " gave the", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248852Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:31.508121Z", - "requestedDate": "2022-10-10T11:49:31.490012Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "73487c77e5072d31948e2836897c46a5", - "type": "headline", - "value": "2.6.5 Summary of long term toxicity and carcinogenicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.5 Summary of long term toxicity and carcinogenicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 178.02942 - }, - "width": 270.9416, - "height": -10.929382, - "page": 50 - } - ], - "sectionNumber": 217, - "textBefore": null, - "textAfter": " One 52/104-week", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248992Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32df1d0209b2bc49deab382fb937a7c0", - "type": "headline", - "value": "2.6.6 Summary of reproductive toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.6 Summary of reproductive toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 389.13937 - }, - "width": 191.1776, - "height": -10.929352, - "page": 52 - } - ], - "sectionNumber": 227, - "textBefore": null, - "textAfter": " This section", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249132Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d40c9709130b777b752fbf24b62113d5", - "type": "headline", - "value": "E, 1999", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "E, 1999", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 474.4038, - "y": 178.11182 - }, - "width": 31.573273, - "height": -10.531799, - "page": 54 - } - ], - "sectionNumber": 235, - "textBefore": null, - "textAfter": " and Krinke", - "comments": null, - "startOffset": 0, - "endOffset": 7, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249282Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:54.148663Z", - "requestedDate": "2022-10-10T11:49:54.132255Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ee241a1f4f170ae1a744197454ed76de", - "type": "headline", - "value": "2.6.7 Summary of neurotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.7 Summary of neurotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 407.13937 - }, - "width": 155.53256, - "height": -10.929352, - "page": 54 - } - ], - "sectionNumber": 228, - "textBefore": null, - "textAfter": " Trinexapac-ethyl has", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249422Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ab93313f27a4ab5ff1ddf6f91c58a0b4", - "type": "headline", - "value": "2.6.8 Summary of further toxicological studies on the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8 Summary of further toxicological studies on the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 537.59937 - }, - "width": 334.4879, - "height": -10.929352, - "page": 56 - } - ], - "sectionNumber": 236, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249702Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "71b2aab4475a42b5940dfc1a718da238", - "type": "headline", - "value": "2.6.8.2 Mechanistic data", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8.2 Mechanistic data", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 303.8194 - }, - "width": 120.404495, - "height": -10.929382, - "page": 57 - } - ], - "sectionNumber": 242, - "textBefore": null, - "textAfter": " No data", - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249842Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "62d60743caa4a691d3d45eb1c6a936ce", - "type": "headline", - "value": "2.6.8.3 Studies on endocrine disruption", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8.3 Studies on endocrine disruption", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 231.54938 - }, - "width": 189.57011, - "height": -10.929382, - "page": 57 - } - ], - "sectionNumber": 243, - "textBefore": null, - "textAfter": " The notifier", - "comments": null, - "startOffset": 0, - "endOffset": 39, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249992Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "955645b483b24349333ca9ba662d6ce4", - "type": "headline", - "value": "E., 1990)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "E., 1990)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 436.74283, - "y": 155.19177 - }, - "width": 38.273865, - "height": -10.531799, - "page": 59 - } - ], - "sectionNumber": 244, - "textBefore": null, - "textAfter": " (for details", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250202Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:50:34.516037Z", - "requestedDate": "2022-10-10T11:50:34.502293Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "76f8140f56311dac425a925d6757522a", - "type": "headline", - "value": "2.6.9 Summary of toxicological data on impurities and metabolites", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.9 Summary of toxicological data on impurities and metabolites", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 317.79895, - "height": -10.929359, - "page": 61 - } - ], - "sectionNumber": 245, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250342Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1497155eea3d9d33ef9f7356e30907b9", - "type": "headline", - "value": "2.6.9.1 Metabolites", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.9.1 Metabolites", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 725.6694 - }, - "width": 94.96834, - "height": -10.929367, - "page": 61 - } - ], - "sectionNumber": 301, - "textBefore": null, - "textAfter": " The ADME", - "comments": null, - "startOffset": 0, - "endOffset": 19, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250482Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3d92cdb47e7ca4342828320cb8b2d555", - "type": "headline", - "value": "2.6.9.2 Impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.9.2 Impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 408.2194 - }, - "width": 89.56975, - "height": -10.929352, - "page": 76 - } - ], - "sectionNumber": 303, - "textBefore": null, - "textAfter": " The issue", - "comments": null, - "startOffset": 0, - "endOffset": 18, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250632Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f1b0e3583c4a511962a5519931c33618", - "type": "headline", - "value": "C., 2012)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "C., 2012)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 275.29916, - "y": 467.4818 - }, - "width": 37.92752, - "height": -10.531799, - "page": 76 - } - ], - "sectionNumber": 302, - "textBefore": "(JMPR, 2014: Carpenter ", - "textAfter": " which was", - "comments": null, - "startOffset": 1104, - "endOffset": 1113, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250772Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:51:00.723226Z", - "requestedDate": "2022-10-10T11:51:00.708599Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4e5ad9ea9491bdefdefafd29bec09e17", - "type": "headline", - "value": "2.6.10 Summary of medical data and information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.10 Summary of medical data and information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 335.97937 - }, - "width": 232.8536, - "height": -10.929382, - "page": 76 - } - ], - "sectionNumber": 304, - "textBefore": null, - "textAfter": " The Occupational", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250912Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fff8ab1aa12a73869092b3f2fc11b42e", - "type": "headline", - "value": "C., 2012)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "C., 2012)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 308.17947, - "y": 675.2318 - }, - "width": 38.887207, - "height": -10.531799, - "page": 76 - } - ], - "sectionNumber": 302, - "textBefore": null, - "textAfter": " is referred", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251052Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:50:56.829827Z", - "requestedDate": "2022-10-10T11:50:56.811744Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "93bc22bd2a2c1e315679f88f8304a039", - "type": "headline", - "value": "2.6.11 Toxicological end point for assessment of risk following long-term dietary exposure – ADI", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.11 Toxicological end point for assessment of risk following long-term dietary exposure – ADI", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 541.6794 - }, - "width": 453.31052, - "height": -10.929352, - "page": 77 - } - ], - "sectionNumber": 317, - "textBefore": null, - "textAfter": " For Annex", - "comments": null, - "startOffset": 0, - "endOffset": 96, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251192Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8d6a0a6a40f37325a65d20516fa88337", - "type": "headline", - "value": "2.6.14 Summary of product exposure and risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.14 Summary of product exposure and risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 606.9594 - }, - "width": 270.95273, - "height": -10.929367, - "page": 80 - } - ], - "sectionNumber": 341, - "textBefore": null, - "textAfter": " Trinexapac-ethyl 250", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251632Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "30741ac54e682117c0f179d34c9b4aed", - "type": "headline", - "value": "2.7 Residues", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7 Residues", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 73.63472, - "height": -10.929359, - "page": 83 - } - ], - "sectionNumber": 342, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251782Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0199748f1e38cf080d70e01ba98348a7", - "type": "headline", - "value": "2.7.1 Summary of storage stability of residues", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.1 Summary of storage stability of residues", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 727.2272 - }, - "width": 211.61658, - "height": -10.447144, - "page": 83 - } - ], - "sectionNumber": 363, - "textBefore": null, - "textAfter": " Studies investigating", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251922Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "342defe9ab1ffffdfb0214cf6bd66c65", - "type": "headline", - "value": "2.8 times", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.8 times", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 155.58412, - "y": 149.66681 - }, - "width": 37.39981, - "height": -10.526794, - "page": 84 - } - ], - "sectionNumber": 365, - "textBefore": null, - "textAfter": " higher than", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252152Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:52:12.31332Z", - "requestedDate": "2022-10-10T11:52:12.296834Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d74b758ac0cd9b1cf610206ac5563d9c", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.8 times", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 71, - "y": 146 - }, - "width": 422, - "height": 625, - "page": 87 - } - ], - "sectionNumber": 365, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252462Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6c5da8325bbd786b2437ba6bf7c73b41", - "type": "headline", - "value": "2.7.3 Definition of the residue", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 343.77713 - }, - "width": 142.80296, - "height": -10.447113, - "page": 91 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": " In the", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252612Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d2604c5b81a3b199286afce8def15e4f", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 499 - }, - "width": 126, - "height": 91, - "page": 92 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252752Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "14e4731ffa435ae695ca3d29a23230a3", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 644 - }, - "width": 79, - "height": 67, - "page": 93 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252902Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e058dac80f7a189b0f94287c0e4f2f1e", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 221 - }, - "width": 128, - "height": 53, - "page": 97 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253042Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ed18f20a6d276c58f9f0d641fa5312de", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 71, - "y": 358 - }, - "width": 280, - "height": 109, - "page": 99 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253452Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "60b9aa700609f5570e40a6cfb396e538", - "type": "headline", - "value": "CGA179500.", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 580.0418 - }, - "width": 52.578835, - "height": -10.531799, - "page": 100 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": " As the", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253592Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:52:42.374366Z", - "requestedDate": "2022-10-10T11:52:42.356591Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "53997037e819c35d1333fee9710f0cc9", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 278 - }, - "width": 106, - "height": 54, - "page": 101 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253812Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "48c4cf2b74606e699cc839b94b3d4ebf", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 207, - "y": 555 - }, - "width": 130, - "height": 88, - "page": 101 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253962Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a8cd4454c0d2d64c5e45af555f97b3f2", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 397 - }, - "width": 79, - "height": 64, - "page": 103 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254112Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f5cd2462b75bf10ae6eab389f39de5c0", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 110 - }, - "width": 120, - "height": 49, - "page": 104 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254262Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b8471a922965507e2305bd9ade84b076", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 547 - }, - "width": 102, - "height": 69, - "page": 104 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254402Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8d397040eea0d22ef27e0e0d6d81ed81", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 395 - }, - "width": 118, - "height": 66, - "page": 105 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254552Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "954d177f01d84a607d080f34bea7e688", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 725 - }, - "width": 106, - "height": 43, - "page": 106 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254702Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5d9ea0f17ddc0b2a2cc0df743d0aa227", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 207, - "y": 336 - }, - "width": 109, - "height": 68, - "page": 106 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254852Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "075b64d779b4c1723b887092e79184aa", - "type": "headline", - "value": "2.2 for", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 for", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 433.54, - "y": 585.3168 - }, - "width": 26.943481, - "height": -10.526825, - "page": 113 - } - ], - "sectionNumber": 480, - "textBefore": null, - "textAfter": " grain and", - "comments": null, - "startOffset": 0, - "endOffset": 7, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254992Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fc84274f74d5132710778b98c2c90423", - "type": "headline", - "value": "2.2 for", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 for", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 300.65625, - "y": 358.7368 - }, - "width": 27.021515, - "height": -10.526825, - "page": 113 - } - ], - "sectionNumber": 480, - "textBefore": "conversion factor is ", - "textAfter": " cereal grain", - "comments": null, - "startOffset": 939, - "endOffset": 946, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255132Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b1c47b24d5a284fb5ba280fc89f22c93", - "type": "headline", - "value": "2.7.4 Summary of residue trials in plants and identification of critical GAP", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.4 Summary of residue trials in plants and identification of critical GAP", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 770.18713 - }, - "width": 335.4577, - "height": -10.447144, - "page": 115 - } - ], - "sectionNumber": 491, - "textBefore": null, - "textAfter": " Representative use", - "comments": null, - "startOffset": 0, - "endOffset": 76, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255272Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7d7a47d6a1141073033dd8ba388e992a", - "type": "headline", - "value": "2.7.5 Summary of feeding studies in poultry, ruminants, pigs and fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5 Summary of feeding studies in poultry, ruminants, pigs and fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 453.83716 - }, - "width": 311.65924, - "height": -10.447144, - "page": 117 - } - ], - "sectionNumber": 556, - "textBefore": null, - "textAfter": " Dietary burden", - "comments": null, - "startOffset": 0, - "endOffset": 69, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255422Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "963587a5784b46753078a1f3bbbc1e43", - "type": "headline", - "value": "2.7.6 Summary of effects of processing", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.6 Summary of effects of processing", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 607.43713 - }, - "width": 180.95636, - "height": -10.447144, - "page": 122 - } - ], - "sectionNumber": 557, - "textBefore": null, - "textAfter": " The effect", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255562Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e22c65a45f137417e13c67c600d5b5fd", - "type": "headline", - "value": "2.7.7 Summary of residues in rotational crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.7 Summary of residues in rotational crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 599.15717 - }, - "width": 211.79587, - "height": -10.447144, - "page": 124 - } - ], - "sectionNumber": 558, - "textBefore": null, - "textAfter": " The metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255702Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a92f9bc869013955eaf946a851cba49e", - "type": "headline", - "value": "2.7.8 Summary of other studies", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.8 Summary of other studies", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 711.74713 - }, - "width": 150.02396, - "height": -10.447144, - "page": 125 - } - ], - "sectionNumber": 559, - "textBefore": null, - "textAfter": " No studies", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255852Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4e970526ed5e042d9980095f64602135", - "type": "headline", - "value": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 225.66718 - }, - "width": 374.77136, - "height": -10.447144, - "page": 125 - } - ], - "sectionNumber": 654, - "textBefore": null, - "textAfter": " The definition", - "comments": null, - "startOffset": 0, - "endOffset": 84, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283258471Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "52699efb17d259ef4706847e118cf6c0", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 417, - "y": 711 - }, - "width": 141, - "height": 17, - "page": 127 - } - ], - "sectionNumber": 654, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283258631Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "077767f2138c980e4ebbec1a6ca64e48", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 417, - "y": 736 - }, - "width": 141, - "height": 35, - "page": 127 - } - ], - "sectionNumber": 654, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283258851Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fd4fc482393f8c030d7fca5f2b08b6e9", - "type": "headline", - "value": "2.7.10 Proposed MRLs and compliance with existing MRLs", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.10 Proposed MRLs and compliance with existing MRLs", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 378.69714 - }, - "width": 265.40073, - "height": -10.447144, - "page": 136 - } - ], - "sectionNumber": 668, - "textBefore": null, - "textAfter": " EU MRLs", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259001Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "145d39037b8cbba79c704242871ae7a5", - "type": "headline", - "value": "2.7.11 Proposed import tolerances and compliance with existing import tolerances", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.11 Proposed import tolerances and compliance with existing import tolerances", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 563.75714 - }, - "width": 361.4566, - "height": -10.447144, - "page": 137 - } - ], - "sectionNumber": 669, - "textBefore": null, - "textAfter": " No import", - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259131Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "37850594fc13f524e53f98e7c8ebf4bc", - "type": "headline", - "value": "2.8 Fate and behaviour in the environment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8 Fate and behaviour in the environment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 215.7858, - "height": -10.929359, - "page": 138 - } - ], - "sectionNumber": 670, - "textBefore": null, - "textAfter": " Majority experimental", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259281Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5ca1508bcd74a4c3444922ff7855d36c", - "type": "headline", - "value": "2.8.1 Summary of fate and behaviour in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.1 Summary of fate and behaviour in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 623.7872 - }, - "width": 203.7948, - "height": -10.447144, - "page": 138 - } - ], - "sectionNumber": 671, - "textBefore": null, - "textAfter": " The degradation", - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259431Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d1c162d31fbb25463983de8d2cf3ad39", - "type": "headline", - "value": "0.21 days.", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "0.21 days.", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 562.7568 - }, - "width": 40.647247, - "height": -10.526825, - "page": 140 - } - ], - "sectionNumber": 673, - "textBefore": null, - "textAfter": " Under anaerobic", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259581Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:53:42.027327Z", - "requestedDate": "2022-10-10T11:53:42.016138Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f30fa8528caf95f03bd215763d0a4c60", - "type": "headline", - "value": "0.72 days. For modelling purpose, first-order normalised DT50 values ranged from 0.045 to 0.72 days, with a", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "0.72 days. For modelling purpose, first-order normalised DT50 values ranged from 0.045 to 0.72 days, with a", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 753.2268 - }, - "width": 260.44598, - "height": -12.086815, - "page": 140 - }, - { - "topLeft": { - "x": 335.47, - "y": 753.2268 - }, - "width": 195.23611, - "height": -10.526817, - "page": 140 - } - ], - "sectionNumber": 672, - "textBefore": null, - "textAfter": " geometric mean", - "comments": null, - "startOffset": 0, - "endOffset": 107, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259731Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:53:37.920729Z", - "requestedDate": "2022-10-10T11:53:37.899067Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ff5ae2632a649103560d152929f5c6ff", - "type": "headline", - "value": "2.8.2 Summary of fate and behaviour in water and sediment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.2 Summary of fate and behaviour in water and sediment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 204.66718 - }, - "width": 272.9592, - "height": -10.447144, - "page": 141 - } - ], - "sectionNumber": 674, - "textBefore": null, - "textAfter": " Hydrolysis New", - "comments": null, - "startOffset": 0, - "endOffset": 57, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259951Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cf235ff41fcef22669f83f0d22619295", - "type": "headline", - "value": "CGA300405", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA300405", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 94.05397, - "y": 357.46213 - }, - "width": 44.556595, - "height": -10.697571, - "page": 143 - } - ], - "sectionNumber": 675, - "textBefore": null, - "textAfter": " Citric acid", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260091Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:53:53.227035Z", - "requestedDate": "2022-10-10T11:53:53.211846Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cb4b1a700be93c6474eced1d110d99db", - "type": "headline", - "value": "2.8.3 Summary of fate and behaviour in air", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.3 Summary of fate and behaviour in air", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 770.18713 - }, - "width": 201.3877, - "height": -10.447144, - "page": 145 - } - ], - "sectionNumber": 676, - "textBefore": null, - "textAfter": " Trinexapac-ethyl has", - "comments": null, - "startOffset": 0, - "endOffset": 42, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260301Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "27f79d15c9b90f5216b0d9a43dd0f7ed", - "type": "headline", - "value": "2.8.5 Definition of the residues in the environment requiring further assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.5 Definition of the residues in the environment requiring further assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 573.71716 - }, - "width": 355.8275, - "height": -10.447144, - "page": 145 - } - ], - "sectionNumber": 695, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260581Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c65a0398a13aece118f679d64e457410", - "type": "headline", - "value": "2.8.6 Summary of exposure calculations and product assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6 Summary of exposure calculations and product assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 308.3893, - "height": -10.929359, - "page": 146 - } - ], - "sectionNumber": 696, - "textBefore": null, - "textAfter": " PECsoil Acceptable", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260731Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7d976780efd1661d191514cadffc7003", - "type": "headline", - "value": "1.2 day", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "1.2 day", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 275.05292, - "y": 572.2368 - }, - "width": 30.477661, - "height": -10.526825, - "page": 146 - } - ], - "sectionNumber": 697, - "textBefore": null, - "textAfter": " was selected", - "comments": null, - "startOffset": 0, - "endOffset": 7, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260871Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:54:18.318037Z", - "requestedDate": "2022-10-10T11:54:18.297731Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e0e0c3bcf6d1d0055fc935a6d464df6f", - "type": "headline", - "value": "2.9 Effects on non-target species", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9 Effects on non-target species", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 166.28503, - "height": -10.929359, - "page": 148 - } - ], - "sectionNumber": 698, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 33, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261011Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "55c549edfa85c8f00ba288b58634169a", - "type": "headline", - "value": "2.9.1 Summary of effects on birds and other terrestrial vertebrates", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1 Summary of effects on birds and other terrestrial vertebrates", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 726.7494 - }, - "width": 319.05402, - "height": -10.929367, - "page": 148 - } - ], - "sectionNumber": 699, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261151Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7be7a4cc5006754201282ffa7aa4bf92", - "type": "headline", - "value": "2.9.1.2 Potential for endocrine disruption properties in birds and mammals", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1.2 Potential for endocrine disruption properties in birds and mammals", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 249.78717 - }, - "width": 325.59305, - "height": -10.447144, - "page": 148 - } - ], - "sectionNumber": 712, - "textBefore": null, - "textAfter": " A review", - "comments": null, - "startOffset": 0, - "endOffset": 74, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261671Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a39b84ba1bdc3791794e8a8db70be172", - "type": "headline", - "value": "2.9.1.1. Birds", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1.1. Birds", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 695.78937 - }, - "width": 61.525925, - "height": -10.929367, - "page": 148 - } - ], - "sectionNumber": 711, - "textBefore": null, - "textAfter": " Avian acute", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261811Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "903033c5c2328e43ee6252e24a273731", - "type": "headline", - "value": "2.9.2 Summary of effects on aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2 Summary of effects on aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 418.6594 - }, - "width": 230.04605, - "height": -10.929352, - "page": 149 - } - ], - "sectionNumber": 737, - "textBefore": null, - "textAfter": " The toxicity", - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261961Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bc6dba7a3368ffe0f269e153b12a5c0d", - "type": "headline", - "value": "2.9.2.2 Assessment of toxicity (T)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2.2 Assessment of toxicity (T)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 657.7494 - }, - "width": 156.68529, - "height": -10.929367, - "page": 151 - } - ], - "sectionNumber": 739, - "textBefore": null, - "textAfter": " An active", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262111Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4b55a0c82c183bb21dcafc5640e49a44", - "type": "headline", - "value": "2.9.2.3 Potential for endocrine disruption properties in aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2.3 Potential for endocrine disruption properties in aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 548.7594 - }, - "width": 347.40738, - "height": -10.929352, - "page": 151 - } - ], - "sectionNumber": 740, - "textBefore": null, - "textAfter": " Population relevant", - "comments": null, - "startOffset": 0, - "endOffset": 74, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262241Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b98b46e99d49bffd3d24cf1ececbccbe", - "type": "headline", - "value": "2.9.3 Summary of effects on arthropods", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.3 Summary of effects on arthropods", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 327.33936 - }, - "width": 196.71634, - "height": -10.929382, - "page": 151 - } - ], - "sectionNumber": 741, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262471Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dc519519416a59f30ea5b47fdc2678a2", - "type": "headline", - "value": "2.9.2.1 Assessment of bioaccumulation (B)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2.1 Assessment of bioaccumulation (B)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 199.99527, - "height": -10.929359, - "page": 151 - } - ], - "sectionNumber": 738, - "textBefore": null, - "textAfter": " Since trinexapac-ethyl", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262611Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3d02554f2d588a4f5f0cf12542788474", - "type": "headline", - "value": "2.9.3.1 Summary of effects on bees", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.3.1 Summary of effects on bees", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 296.2594 - }, - "width": 168.26288, - "height": -10.929382, - "page": 151 - } - ], - "sectionNumber": 749, - "textBefore": null, - "textAfter": " The toxicity", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262751Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a9ea9dcf7594430e65c5f930f830f188", - "type": "headline", - "value": "2.9.3.2 Summary of effects on arthropods other than bees", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.3.2 Summary of effects on arthropods other than bees", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 469.3194 - }, - "width": 271.55655, - "height": -10.929352, - "page": 152 - } - ], - "sectionNumber": 761, - "textBefore": null, - "textAfter": " The toxicity", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262971Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e6367da030041101cfc5c895f722b451", - "type": "headline", - "value": "2.9.4.1 Summary of effects on earthworms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.4.1 Summary of effects on earthworms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 593.39935 - }, - "width": 204.95984, - "height": -10.929352, - "page": 153 - } - ], - "sectionNumber": 776, - "textBefore": null, - "textAfter": " Data on", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263181Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d2369ec197ecbb94fd3b9007b91eff66", - "type": "headline", - "value": "2.9.4 Summary of effects on non-target soil meso- and macrofauna", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.4 Summary of effects on non-target soil meso- and macrofauna", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 636.3894 - }, - "width": 318.742, - "height": -10.929367, - "page": 153 - } - ], - "sectionNumber": 762, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263321Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c726b247c7817e863b0763e981f23812", - "type": "headline", - "value": "2.9.4.2 Summary of effects on other soil macro-organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.4.2 Summary of effects on other soil macro-organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 591.9594 - }, - "width": 276.59702, - "height": -10.929352, - "page": 154 - } - ], - "sectionNumber": 787, - "textBefore": null, - "textAfter": " New studies", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263461Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0503e5a0d3f95f9662f99cdf3978ab76", - "type": "headline", - "value": "2.9.6 Summary of effects on terrestrial non-target higher plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.6 Summary of effects on terrestrial non-target higher plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 183.90936 - }, - "width": 304.88828, - "height": -10.929382, - "page": 155 - } - ], - "sectionNumber": 809, - "textBefore": null, - "textAfter": " In the", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263601Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "25e0dba3010785ad3f8a435fa1e69b47", - "type": "headline", - "value": "2.9.5 Summary of effects on soil nitrogen transformation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.5 Summary of effects on soil nitrogen transformation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 735.3894 - }, - "width": 276.7563, - "height": -10.929359, - "page": 155 - } - ], - "sectionNumber": 798, - "textBefore": null, - "textAfter": " In the", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263751Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9489bb25edd80ee82115f7680ff06cfb", - "type": "headline", - "value": "2.9.8 Summary of effects on biological methods for sewage treatment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.8 Summary of effects on biological methods for sewage treatment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 300.33936 - }, - "width": 329.66418, - "height": -10.929382, - "page": 156 - } - ], - "sectionNumber": 815, - "textBefore": null, - "textAfter": " In the", - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263901Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e7beb9703a61010280b080bfa056b356", - "type": "headline", - "value": "2.9.7 Summary of effects on other terrestrial organisms (flora and fauna)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.7 Summary of effects on other terrestrial organisms (flora and fauna)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 407.01938 - }, - "width": 349.3698, - "height": -10.929352, - "page": 156 - } - ], - "sectionNumber": 810, - "textBefore": null, - "textAfter": " No data", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264051Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b7817cf0477d78421d8bb6a97af8840f", - "type": "headline", - "value": "2.9.9 Summary of product exposure and risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9 Summary of product exposure and risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 697.7094 - }, - "width": 270.95273, - "height": -10.929367, - "page": 157 - } - ], - "sectionNumber": 824, - "textBefore": null, - "textAfter": " The formulation", - "comments": null, - "startOffset": 0, - "endOffset": 53, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264201Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a9927f574c2d6dc04a36883c8185764c", - "type": "headline", - "value": "2.9.9.2 Summary of product exposure and risk assessment for aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.2 Summary of product exposure and risk assessment for aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 386.85938 - }, - "width": 380.4969, - "height": -10.929352, - "page": 162 - } - ], - "sectionNumber": 947, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 77, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264501Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0f0c2d4bb45c51efaf86d1cb88568226", - "type": "headline", - "value": "2.9.9.3 Summary of product exposure and risk assessment for arthropods", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.3 Summary of product exposure and risk assessment for arthropods", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 667.7094 - }, - "width": 347.0371, - "height": -10.929367, - "page": 167 - } - ], - "sectionNumber": 948, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264641Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "078b4b6916bdb3b8e71b2e079ac3b20a", - "type": "headline", - "value": "2.9.9.3.1 Summary of product exposure and risk assessment for bees", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.3.1 Summary of product exposure and risk assessment for bees", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 624.7494 - }, - "width": 321.36572, - "height": -10.929367, - "page": 167 - } - ], - "sectionNumber": 975, - "textBefore": null, - "textAfter": " Acute risk", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265101Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bee5aa26d3f74b22ff507959093984aa", - "type": "headline", - "value": "2.9.9.3.2 Summary of product exposure and risk assessment for arthropods other than bees", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.3.2 Summary of product exposure and risk assessment for arthropods other than bees", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 711.2694 - }, - "width": 428.67288, - "height": -10.929367, - "page": 171 - } - ], - "sectionNumber": 1004, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265241Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aa2f84e5bc20b7ac5462372497053499", - "type": "headline", - "value": "2.9.9.5 Summary of product exposure and risk assessment for soil nitrogen transformation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.5 Summary of product exposure and risk assessment for soil nitrogen transformation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 455.2794 - }, - "width": 425.89914, - "height": -10.929352, - "page": 174 - } - ], - "sectionNumber": 1030, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265601Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b9e1ac39dc04c3682dabdeac3ebba499", - "type": "headline", - "value": "2.9.9.6 Summary of product exposure and risk assessment for terrestrial non-target higher plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.6 Summary of product exposure and risk assessment for terrestrial non-target higher plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 295.41937 - }, - "width": 458.03836, - "height": -10.929382, - "page": 175 - } - ], - "sectionNumber": 1031, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 96, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265751Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c39e9603615e75177cfe8cb447e854cd", - "type": "headline", - "value": "2.10 Classification and labelling", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.10 Classification and labelling", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 552.83936 - }, - "width": 159.16164, - "height": -10.929352, - "page": 176 - } - ], - "sectionNumber": 1087, - "textBefore": null, - "textAfter": " Table 2.10-1:", - "comments": null, - "startOffset": 0, - "endOffset": 33, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266031Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6a98158b459ad05b7e74e0909919e2e0", - "type": "headline", - "value": "2.11.3.2 STEP 3, Stage 2: screening for genotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.2 STEP 3, Stage 2: screening for genotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 411.7768 - }, - "width": 211.72574, - "height": -10.526825, - "page": 180 - } - ], - "sectionNumber": 1090, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 52, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266321Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "48bcbba8ac0ba463a9e8174ede3cc9a2", - "type": "headline", - "value": "2.11 Relevance of metabolites in groundwater", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11 Relevance of metabolites in groundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 684.9894 - }, - "width": 224.0166, - "height": -10.929367, - "page": 180 - } - ], - "sectionNumber": 1088, - "textBefore": null, - "textAfter": " 2.11.1. STEP", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266461Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "954d8558441d59aa80e40e9174d189b2", - "type": "headline", - "value": "2.11.3.3 STEP 3, Stage 3: screening for toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.3 STEP 3, Stage 3: screening for toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 385.4968 - }, - "width": 192.24847, - "height": -10.526825, - "page": 180 - } - ], - "sectionNumber": 1091, - "textBefore": null, - "textAfter": " 2.11.4. STEP", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266601Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "43c9291ca6dc57a00b22c4a1f99883f6", - "type": "headline", - "value": "2.12 Consideration of isomeric composition in the risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12 Consideration of isomeric composition in the risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 219.66937 - }, - "width": 316.96738, - "height": -10.929382, - "page": 180 - } - ], - "sectionNumber": 1092, - "textBefore": null, - "textAfter": " Not relevant.", - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266741Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0ac81d4f6cf26a796feaa3188753bfc9", - "type": "headline", - "value": "2.11.3.1 STEP 3, Stage 1: screening for biological activity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.1 STEP 3, Stage 1: screening for biological activity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 438.0568 - }, - "width": 234.28693, - "height": -10.526825, - "page": 180 - } - ], - "sectionNumber": 1089, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 59, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266881Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "71dac49d92b472df21ade3403c7e2df6", - "type": "headline", - "value": "2.12.4 Operator, Worker, Bystander and Resident exposure", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.4 Operator, Worker, Bystander and Resident exposure", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 646.46716 - }, - "width": 266.6357, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1096, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267101Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9ef15de83c70ce84f66dc14296fe20c1", - "type": "headline", - "value": "2.12.2 Methods of analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.2 Methods of analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 728.90717 - }, - "width": 124.50366, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1094, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 26, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267231Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d096ee670fb324ba64feb5aa933a7223", - "type": "headline", - "value": "2.13 Residue definition", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13 Residue definition", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 480.95938 - }, - "width": 117.44147, - "height": -10.929352, - "page": 181 - } - ], - "sectionNumber": 1100, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267381Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ca8aa2fbd0c43f119ade268ab7cac58d", - "type": "headline", - "value": "2.13.1 Definition of residues for exposure/risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13.1 Definition of residues for exposure/risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 438.45715 - }, - "width": 255.70883, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1101, - "textBefore": null, - "textAfter": " Food of", - "comments": null, - "startOffset": 0, - "endOffset": 58, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267521Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "806d34ca303fd01d602b700e61056dd7", - "type": "headline", - "value": "2.12.3 Mammalian toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.3 Mammalian toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 687.74713 - }, - "width": 126.10004, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1095, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267671Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e1c4792da6837ef16911833f134147c0", - "type": "headline", - "value": "2.12.6 Environmental fate", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.6 Environmental fate", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 563.87714 - }, - "width": 123.01245, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1098, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267821Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "136ed95c32e9e97ba44ce65eea6b9765", - "type": "headline", - "value": "2.12.5 Residues and Consumer risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.5 Residues and Consumer risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 605.15717 - }, - "width": 211.39755, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1097, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267961Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fff513d74be9ed51a21ab439ca3a09a1", - "type": "headline", - "value": "2.12.7 Ecotoxciology", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.7 Ecotoxciology", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 522.71716 - }, - "width": 99.35741, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1099, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 20, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268171Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "842f1188b01f93a89c75a5d2bc75313d", - "type": "headline", - "value": "2.12.1 Identity and physical chemical properties", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.1 Identity and physical chemical properties", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 770.18713 - }, - "width": 216.48709, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1093, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268311Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3ebc21c88827078833625ef99b335718", - "type": "headline", - "value": "2.14 Effect of water treatment processes on the nature of residues present in surface water", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.14 Effect of water treatment processes on the nature of residues present in surface water", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 330.21936 - }, - "width": 432.2804, - "height": -10.929382, - "page": 182 - } - ], - "sectionNumber": 1103, - "textBefore": null, - "textAfter": " Level 3", - "comments": null, - "startOffset": 0, - "endOffset": 91, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268451Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b40a3c1c8a6611462cc733b613c4e918", - "type": "headline", - "value": "2.13.2 Definition of residues for monitoring", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13.2 Definition of residues for monitoring", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 677.18713 - }, - "width": 196.38779, - "height": -10.447144, - "page": 182 - } - ], - "sectionNumber": 1102, - "textBefore": null, - "textAfter": " Food of", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268591Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "da387294f60cb387e54040c5dc40e35a", - "type": "headline", - "value": "3.1 Background to the proposed decision", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1 Background to the proposed decision", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 416.87714 - }, - "width": 190.22484, - "height": -10.447144, - "page": 183 - } - ], - "sectionNumber": 1170, - "textBefore": null, - "textAfter": " 3.1.1 Proposal", - "comments": null, - "startOffset": 0, - "endOffset": 39, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268721Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7a886a0fd034991c11c9b561517bdc7a", - "type": "headline", - "value": "3.1.2 Proposal – Candidate for substitution", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.2 Proposal – Candidate for substitution", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 523.58716 - }, - "width": 192.52785, - "height": -10.447144, - "page": 190 - } - ], - "sectionNumber": 1174, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268941Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "efb86003314a44bfef623ac3d42d40b2", - "type": "headline", - "value": "3.1.3 Proposal – Low risk active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.3 Proposal – Low risk active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 523.58716 - }, - "width": 189.39046, - "height": -10.447144, - "page": 191 - } - ], - "sectionNumber": 1178, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 42, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269101Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6a70847a6291059e561c459276ebe624", - "type": "headline", - "value": "3.1.4 List of studies to be generated, still ongoing or available but not evaluated", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.4 List of studies to be generated, still ongoing or available but not evaluated", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 523.58716 - }, - "width": 345.96942, - "height": -10.447144, - "page": 192 - } - ], - "sectionNumber": 1229, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 83, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269241Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0c70b3980e624366f18c8a49f004bf00", - "type": "headline", - "value": "3.1.6 Critical areas of concern", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.6 Critical areas of concern", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 234.30713 - }, - "width": 137.1937, - "height": -10.447144, - "page": 196 - } - ], - "sectionNumber": 1249, - "textBefore": null, - "textAfter": " 1) An", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269481Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5200c2e0708bce8296ecf2969d620702", - "type": "headline", - "value": "3.1.5 Issues that could not be finalised", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.5 Issues that could not be finalised", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 755.18713 - }, - "width": 170.43198, - "height": -10.447144, - "page": 196 - } - ], - "sectionNumber": 1240, - "textBefore": null, - "textAfter": " 1) An", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269641Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "75d788450d09512093733984dde231de", - "type": "headline", - "value": "3.1.7 Overview table of the concerns identified for each representative use considered", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.7 Overview table of the concerns identified for each representative use considered", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 386.73715 - }, - "width": 372.2236, - "height": -10.447144, - "page": 197 - } - ], - "sectionNumber": 1274, - "textBefore": null, - "textAfter": " (If a", - "comments": null, - "startOffset": 0, - "endOffset": 86, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269881Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bcaaebe8802bdd9a02018e6e19ee605a", - "type": "headline", - "value": "3.1.8 Area(s) where expert consultation is considered necessary", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.8 Area(s) where expert consultation is considered necessary", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 549.2371 - }, - "width": 277.9086, - "height": -10.447144, - "page": 198 - } - ], - "sectionNumber": 1280, - "textBefore": null, - "textAfter": " It is", - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270031Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "943f49091dec2a28ada263a29e01e2d2", - "type": "headline", - "value": "3.1.9 Critical issues on which the Co-RMS did not agree with the assessment by the RMS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.9 Critical issues on which the Co-RMS did not agree with the assessment by the RMS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 241.86713 - }, - "width": 387.43008, - "height": -10.447144, - "page": 198 - } - ], - "sectionNumber": 1287, - "textBefore": null, - "textAfter": " Points on", - "comments": null, - "startOffset": 0, - "endOffset": 86, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270271Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ca9466806615981d4c1c87b6ab5ce5b3", - "type": "headline", - "value": "3.2 Proposed decision", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.2 Proposed decision", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 770.18713 - }, - "width": 108.80769, - "height": -10.447144, - "page": 199 - } - ], - "sectionNumber": 1288, - "textBefore": null, - "textAfter": " It is", - "comments": null, - "startOffset": 0, - "endOffset": 21, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270411Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "423496c3bd0f51d45003d94c4928e26d", - "type": "headline", - "value": "3.3.1 Particular conditions proposed to be taken into account to manage the risks identified", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3.1 Particular conditions proposed to be taken into account to manage the risks identified", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 318.45715 - }, - "width": 397.64487, - "height": -10.447144, - "page": 199 - } - ], - "sectionNumber": 1296, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 92, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270701Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2296c8ac59190e804bd82d7fdba4e891", - "type": "headline", - "value": "APPENDICES", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDICES", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 70.31377, - "height": -10.929359, - "page": 200 - } - ], - "sectionNumber": 1297, - "textBefore": null, - "textAfter": " Appendix 1", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270841Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a6f745eb3bca178245145848013d7e2c", - "type": "headline", - "value": "1 Statement of subject matter and purpose for which this report has been prepared and background information on the application", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1 Statement of subject matter and purpose for which this report has been prepared and", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 706.87537 - }, - "width": 5.52, - "height": 9.85872, - "page": 8 - }, - { - "topLeft": { - "x": 96.984, - "y": 706.87537 - }, - "width": 427.23697, - "height": 9.85872, - "page": 8 - }, - { - "topLeft": { - "x": 97.104, - "y": 687.91534 - }, - "width": 203.01456, - "height": 9.85872, - "page": 8 - } - ], - "sectionNumber": 8, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 127, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236042Z" - }, - { - "analysisNumber": 3, - "type": "CHANGED", - "dateTime": "2022-10-10T11:44:45.955046089Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:44:44.37Z", - "requestedDate": "2022-10-10T11:44:44.370012Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "1 Statement of subject matter and purpose for which this report has been prepared and background information on the application" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b22e85eab47259518edbf245c83c9bcf", - "type": "headline", - "value": "1.4.3 Trade name or proposed trade name and producer's development code number of the plant protection product", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.3 Trade name or proposed trade name and producer's development code number of the", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 276.47537 - }, - "width": 453.30032, - "height": 9.85872, - "page": 13 - }, - { - "topLeft": { - "x": 102.98, - "y": 257.51535 - }, - "width": 115.5888, - "height": 9.85872, - "page": 13 - } - ], - "sectionNumber": 44, - "textBefore": null, - "textAfter": " Producer’s development", - "comments": null, - "startOffset": 0, - "endOffset": 110, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239112Z" - }, - { - "analysisNumber": 4, - "type": "CHANGED", - "dateTime": "2022-10-10T11:45:32.635877455Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:45:31.655Z", - "requestedDate": "2022-10-10T11:45:31.655832Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "1.4.3 Trade name or proposed trade name and producer's development code number of the plant protection product" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "091e3ae3da3e6e028f8faaf3b2a1781d", - "type": "headline", - "value": "1.4.4 Detailed quantitative and qualitative information on the composition of the plant protection product", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4 Detailed quantitative and qualitative information on the composition of the plant", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 758.47534 - }, - "width": 453.44345, - "height": 9.85872, - "page": 14 - }, - { - "topLeft": { - "x": 102.98, - "y": 739.5154 - }, - "width": 88.36416, - "height": 9.85872, - "page": 14 - } - ], - "sectionNumber": 45, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 106, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239882Z" - }, - { - "analysisNumber": 5, - "type": "CHANGED", - "dateTime": "2022-10-10T11:45:55.739619022Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:45:54.71Z", - "requestedDate": "2022-10-10T11:45:54.710595Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "1.4.4 Detailed quantitative and qualitative information on the composition of the plant protection product" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b420306d4d52021d2a67acb7a99e3738", - "type": "headline", - "value": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses beyond the representative uses", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses beyond the", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 670.15533 - }, - "width": 451.1144, - "height": 9.85872, - "page": 17 - }, - { - "topLeft": { - "x": 104.06, - "y": 651.1954 - }, - "width": 89.55648, - "height": 9.85872, - "page": 17 - } - ], - "sectionNumber": 69, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 110, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241342Z" - }, - { - "analysisNumber": 6, - "type": "CHANGED", - "dateTime": "2022-10-10T11:46:14.231296042Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:46:13.24Z", - "requestedDate": "2022-10-10T11:46:13.240474Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses beyond the representative uses" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e22537b634eaca81cc25fbf8dbf67c36", - "type": "headline", - "value": "2.6.8.1 28-Day immunotoxicity feeding study in mice and a review concerning immunotoxicity potential", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8.1 28-Day immunotoxicity feeding study in mice and a review concerning immunotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 483.40536 - }, - "width": 451.43872, - "height": 9.85872, - "page": 56 - }, - { - "topLeft": { - "x": 111.98, - "y": 464.44537 - }, - "width": 41.5656, - "height": 9.85872, - "page": 56 - } - ], - "sectionNumber": 241, - "textBefore": null, - "textAfter": " An immunotoxicity", - "comments": null, - "startOffset": 0, - "endOffset": 100, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249562Z" - }, - { - "analysisNumber": 8, - "type": "CHANGED", - "dateTime": "2022-10-10T11:50:21.750748669Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:50:20.652Z", - "requestedDate": "2022-10-10T11:50:20.652812Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.6.8.1 28-Day immunotoxicity feeding study in mice and a review concerning immunotoxicity potential" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "66a596fccc7955d32a3c3a772db9c651", - "type": "headline", - "value": "2.6.13 Toxicological end point for assessment of occupational, bystander and residents risks – AOEL", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.13 Toxicological end point for assessment of occupational, bystander and residents risks –", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 570.28534 - }, - "width": 460.38226, - "height": 9.85872, - "page": 79 - }, - { - "topLeft": { - "x": 102.98, - "y": 551.2054 - }, - "width": 31.23216, - "height": 9.85872, - "page": 79 - } - ], - "sectionNumber": 332, - "textBefore": null, - "textAfter": " For Annex", - "comments": null, - "startOffset": 0, - "endOffset": 99, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251482Z" - }, - { - "analysisNumber": 9, - "type": "CHANGED", - "dateTime": "2022-10-10T11:51:42.085772767Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:51:40.981Z", - "requestedDate": "2022-10-10T11:51:40.981956Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.6.13 Toxicological end point for assessment of occupational, bystander and residents risks – AOEL" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ea06a4aa1289f2851f52e5c90cb70e01", - "type": "headline", - "value": "2.7.2 Summary of metabolism, distribution and expression of residues in plants, poultry, lactating ruminants, pigs and fish", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants, poultry, lactating", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 367.57864 - }, - "width": 20.05944, - "height": 8.89428, - "page": 84 - }, - { - "topLeft": { - "x": 110.9, - "y": 367.57864 - }, - "width": 419.72437, - "height": 8.89428, - "page": 84 - }, - { - "topLeft": { - "x": 110.9, - "y": 350.41864 - }, - "width": 103.11588, - "height": 8.89428, - "page": 84 - } - ], - "sectionNumber": 364, - "textBefore": null, - "textAfter": " Metabolism in", - "comments": null, - "startOffset": 0, - "endOffset": 123, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252302Z" - }, - { - "analysisNumber": 10, - "type": "CHANGED", - "dateTime": "2022-10-10T11:52:06.434979313Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:52:05.401Z", - "requestedDate": "2022-10-10T11:52:05.401639Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.7.2 Summary of metabolism, distribution and expression of residues in plants, poultry, lactating ruminants, pigs and fish" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8bf26f9e815d9acbe8f648e2b309f033", - "type": "headline", - "value": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active substance, metabolites, degradation and reaction products", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active substance, metabolites,", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 626.94867 - }, - "width": 20.05944, - "height": 8.89428, - "page": 145 - }, - { - "topLeft": { - "x": 110.9, - "y": 626.94867 - }, - "width": 419.98364, - "height": 8.89428, - "page": 145 - }, - { - "topLeft": { - "x": 110.9, - "y": 609.66864 - }, - "width": 147.84624, - "height": 8.89428, - "page": 145 - } - ], - "sectionNumber": 677, - "textBefore": null, - "textAfter": " No monitoring", - "comments": null, - "startOffset": 0, - "endOffset": 134, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260441Z" - }, - { - "analysisNumber": 11, - "type": "CHANGED", - "dateTime": "2022-10-10T11:54:09.753884333Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:54:08.69Z", - "requestedDate": "2022-10-10T11:54:08.690012Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active substance, metabolites, degradation and reaction products" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "da4bff661ea26dc30ec4e5a63bb9defe", - "type": "headline", - "value": "2.9.9.1 Summary of product exposure and risk assessment for birds and other terrestrial vertebrates", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.1 Summary of product exposure and risk assessment for birds and other terrestrial", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 350.90536 - }, - "width": 459.8547, - "height": 9.85872, - "page": 157 - }, - { - "topLeft": { - "x": 102.98, - "y": 331.94537 - }, - "width": 53.2128, - "height": 9.85872, - "page": 157 - } - ], - "sectionNumber": 865, - "textBefore": null, - "textAfter": " Birds Risk", - "comments": null, - "startOffset": 0, - "endOffset": 99, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264351Z" - }, - { - "analysisNumber": 12, - "type": "CHANGED", - "dateTime": "2022-10-10T11:55:18.042546739Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:55:16.902Z", - "requestedDate": "2022-10-10T11:55:16.902037Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.9.9.1 Summary of product exposure and risk assessment for birds and other terrestrial vertebrates" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "30f45cdc3591253f2ca9fcc482002493", - "type": "headline", - "value": "2.9.9.4 Summary of product exposure and risk assessment for non-target soil meso- and macrofauna", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.4 Summary of product exposure and risk assessment for non-target soil meso- and", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 682.7554 - }, - "width": 460.30896, - "height": 9.85872, - "page": 173 - }, - { - "topLeft": { - "x": 102.98, - "y": 663.79535 - }, - "width": 56.97744, - "height": 9.85872, - "page": 173 - } - ], - "sectionNumber": 1020, - "textBefore": null, - "textAfter": " Earthworms The", - "comments": null, - "startOffset": 0, - "endOffset": 96, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265391Z" - }, - { - "analysisNumber": 13, - "type": "CHANGED", - "dateTime": "2022-10-10T11:55:50.961671035Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:55:50.009Z", - "requestedDate": "2022-10-10T11:55:50.009172Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.9.9.4 Summary of product exposure and risk assessment for non-target soil meso- and macrofauna" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "55920aa120430516ffc4fca499d2523d", - "type": "headline", - "value": "2.9.9.7 Summary of product exposure and risk assessment for other terrestrial organisms (flora and fauna)", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.7 Summary of product exposure and risk assessment for other terrestrial organisms (flora", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 758.47534 - }, - "width": 459.86526, - "height": 9.85872, - "page": 176 - }, - { - "topLeft": { - "x": 102.98, - "y": 739.5154 - }, - "width": 51.07104, - "height": 9.85872, - "page": 176 - } - ], - "sectionNumber": 1032, - "textBefore": null, - "textAfter": " No data", - "comments": null, - "startOffset": 0, - "endOffset": 105, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266181Z" - }, - { - "analysisNumber": 14, - "type": "CHANGED", - "dateTime": "2022-10-10T11:56:23.821744708Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:56:22.664Z", - "requestedDate": "2022-10-10T11:56:22.664265Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.9.9.7 Summary of product exposure and risk assessment for other terrestrial organisms (flora and fauna)" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "54c4b871f93316993721dfe963d7b0e3", - "type": "headline", - "value": "2.9.9.8 Summary of product exposure and risk assessment for biological methods for sewage treatment", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.8 Summary of product exposure and risk assessment for biological methods for sewage", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 667.2753 - }, - "width": 459.932, - "height": 9.85872, - "page": 176 - }, - { - "topLeft": { - "x": 102.98, - "y": 648.31537 - }, - "width": 46.4784, - "height": 9.85872, - "page": 176 - } - ], - "sectionNumber": 1033, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 99, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265881Z" - }, - { - "analysisNumber": 15, - "type": "CHANGED", - "dateTime": "2022-10-10T11:56:43.650278321Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:56:42.58Z", - "requestedDate": "2022-10-10T11:56:42.580349Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.9.9.8 Summary of product exposure and risk assessment for biological methods for sewage treatment" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "25ccf150d659f969e7cc9858626b03ee", - "type": "headline", - "value": "2.6.12 Toxicological end point for assessment of risk following acute dietary exposure - ARfD (acute reference dose)", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.12 Toxicological end point for assessment of risk following acute dietary exposure - ARfD", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 455.80536 - }, - "width": 460.33728, - "height": 9.85872, - "page": 78 - }, - { - "topLeft": { - "x": 102.98, - "y": 436.82535 - }, - "width": 102.62784, - "height": 9.85872, - "page": 78 - } - ], - "sectionNumber": 318, - "textBefore": null, - "textAfter": " For Annex", - "comments": null, - "startOffset": 0, - "endOffset": 116, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251332Z" - }, - { - "analysisNumber": 16, - "type": "CHANGED", - "dateTime": "2022-10-10T12:00:49.806894383Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T12:00:48.753Z", - "requestedDate": "2022-10-10T12:00:48.753418Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.6.12 Toxicological end point for assessment of risk following acute dietary exposure - ARfD (acute reference dose)" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "79e7a6972364b84ae7431da9db159043", - "type": "headline", - "value": "3.3 Rational for the conditions and restrictions to be associated with any approval or authorisation(s), as appropriate", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3 Rational for the conditions and restrictions to be associated with any approval or authorisation(s),", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 366.37863 - }, - "width": 12.51972, - "height": 8.89428, - "page": 199 - }, - { - "topLeft": { - "x": 102.98, - "y": 366.37863 - }, - "width": 427.533, - "height": 8.89428, - "page": 199 - }, - { - "topLeft": { - "x": 102.98, - "y": 349.21863 - }, - "width": 62.43924, - "height": 8.89428, - "page": 199 - } - ], - "sectionNumber": 1289, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 119, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270551Z" - }, - { - "analysisNumber": 17, - "type": "CHANGED", - "dateTime": "2022-10-10T12:02:55.169392095Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T12:02:54.047Z", - "requestedDate": "2022-10-10T12:02:54.04704Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "3.3 Rational for the conditions and restrictions to be associated with any approval or authorisation(s), as appropriate" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "11cd9fccc57f877dc59afceb2cce7d9e", - "type": "manual", - "value": "Appendix 2 Reference list", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDICES", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 142.94, - "y": 291.50537 - }, - "width": 63.85536, - "height": 9.85872, - "page": 201 - }, - { - "topLeft": { - "x": 70.944, - "y": 291.50537 - }, - "width": 54.11808, - "height": 9.85872, - "page": 201 - } - ], - "sectionNumber": 1297, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:59:02.34Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:59:02.34Z", - "requestedDate": "2022-10-10T11:59:02.34Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "70b3756da45b028b88cf08a89edb89a4", - "type": "manual", - "value": "2.11.4. STEP 4: Exposure assessment – threshold of concern approach", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.3 STEP 3, Stage 3: screening for toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 333.37863 - }, - "width": 298.84113, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": 1091, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:29.379Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:29.38Z", - "requestedDate": "2022-10-10T11:57:29.379Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0742909e25ae0e770aa5bb4107f58a7b", - "type": "manual", - "value": "2.9.1.2. Mammals", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1.1. Birds", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 499.23865 - }, - "width": 75.05856, - "height": 8.89428, - "page": 148 - } - ], - "sectionNumber": 711, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:54:43.663Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:54:43.663Z", - "requestedDate": "2022-10-10T11:54:43.663Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "517c4a1b70cd63b41616a6173082335f", - "type": "manual", - "value": "2.11.2. STEP 2: Quantification of potential groundwater contamination", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11 Relevance of metabolites in groundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 561.3986 - }, - "width": 303.47125, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": 1088, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:15.453Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:15.453Z", - "requestedDate": "2022-10-10T11:57:15.453Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4af04a9e03b1c1257a39ef3a0ba9958a", - "type": "manual", - "value": "3.1.1 Proposal on acceptability against the approval criteria – Article 4 and Annex II of Regulation (EC) No 1107/2009", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 364.79865 - }, - "width": 512.7403, - "height": 8.89428, - "page": 183 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:58:15.62Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:58:15.62Z", - "requestedDate": "2022-10-10T11:58:15.62Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3f0d0f57a0509c8df1a26b038f996aea", - "type": "manual", - "value": "Table of contents", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 759.66864 - }, - "width": 73.26576, - "height": 8.89428, - "page": 5 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:59:34.487Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:59:34.487Z", - "requestedDate": "2022-10-10T11:59:34.487Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "af5e90b324c13c890e6cceb7cad62fd8", - "type": "manual", - "value": "Level 2", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 260.69, - "y": 742.476 - }, - "width": 73.992, - "height": 21.432, - "page": 18 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:46:30.859Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:46:30.859Z", - "requestedDate": "2022-10-10T11:46:30.859Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "103b89d98783d3bd5671cc66d6cb3b96", - "type": "manual", - "value": "2.11.5. STEP 5: Refined risk assessment", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.3 STEP 3, Stage 3: screening for toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 292.21863 - }, - "width": 169.83992, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": 1091, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:35.968Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:35.968Z", - "requestedDate": "2022-10-10T11:57:35.968Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5c9f40261b4536fea1b03302894601c2", - "type": "manual", - "value": "Version History", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 263.69, - "y": 742.1486 - }, - "width": 67.90728, - "height": 8.89428, - "page": 4 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:44:21.243Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:44:21.243Z", - "requestedDate": "2022-10-10T11:44:21.243Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bd4b6f925db3260a2b96fc8916cc2233", - "type": "manual", - "value": "2.11.6. Overall conclusion", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 250.90865 - }, - "width": 109.56996, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:42.328Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:42.328Z", - "requestedDate": "2022-10-10T11:57:42.328Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a7c1c8066bb1b67132a438d5c39ec420", - "type": "manual", - "value": "Appendix 1 Guidance documents used in this assessment", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDICES", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 142.94, - "y": 727.5154 - }, - "width": 208.8216, - "height": 9.85872, - "page": 200 - }, - { - "topLeft": { - "x": 70.944, - "y": 727.5154 - }, - "width": 54.11808, - "height": 9.85872, - "page": 200 - } - ], - "sectionNumber": 1297, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:58:49.956Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:58:49.956Z", - "requestedDate": "2022-10-10T11:58:49.956Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8ccd6331be9e11aed7319ba9d22d7516", - "type": "manual", - "value": "2.11.3. STEP 3: Hazard assessment – identification of relevant metabolites", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 456.39865 - }, - "width": 316.027, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:22.517Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:22.517Z", - "requestedDate": "2022-10-10T11:57:22.517Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c973b959735bbaea10a06969bcd3c807", - "type": "manual", - "value": "3\nProposed decision with respect to the application", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 96.984, - "y": 447.26865 - }, - "width": 208.19469, - "height": 8.89428, - "page": 183 - }, - { - "topLeft": { - "x": 70.92, - "y": 447.26865 - }, - "width": 4.98, - "height": 8.89428, - "page": 183 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:58:08.341Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:58:08.341Z", - "requestedDate": "2022-10-10T11:58:08.341Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "783f4ab287973fff7a4a1f387719a837", - "type": "manual", - "value": "2.11.1. STEP 1: Exclusion of degradation products of no concern", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11 Relevance of metabolites in groundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 631.98865 - }, - "width": 275.21472, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": 1088, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:08.578Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:08.578Z", - "requestedDate": "2022-10-10T11:57:08.578Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "89be91f00dfccc932110d786308c550c", - "type": "manual", - "value": "Level 3", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 383.93, - "y": 496.556 - }, - "width": 73.992, - "height": 21.432, - "page": 183 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:58:00.473Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:58:00.473Z", - "requestedDate": "2022-10-10T11:58:00.473Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - } - ], - "legalBasis": [ - { - "name": "n-a.", - "description": "n-a.", - "reason": "n-a." - } - ], - "dictionaryVersion": 13, - "dossierDictionaryVersion": 1, - "rulesVersion": 3, - "legalBasisVersion": 2 -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/S-Metolachlor_RAR_01_Volume_1_2018-09-06_REDACTION_LOG.json b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/S-Metolachlor_RAR_01_Volume_1_2018-09-06_REDACTION_LOG.json deleted file mode 100644 index 78424e0a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/S-Metolachlor_RAR_01_Volume_1_2018-09-06_REDACTION_LOG.json +++ /dev/null @@ -1,13720 +0,0 @@ -{ - "analysisVersion": 1, - "analysisNumber": 1, - "redactionLogEntry": [ - { - "id": "b32da2b5707223fb95a0f93034f04274", - "type": "headline", - "value": "1 Statement of subject matter and purpose for which this report has been prepared and background information on the application ............ 9", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "1 Statement of subject matter and purpose for which this report has\nbeen prepared and background information on the application ............ 9", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 732.938 - }, - "width": 6, - "height": -11.358002, - "page": 3 - }, - { - "topLeft": { - "x": 156.02, - "y": 732.938 - }, - "width": 339.72003, - "height": -11.358002, - "page": 3 - }, - { - "topLeft": { - "x": 156.02, - "y": 719.138 - }, - "width": 368.62, - "height": -11.358002, - "page": 3 - } - ], - "sectionNumber": 12, - "textBefore": null, - "textAfter": " 1.1 1.1.1", - "comments": null, - "startOffset": 0, - "endOffset": 142, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563140354Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:03:45.201299Z", - "requestedDate": "2022-10-10T12:03:45.177937Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "93c3b1510b4e7eaa8ac1e1c6ba8988b2", - "type": "headline", - "value": "1.1.3 1.1.4", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "1.1.3\n1.1.4", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 644.474 - }, - "width": 24, - "height": -11.453995, - "page": 3 - }, - { - "topLeft": { - "x": 70.944, - "y": 630.67395 - }, - "width": 24, - "height": -11.453995, - "page": 3 - } - ], - "sectionNumber": 13, - "textBefore": null, - "textAfter": " 1.2 1.2.1", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563143694Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:03:49.144718Z", - "requestedDate": "2022-10-10T12:03:49.129366Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "76fd7d61b70a6c12efb797db19a31e47", - "type": "headline", - "value": "2.6.12", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.6.12", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 262.82397 - }, - "width": 30, - "height": -11.4539795, - "page": 4 - } - ], - "sectionNumber": 15, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563144054Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:10.788579Z", - "requestedDate": "2022-10-10T12:04:10.775355Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bae1cafb4cebf89a3e996064617e6d90", - "type": "headline", - "value": "2.4.2 2.4.3", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.4.2\n2.4.3", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 556.604 - }, - "width": 24, - "height": -11.45401, - "page": 4 - }, - { - "topLeft": { - "x": 70.944, - "y": 542.80396 - }, - "width": 24, - "height": -11.45401, - "page": 4 - } - ], - "sectionNumber": 14, - "textBefore": null, - "textAfter": " 2.5 2.5.1", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563144404Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:06.789248Z", - "requestedDate": "2022-10-10T12:04:06.772008Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "107d6ca868c16954c6f0015b15f4f3dc", - "type": "headline", - "value": "2.6.14", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.6.14", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 207.594 - }, - "width": 30, - "height": -11.4539795, - "page": 4 - } - ], - "sectionNumber": 17, - "textBefore": null, - "textAfter": " 2.7 2.7.1", - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563144784Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:17.716935Z", - "requestedDate": "2022-10-10T12:04:17.701587Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "330db75fc6aabf74f96ca439ecfba3b8", - "type": "headline", - "value": "2.6.13", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.6.13", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 235.224 - }, - "width": 30, - "height": -11.4539795, - "page": 4 - } - ], - "sectionNumber": 16, - "textBefore": null, - "textAfter": " 2.6 2.6.1", - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563145134Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:14.205524Z", - "requestedDate": "2022-10-10T12:04:14.190398Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1954e1f2e5c010882d1daa020140b253", - "type": "headline", - "value": "2.7.10 2.7.11", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.7.10\n2.7.11", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 521.204 - }, - "width": 30, - "height": -11.45401, - "page": 5 - }, - { - "topLeft": { - "x": 70.944, - "y": 507.404 - }, - "width": 30, - "height": -11.45401, - "page": 5 - } - ], - "sectionNumber": 18, - "textBefore": null, - "textAfter": " 2.7.3 2.7.3.1", - "comments": null, - "startOffset": 0, - "endOffset": 13, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563145534Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:23.192755Z", - "requestedDate": "2022-10-10T12:04:23.178086Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2878630c9a2df7da3558bd887e5336ee", - "type": "headline", - "value": "3.1.4.1 3.1.4.2", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "3.1.4.1\n3.1.4.2", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 219.23395 - }, - "width": 33, - "height": -11.4539795, - "page": 6 - }, - { - "topLeft": { - "x": 70.944, - "y": 205.43396 - }, - "width": 33, - "height": -11.4539795, - "page": 6 - } - ], - "sectionNumber": 20, - "textBefore": null, - "textAfter": " 3.1 3.1.1", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563145944Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:31.840329Z", - "requestedDate": "2022-10-10T12:04:31.814032Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a5d93f248d9f29be8f069526e2fa9492", - "type": "headline", - "value": "3 Proposed decision with respect to the application ................................ 189", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "3 Proposed decision with respect to the application ................................ 189", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 390.52798 - }, - "width": 6, - "height": -11.358002, - "page": 6 - }, - { - "topLeft": { - "x": 156.02, - "y": 390.52798 - }, - "width": 368.62, - "height": -11.358002, - "page": 6 - } - ], - "sectionNumber": 19, - "textBefore": null, - "textAfter": " 3.1.1.1 3.1.1.2", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563146274Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:28.102711Z", - "requestedDate": "2022-10-10T12:04:28.087793Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "285c20ca1e1ef41ed172885188c14121", - "type": "headline", - "value": "3.1.8 3.1.9", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "3.1.8\n3.1.9", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 728.234 - }, - "width": 24, - "height": -11.453995, - "page": 7 - }, - { - "topLeft": { - "x": 70.944, - "y": 714.43396 - }, - "width": 24, - "height": -11.453995, - "page": 7 - } - ], - "sectionNumber": 23, - "textBefore": null, - "textAfter": " 3.1.6 3.1.7", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563146604Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:37.96519Z", - "requestedDate": "2022-10-10T12:04:37.945221Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fc84cf6217f5650d56b0f7a7ff5502af", - "type": "headline", - "value": "1.1.3 EU Regulatory history for use in plant protection products", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.3 EU Regulatory history for use in plant protection products", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 407.94797 - }, - "width": 24, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 407.94797 - }, - "width": 300.2, - "height": -11.358002, - "page": 9 - } - ], - "sectionNumber": 28, - "textBefore": null, - "textAfter": " S-Metolachlor was", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563147234Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "652bb188641b5a9868cd50bc05614e8e", - "type": "headline", - "value": "1.1.1 Purpose for which the renewal assessment report was prepared", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.1 Purpose for which the renewal assessment report was prepared", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 635.258 - }, - "width": 24, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 635.258 - }, - "width": 322.80804, - "height": -11.358002, - "page": 9 - } - ], - "sectionNumber": 26, - "textBefore": null, - "textAfter": " This renewal", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563147554Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "313f979b56ac38fba97621d8d6c3cf2a", - "type": "headline", - "value": "1.1.2 Arrangements between rapporteur Member State and co-rapporteur Member State", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.2 Arrangements between rapporteur Member State and co-rapporteur\nMember State", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 534.78796 - }, - "width": 24, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 534.78796 - }, - "width": 382.89203, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 520.988 - }, - "width": 72.198, - "height": -11.358002, - "page": 9 - } - ], - "sectionNumber": 27, - "textBefore": null, - "textAfter": " According to", - "comments": null, - "startOffset": 0, - "endOffset": 81, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563147884Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "940e9ebdaf90bcf2d4db077f595baec5", - "type": "headline", - "value": "1 Statement of subject matter and purpose for which this report has been prepared and background information on the application", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1 Statement of subject matter and purpose for which this report\nhas been prepared and background information on the application", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 744.2889 - }, - "width": 7.0199966, - "height": -12.26886, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 744.2889 - }, - "width": 382.8028, - "height": -12.26886, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 728.20886 - }, - "width": 382.77533, - "height": -12.26886, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 712.12885 - }, - "width": 23.39064, - "height": -12.26886, - "page": 9 - } - ], - "sectionNumber": 24, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 127, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563148214Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5d1090dd81d53bc3a5241bbc72b14ef8", - "type": "headline", - "value": "1.1 Context in which the renewal assessment report was prepared", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1 Context in which the renewal assessment report was prepared", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 673.058 - }, - "width": 15, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 673.058 - }, - "width": 317.28802, - "height": -11.358002, - "page": 9 - } - ], - "sectionNumber": 25, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563148564Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e96c5f0d1d5d86c63db8afe1ab25d753", - "type": "headline", - "value": "1.2.3 Information relating to the collective provision of dossiers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.3 Information relating to the collective provision of dossiers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 99.50195 - }, - "width": 24, - "height": -11.357971, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 99.50195 - }, - "width": 295.15204, - "height": -11.357971, - "page": 10 - } - ], - "sectionNumber": 33, - "textBefore": null, - "textAfter": " Syngenta Limited", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563148994Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a14b3cf14950818cca7e372ca9045984", - "type": "headline", - "value": "1.1.4 Evaluations carried out under other regulatory contexts", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.4 Evaluations carried out under other regulatory contexts", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 732.698 - }, - "width": 24, - "height": -11.358002, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 732.698 - }, - "width": 286.03998, - "height": -11.358002, - "page": 10 - } - ], - "sectionNumber": 29, - "textBefore": null, - "textAfter": " The following", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563149414Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "76fe901bc4233393ad1a1a0462a71f09", - "type": "headline", - "value": "1.2.1 Name and address of applicant(s) for approval of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.1 Name and address of applicant(s) for approval of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 338.328 - }, - "width": 24, - "height": -11.357971, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 338.328 - }, - "width": 355.92004, - "height": -11.357971, - "page": 10 - } - ], - "sectionNumber": 31, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 75, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563149794Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a0dea7c2f6af748bfcfd1c0178903477", - "type": "headline", - "value": "1.2.2 Producer or producers of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.2 Producer or producers of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 162.01794 - }, - "width": 24, - "height": -11.357971, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 162.01794 - }, - "width": 234.312, - "height": -11.357971, - "page": 10 - } - ], - "sectionNumber": 32, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563150104Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6450c63ad328473acb8fb434dbeb45bc", - "type": "headline", - "value": "1.2 Applicant(s) information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2 Applicant(s) information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 376.12796 - }, - "width": 15, - "height": -11.358002, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 376.12796 - }, - "width": 127.673996, - "height": -11.358002, - "page": 10 - } - ], - "sectionNumber": 30, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563150444Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0e7e4c506937abbadfc561abf4de4997", - "type": "headline", - "value": "1.3 Identity of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3 Identity of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 15, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 158.70601, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 34, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563150754Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b6d79e7f74298faed8b2d7fc96fe39d5", - "type": "headline", - "value": "1.3.3 Producer’s development code numbers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.3 Producer’s development code numbers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 508.26797 - }, - "width": 24, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 508.26797 - }, - "width": 199.23799, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 37, - "textBefore": null, - "textAfter": " CGA 77102", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563151074Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aa7f8e35440b181a037650e7a5e599ea", - "type": "headline", - "value": "1.3.4 CAS, EC and CIPAC numbers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.4 CAS, EC and CIPAC numbers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 445.748 - }, - "width": 24, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 445.748 - }, - "width": 157.29002, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 38, - "textBefore": null, - "textAfter": " CAS: 87392-12-9", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563151394Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d6252bc7df7126aab3e7a26814a17c75", - "type": "headline", - "value": "1.3.1 Common name proposed or ISO-accepted and synonyms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.1 Common name proposed or ISO-accepted and synonyms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 24, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 290.846, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 35, - "textBefore": null, - "textAfter": " S-Metolachlor", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563151704Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1b967a0a6743e32ba5e5a4f7d88022b5", - "type": "headline", - "value": "1.3.2 Chemical name (IUPAC and CA nomenclature)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.2 Chemical name (IUPAC and CA nomenclature)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.09796 - }, - "width": 24, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.09796 - }, - "width": 243.05998, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 36, - "textBefore": null, - "textAfter": " IUPAC: Mixture", - "comments": null, - "startOffset": 0, - "endOffset": 47, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563152044Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a0879a5393cfa0d1fc9f07cf0f354053", - "type": "headline", - "value": "1.3.5 Molecular and structural formulae, molecular mass", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.5 Molecular and structural formulae, molecular mass", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 331.36798 - }, - "width": 24, - "height": -11.357971, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 331.36798 - }, - "width": 264.068, - "height": -11.357971, - "page": 11 - } - ], - "sectionNumber": 43, - "textBefore": null, - "textAfter": " Molecular formular:", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563152414Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2a3a1df41d2ec151093765a692b9f466", - "type": "headline", - "value": "1.3.8.3 Relevant impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.3 Relevant impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 138.13794 - }, - "width": 33, - "height": -11.357971, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 138.13794 - }, - "width": 100.87198, - "height": -11.357971, - "page": 12 - } - ], - "sectionNumber": 49, - "textBefore": null, - "textAfter": " There are", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563152734Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "716b7f7e4a3597bdea9e2624c1663ec8", - "type": "headline", - "value": "1.3.6 Method of manufacture (synthesis pathway) of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.6 Method of manufacture (synthesis pathway) of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 489.06796 - }, - "width": 24, - "height": -11.358002, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 489.06796 - }, - "width": 343.596, - "height": -11.358002, - "page": 12 - } - ], - "sectionNumber": 44, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 71, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563153074Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cf2d18a705eb9c9f7b8a62d081e61362", - "type": "headline", - "value": "1.3.8 Identity and content of additives (such as stabilisers) and impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8 Identity and content of additives (such as stabilisers) and impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 300.88794 - }, - "width": 24, - "height": -11.357971, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 300.88794 - }, - "width": 346.37598, - "height": -11.357971, - "page": 12 - } - ], - "sectionNumber": 46, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 76, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563153414Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7da68e6296bae7fe33a1ec1849b079db", - "type": "headline", - "value": "1.3.8.1 Additives", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.1 Additives", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 263.08795 - }, - "width": 33, - "height": -11.357971, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 263.08795 - }, - "width": 48.696, - "height": -11.357971, - "page": 12 - } - ], - "sectionNumber": 47, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 17, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563153754Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "05b1d765a3578027e6b80afaaea598d9", - "type": "headline", - "value": "1.3.8.2 Significant impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.2 Significant impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 200.65796 - }, - "width": 33, - "height": -11.357971, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 200.65796 - }, - "width": 110.92799, - "height": -11.357971, - "page": 12 - } - ], - "sectionNumber": 48, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563154084Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "30de0562606defd44969dd242a9f1273", - "type": "headline", - "value": "1.3.7 Specification of purity of the active substance in g/kg", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.7 Specification of purity of the active substance in g/kg", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 426.54797 - }, - "width": 24, - "height": -11.358002, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 426.54797 - }, - "width": 269.97595, - "height": -11.358002, - "page": 12 - } - ], - "sectionNumber": 45, - "textBefore": null, - "textAfter": " Minimum purity", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563154404Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "06381fe5ed627e9f2aa386a45e18bd80", - "type": "headline", - "value": "1.4.4 Detailed quantitative and qualitative information on the composition of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4 Detailed quantitative and qualitative information on the composition of\nthe plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 189.61798 - }, - "width": 24, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 189.61798 - }, - "width": 382.63397, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 175.818 - }, - "width": 144.55202, - "height": -11.357971, - "page": 13 - } - ], - "sectionNumber": 55, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 106, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563154714Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "967dd9171cab5200c91452e69e47fc6e", - "type": "headline", - "value": "1.4.3 Trade name or proposed trade name and producer's development code number of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.3 Trade name or proposed trade name and producer's development code\nnumber of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 291.16797 - }, - "width": 24, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 291.16797 - }, - "width": 382.40405, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 277.36798 - }, - "width": 200.79597, - "height": -11.357971, - "page": 13 - } - ], - "sectionNumber": 54, - "textBefore": null, - "textAfter": " Trade name:", - "comments": null, - "startOffset": 0, - "endOffset": 110, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563155054Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "15698f457c1e4ff4a4fc53eeb544b7e3", - "type": "headline", - "value": "1.4.2 Producer of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.2 Producer of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 492.78796 - }, - "width": 24, - "height": -11.358002, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 492.78796 - }, - "width": 207.99602, - "height": -11.358002, - "page": 13 - } - ], - "sectionNumber": 53, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563155444Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "632724281d3bce7364b930c401430264", - "type": "headline", - "value": "1.4.4.1 Composition of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.1 Composition of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 138.01794 - }, - "width": 33, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 138.01794 - }, - "width": 226.23601, - "height": -11.357971, - "page": 13 - } - ], - "sectionNumber": 56, - "textBefore": null, - "textAfter": " Content of", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563155764Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "15c4b5c138888ba72eb01d4f26a414e8", - "type": "headline", - "value": "1.4 Information on the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4 Information on the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 706.89795 - }, - "width": 15, - "height": -11.358002, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 706.89795 - }, - "width": 226.23601, - "height": -11.358002, - "page": 13 - } - ], - "sectionNumber": 51, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 47, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563156094Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cc75355ea9073a4f8cce4550ed8ed25d", - "type": "headline", - "value": "1.4.1 Applicant", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.1 Applicant", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.09796 - }, - "width": 24, - "height": -11.358002, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.09796 - }, - "width": 50.75998, - "height": -11.358002, - "page": 13 - } - ], - "sectionNumber": 52, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563162254Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "483be1fe606562a9c34e7034c14c44e6", - "type": "headline", - "value": "1.3.9 Analytical profile of batches", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.9 Analytical profile of batches", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 144.024, - "height": -11.358002, - "page": 13 - } - ], - "sectionNumber": 50, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 35, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563162674Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "add8a2ba54d26f65204e0413ad24597a", - "type": "headline", - "value": "1.4.8 Effects on harmful organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.8 Effects on harmful organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 375.76797 - }, - "width": 24, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 375.76797 - }, - "width": 151.52998, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 62, - "textBefore": null, - "textAfter": " Sensitive weeds", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563163014Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bfffcca5e74fb62aac6b61b4db177de6", - "type": "headline", - "value": "1.4.6 Function", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.6 Function", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 500.70798 - }, - "width": 24, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 500.70798 - }, - "width": 45.89998, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 60, - "textBefore": null, - "textAfter": " Herbicide in", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563163354Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "75b8b0496f826a6d6d092cd839901905", - "type": "headline", - "value": "1.4.4.2 Information on the active substances", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.2 Information on the active substances", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 33, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 187.94402, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 57, - "textBefore": null, - "textAfter": " ISO common", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563163674Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "185046e9ee00222903aa4f37a79185c8", - "type": "headline", - "value": "1.4.5 Type and code of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.5 Type and code of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 575.82794 - }, - "width": 24, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 575.82794 - }, - "width": 234.30598, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 59, - "textBefore": null, - "textAfter": " A9396G (synonym:", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563164004Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6b7a558cefa311dd541116f8ee655498", - "type": "headline", - "value": "1.4.7 Field of use envisaged", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.7 Field of use envisaged", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 438.30798 - }, - "width": 24, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 438.30798 - }, - "width": 111.611984, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 61, - "textBefore": null, - "textAfter": " Herbicide in", - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563164334Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bca25b4734ab9231809ba2c77a3920dc", - "type": "headline", - "value": "1.4.4.3 Information on safeners, synergists and co-formulants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.3 Information on safeners, synergists and co-formulants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 638.258 - }, - "width": 33, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 638.258 - }, - "width": 277.35797, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 58, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563164664Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "eca147304f579f50210cdd6f7382696e", - "type": "headline", - "value": "1.5.1 Details of representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.1 Details of representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 460.89798 - }, - "width": 24, - "height": -11.358002, - "page": 15 - }, - { - "topLeft": { - "x": 141.74, - "y": 460.89798 - }, - "width": 148.47597, - "height": -11.358002, - "page": 15 - } - ], - "sectionNumber": 78, - "textBefore": null, - "textAfter": " Table 1.5-1:", - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563165004Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8abdd460681dadd15233c61eeed67450", - "type": "headline", - "value": "1.5 Detailed uses of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5 Detailed uses of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 498.69797 - }, - "width": 15, - "height": -11.358002, - "page": 15 - }, - { - "topLeft": { - "x": 141.74, - "y": 498.69797 - }, - "width": 227.808, - "height": -11.358002, - "page": 15 - } - ], - "sectionNumber": 63, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563165334Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7c4d5e8eadb5c00f794020cf546f9104", - "type": "headline", - "value": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses beyond the representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses\nbeyond the representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 581.70795 - }, - "width": 24, - "height": -11.358002, - "page": 17 - }, - { - "topLeft": { - "x": 141.74, - "y": 581.70795 - }, - "width": 382.5, - "height": -11.358002, - "page": 17 - }, - { - "topLeft": { - "x": 141.74, - "y": 567.90796 - }, - "width": 153.45598, - "height": -11.358002, - "page": 17 - } - ], - "sectionNumber": 80, - "textBefore": null, - "textAfter": " No information.", - "comments": null, - "startOffset": 0, - "endOffset": 110, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563165674Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "64eb31f62c59b280dda39ae2aefb0d49", - "type": "headline", - "value": "1.5.2 Further information on representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.2 Further information on representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 745.298 - }, - "width": 24, - "height": -11.358002, - "page": 17 - }, - { - "topLeft": { - "x": 141.74, - "y": 745.298 - }, - "width": 216.44405, - "height": -11.358002, - "page": 17 - } - ], - "sectionNumber": 79, - "textBefore": null, - "textAfter": " For details", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563166014Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "802e6739bdfe5107215d920d48fff6a8", - "type": "headline", - "value": "1.5.4 Overview on authorisations in EU Member States", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.4 Overview on authorisations in EU Member States", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 505.38797 - }, - "width": 24, - "height": -11.358002, - "page": 17 - }, - { - "topLeft": { - "x": 141.74, - "y": 505.38797 - }, - "width": 249.22801, - "height": -11.358002, - "page": 17 - } - ], - "sectionNumber": 83, - "textBefore": null, - "textAfter": " Different s-metolachlor", - "comments": null, - "startOffset": 0, - "endOffset": 52, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563166344Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dee411cc4fa679181ae9dbf8a035cca1", - "type": "headline", - "value": "2.1.1 Summary of identity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1.1 Summary of identity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 663.33795 - }, - "width": 24, - "height": -11.358002, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 663.33795 - }, - "width": 105.89998, - "height": -11.358002, - "page": 19 - } - ], - "sectionNumber": 86, - "textBefore": null, - "textAfter": " Active substance", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563166654Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a6d098fab579563e5dfc529eea97317c", - "type": "headline", - "value": "2 Summary of active substance hazard and of product risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2 Summary of active substance hazard and of product risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 756.2889 - }, - "width": 7.0199966, - "height": -12.26886, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 756.2889 - }, - "width": 382.89526, - "height": -12.26886, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 740.20886 - }, - "width": 52.888687, - "height": -12.26886, - "page": 19 - } - ], - "sectionNumber": 84, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563166974Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "065e6695e1f33cb809db37828cdb6137", - "type": "headline", - "value": "2.2.1 Summary of physical and chemical properties of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2.1 Summary of physical and chemical properties of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 411.30798 - }, - "width": 24, - "height": -11.358002, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 411.30798 - }, - "width": 352.69202, - "height": -11.358002, - "page": 19 - } - ], - "sectionNumber": 88, - "textBefore": null, - "textAfter": " S-metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563167274Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5c93b5128de3514972c9752535842512", - "type": "headline", - "value": "2.2 Physical and chemical properties", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 Physical and chemical properties", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 449.10797 - }, - "width": 15, - "height": -11.358002, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 449.10797 - }, - "width": 168.85197, - "height": -11.358002, - "page": 19 - } - ], - "sectionNumber": 87, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563167594Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "98a07648283fa70f4ce7f78ba77c4d44", - "type": "headline", - "value": "2.1 Identity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1 Identity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 701.138 - }, - "width": 15, - "height": -11.358002, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 701.138 - }, - "width": 40.65599, - "height": -11.358002, - "page": 19 - } - ], - "sectionNumber": 85, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563167894Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "69fffdfa5cf94435b0d4489400b316ea", - "type": "headline", - "value": "2.2.2 Summary of physical and chemical properties of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2.2 Summary of physical and chemical properties of the plant protection\nproduct", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 260.208 - }, - "width": 24, - "height": -11.357971, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 260.208 - }, - "width": 382.78406, - "height": -11.357971, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 246.40796 - }, - "width": 40.439987, - "height": -11.357971, - "page": 19 - } - ], - "sectionNumber": 89, - "textBefore": null, - "textAfter": " The product", - "comments": null, - "startOffset": 0, - "endOffset": 81, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563168224Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b7e7b6e4877e5df67a2378000ec58d7b", - "type": "headline", - "value": "2.3.1 Summary of effectiveness", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.1 Summary of effectiveness", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 24, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 130.57204, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 91, - "textBefore": null, - "textAfter": " Major annual", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563168534Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "760fcfce8bc83a01e313c0a5bf4b4c30", - "type": "headline", - "value": "2.3.4 Summary of observations on other undesirable or unintended side-effects", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.4 Summary of observations on other undesirable or unintended side-effects", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 354.40796 - }, - "width": 24, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 354.40796 - }, - "width": 374.97998, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 94, - "textBefore": null, - "textAfter": " A9396G can", - "comments": null, - "startOffset": 0, - "endOffset": 77, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563168914Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "df69307ca0b04c72b593a5d9a1cecc2c", - "type": "headline", - "value": "2.4.1 Summary of methods and precautions concerning handling, storage, transport or fire", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.1 Summary of methods and precautions concerning handling, storage,\ntransport or fire", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 228.88794 - }, - "width": 24, - "height": -11.357971, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 228.88794 - }, - "width": 382.4281, - "height": -11.357971, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 215.05798 - }, - "width": 83.412, - "height": -11.357971, - "page": 20 - } - ], - "sectionNumber": 96, - "textBefore": null, - "textAfter": " Acceptable information", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563169284Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3d77b88341aa143c1c280f010da8ee19", - "type": "headline", - "value": "2.3.3 Summary of adverse effects on treated crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.3 Summary of adverse effects on treated crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 442.14798 - }, - "width": 24, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 442.14798 - }, - "width": 227.26799, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 93, - "textBefore": null, - "textAfter": " A9396G is", - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563169614Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0bb2bcf0fefcf94536b2c50ee206489f", - "type": "headline", - "value": "2.4 Further information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4 Further information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 266.688 - }, - "width": 15, - "height": -11.357971, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 266.688 - }, - "width": 104.90399, - "height": -11.357971, - "page": 20 - } - ], - "sectionNumber": 95, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563169934Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "90680a5f65ce46aae53ae6923e3e0837", - "type": "headline", - "value": "2.3 Data on application and efficacy", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3 Data on application and efficacy", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 15, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 165.27599, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 90, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563170254Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "65bcee9a0a84d1067fd44ee075345601", - "type": "headline", - "value": "2.4.2 Summary of procedures for destruction or decontamination", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.2 Summary of procedures for destruction or decontamination", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 139.93799 - }, - "width": 24, - "height": -11.357971, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 139.93799 - }, - "width": 305.53204, - "height": -11.357971, - "page": 20 - } - ], - "sectionNumber": 97, - "textBefore": null, - "textAfter": " Acceptable information", - "comments": null, - "startOffset": 0, - "endOffset": 62, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563170634Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c7aa452eee949564f7cc8223bb58710e", - "type": "headline", - "value": "2.3.2 Summary of information on the development of resistance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.2 Summary of information on the development of resistance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 618.45795 - }, - "width": 24, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 618.45795 - }, - "width": 297.18005, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 92, - "textBefore": null, - "textAfter": " The evaluation", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563170944Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8190e7384ea95c27b4d4c178f40f99d4", - "type": "headline", - "value": "2.5 Methods of analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5 Methods of analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 694.178 - }, - "width": 15, - "height": -11.358002, - "page": 21 - }, - { - "topLeft": { - "x": 141.74, - "y": 694.178 - }, - "width": 101.45999, - "height": -11.358002, - "page": 21 - } - ], - "sectionNumber": 99, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563171254Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "74721e29149004deecc085bae3062452", - "type": "headline", - "value": "2.4.3 Summary of emergency measures in case of an accident", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.3 Summary of emergency measures in case of an accident", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 21 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 284.17194, - "height": -11.358002, - "page": 21 - } - ], - "sectionNumber": 98, - "textBefore": null, - "textAfter": " Acceptable information", - "comments": null, - "startOffset": 0, - "endOffset": 58, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563171574Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b417835d9bc2aab3fb45ca634fc57fa9", - "type": "headline", - "value": "2.5.1 Methods used for the generation of pre-authorisation data", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.1 Methods used for the generation of pre-authorisation data", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 656.378 - }, - "width": 24, - "height": -11.358002, - "page": 21 - }, - { - "topLeft": { - "x": 141.74, - "y": 656.378 - }, - "width": 291.53003, - "height": -11.358002, - "page": 21 - } - ], - "sectionNumber": 174, - "textBefore": null, - "textAfter": " Active Substance", - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563171934Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "50024eb749eda0694ed9a1b2b89f2e9e", - "type": "headline", - "value": "2.5.2 Methods for post control and monitoring purposes", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2 Methods for post control and monitoring purposes", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 27 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 258.10797, - "height": -11.358002, - "page": 27 - } - ], - "sectionNumber": 175, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563172254Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e1d1feda961b7e6b6c6070ba4b71bc01", - "type": "headline", - "value": "2.5.2.1 Formulation analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.1 Formulation analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 33, - "height": -11.358002, - "page": 27 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 108.39598, - "height": -11.358002, - "page": 27 - } - ], - "sectionNumber": 176, - "textBefore": null, - "textAfter": " Analytical methods", - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563172564Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7d144b5adfe7d74e3fe630f1f5e46917", - "type": "headline", - "value": "2.5.2.2 Residue analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.2 Residue analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.09796 - }, - "width": 33, - "height": -11.358002, - "page": 27 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.09796 - }, - "width": 84.47398, - "height": -11.358002, - "page": 27 - } - ], - "sectionNumber": 232, - "textBefore": null, - "textAfter": " Relevant residue", - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563172874Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "55abb9527e6f6c366a26b989cd4fe254", - "type": "headline", - "value": "2.6 Effects on human and animal health", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6 Effects on human and animal health", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 209.17798 - }, - "width": 15, - "height": -11.357971, - "page": 31 - }, - { - "topLeft": { - "x": 141.74, - "y": 209.17798 - }, - "width": 185.49596, - "height": -11.357971, - "page": 31 - } - ], - "sectionNumber": 244, - "textBefore": null, - "textAfter": " The toxicological", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563173194Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f44c47f295c0c61286d265c6966ddec3", - "type": "headline", - "value": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.1 Summary of absorption, distribution, metabolism and excretion in\nmammals", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 617.378 - }, - "width": 24, - "height": -11.358002, - "page": 33 - }, - { - "topLeft": { - "x": 141.74, - "y": 617.378 - }, - "width": 382.85608, - "height": -11.358002, - "page": 33 - }, - { - "topLeft": { - "x": 141.74, - "y": 603.57794 - }, - "width": 49.87201, - "height": -11.358002, - "page": 33 - } - ], - "sectionNumber": 245, - "textBefore": null, - "textAfter": " The oral", - "comments": null, - "startOffset": 0, - "endOffset": 78, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563173504Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "77dca93a44907099c3973703bb2e8017", - "type": "headline", - "value": "2.6.2 Summary of acute toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.2 Summary of acute toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 34 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 135.03001, - "height": -11.358002, - "page": 34 - } - ], - "sectionNumber": 275, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563173824Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "162fcce7d4d6c20f3c9313979ea2d8d5", - "type": "headline", - "value": "2.6.3 Summary of short-term toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.3 Summary of short-term toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 276.04797 - }, - "width": 24, - "height": -11.357971, - "page": 36 - }, - { - "topLeft": { - "x": 141.74, - "y": 276.04797 - }, - "width": 162.85799, - "height": -11.357971, - "page": 36 - } - ], - "sectionNumber": 286, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563174144Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aea0504a0bd8f64743f2df380be03c91", - "type": "headline", - "value": "2.6.4 Summary of genotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.4 Summary of genotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 618.818 - }, - "width": 24, - "height": -11.358002, - "page": 38 - }, - { - "topLeft": { - "x": 141.74, - "y": 618.818 - }, - "width": 128.64598, - "height": -11.358002, - "page": 38 - } - ], - "sectionNumber": 304, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 29, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563174483Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4f1e20e7df0401a1fd67a15a2b29f71b", - "type": "headline", - "value": "2.6.5 Summary of long-term toxicity and carcinogenicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.5 Summary of long-term toxicity and carcinogenicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 441.30798 - }, - "width": 24, - "height": -11.358002, - "page": 39 - }, - { - "topLeft": { - "x": 141.74, - "y": 441.30798 - }, - "width": 261.354, - "height": -11.358002, - "page": 39 - } - ], - "sectionNumber": 309, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563174823Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32794d7be49a30122212a0def9fe30fa", - "type": "headline", - "value": "2.6.6 Summary of reproductive toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.6 Summary of reproductive toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 593.498 - }, - "width": 24, - "height": -11.358002, - "page": 40 - }, - { - "topLeft": { - "x": 141.74, - "y": 593.498 - }, - "width": 172.98, - "height": -11.358002, - "page": 40 - } - ], - "sectionNumber": 317, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563175143Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "44ce29862628f5afff31dd729ffcca5c", - "type": "headline", - "value": "2.6.7 Summary of neurotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.7 Summary of neurotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 277.248 - }, - "width": 24, - "height": -11.357971, - "page": 41 - }, - { - "topLeft": { - "x": 141.74, - "y": 277.248 - }, - "width": 134.34001, - "height": -11.357971, - "page": 41 - } - ], - "sectionNumber": 318, - "textBefore": null, - "textAfter": " No specific", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563175473Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "40c5d11ad9063c594e54c4c1a9d2cd5d", - "type": "headline", - "value": "2.6.8 Summary of further toxicological studies on the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8 Summary of further toxicological studies on the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 151.578 - }, - "width": 24, - "height": -11.357971, - "page": 41 - }, - { - "topLeft": { - "x": 141.74, - "y": 151.578 - }, - "width": 329.59204, - "height": -11.357971, - "page": 41 - } - ], - "sectionNumber": 319, - "textBefore": null, - "textAfter": " Further mechanistic", - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563175803Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "be45ce618e305ca42a3539030a9b4cc5", - "type": "headline", - "value": "2.6.9 Summary of toxicological data on impurities and metabolites", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.9 Summary of toxicological data on impurities and metabolites", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 251.92798 - }, - "width": 24, - "height": -11.357971, - "page": 42 - }, - { - "topLeft": { - "x": 141.74, - "y": 251.92798 - }, - "width": 311.47205, - "height": -11.357971, - "page": 42 - } - ], - "sectionNumber": 354, - "textBefore": null, - "textAfter": " Summary of", - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563176113Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "40f1ec932a7004600631ddf5cf74624c", - "type": "headline", - "value": "2.6.11 Toxicological end point for assessment of risk following long-term dietary exposure - ADI", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.11 Toxicological end point for assessment of risk following long-term dietary\nexposure - ADI", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 467.82797 - }, - "width": 30, - "height": -11.358002, - "page": 46 - }, - { - "topLeft": { - "x": 141.74, - "y": 467.82797 - }, - "width": 382.83203, - "height": -11.358002, - "page": 46 - }, - { - "topLeft": { - "x": 141.74, - "y": 454.02798 - }, - "width": 77.058, - "height": -11.358002, - "page": 46 - } - ], - "sectionNumber": 356, - "textBefore": null, - "textAfter": " Original DAR", - "comments": null, - "startOffset": 0, - "endOffset": 96, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563176433Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ed3be3511c690dbdfac3fef0b8fd37c4", - "type": "headline", - "value": "2.6.10 Summary of medical data and information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.10 Summary of medical data and information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.45795 - }, - "width": 30, - "height": -11.358002, - "page": 46 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.45795 - }, - "width": 218.73598, - "height": -11.358002, - "page": 46 - } - ], - "sectionNumber": 355, - "textBefore": null, - "textAfter": " According to", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563176743Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "debcea539a3cc78c168d88cdd3e3d591", - "type": "headline", - "value": "2.6.13 Toxicological end point for assessment of occupational, bystander and residents risks – AOEL", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.13 Toxicological end point for assessment of occupational, bystander and\nresidents risks – AOEL", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 367.36798 - }, - "width": 30, - "height": -11.358002, - "page": 47 - }, - { - "topLeft": { - "x": 141.74, - "y": 367.36798 - }, - "width": 382.85602, - "height": -11.358002, - "page": 47 - }, - { - "topLeft": { - "x": 141.74, - "y": 353.56796 - }, - "width": 118.782, - "height": -11.358002, - "page": 47 - } - ], - "sectionNumber": 358, - "textBefore": null, - "textAfter": " Original DAR", - "comments": null, - "startOffset": 0, - "endOffset": 99, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563177053Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7d9ca9d22dbd67d2df797cdeccdc020a", - "type": "headline", - "value": "2.6.12 Toxicological end point for assessment of risk following acute dietary exposure - ARfD (acute reference dose)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.12 Toxicological end point for assessment of risk following acute dietary\nexposure - ARfD (acute reference dose)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.45795 - }, - "width": 30, - "height": -11.358002, - "page": 47 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.45795 - }, - "width": 382.88806, - "height": -11.358002, - "page": 47 - }, - { - "topLeft": { - "x": 141.74, - "y": 655.65796 - }, - "width": 199.434, - "height": -11.358002, - "page": 47 - } - ], - "sectionNumber": 357, - "textBefore": null, - "textAfter": " Original DAR", - "comments": null, - "startOffset": 0, - "endOffset": 116, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563177373Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9a68943d96e5d303985a5f7bbfac95fc", - "type": "headline", - "value": "2.6.14 Summary of product exposure and risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.14 Summary of product exposure and risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 353.20798 - }, - "width": 30, - "height": -11.358002, - "page": 48 - }, - { - "topLeft": { - "x": 141.74, - "y": 353.20798 - }, - "width": 260.03998, - "height": -11.358002, - "page": 48 - } - ], - "sectionNumber": 359, - "textBefore": null, - "textAfter": " A9396G containing", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563177683Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3cadc5a228f73701b1796fe667893e8f", - "type": "headline", - "value": "2.7.1 Summary of storage stability of residues", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.1 Summary of storage stability of residues", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 151.698 - }, - "width": 24, - "height": -11.357971, - "page": 48 - }, - { - "topLeft": { - "x": 141.74, - "y": 151.698 - }, - "width": 202.06801, - "height": -11.357971, - "page": 48 - } - ], - "sectionNumber": 361, - "textBefore": null, - "textAfter": " The storage", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563178003Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cf283e8ddd27945ee8ae3bafd7a0f698", - "type": "headline", - "value": "2.7 Residues", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7 Residues", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 189.49799 - }, - "width": 15, - "height": -11.357971, - "page": 48 - }, - { - "topLeft": { - "x": 141.74, - "y": 189.49799 - }, - "width": 45.37799, - "height": -11.357971, - "page": 48 - } - ], - "sectionNumber": 360, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563178333Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a30e75a63ff8ca7565e9d625104915a1", - "type": "headline", - "value": "2.7.2 Summary of metabolism, distribution and expression of residues in plants, poultry, lactating ruminants, pigs and fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 315.16797 - }, - "width": 24, - "height": -11.357971, - "page": 49 - }, - { - "topLeft": { - "x": 141.74, - "y": 315.16797 - }, - "width": 382.6681, - "height": -11.357971, - "page": 49 - }, - { - "topLeft": { - "x": 141.74, - "y": 301.36798 - }, - "width": 210.76808, - "height": -11.357971, - "page": 49 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": " The metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 123, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563178653Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "070803014a9d0185e15ab72e0b5ba639", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 372 - }, - "width": 110, - "height": 93, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563178963Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fd2c296a6e7ab65a6a812fc597f78ee7", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 274 - }, - "width": 113, - "height": 92, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563179283Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "34c48aab77378b6c8d5b6afaf6a7725a", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 558 - }, - "width": 111, - "height": 75, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563179603Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "54dbb789265108d00e10890877e46560", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 111 - }, - "width": 190, - "height": 66, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563179923Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c2054808db8bfef960745183d572952f", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 476 - }, - "width": 111, - "height": 76, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563180233Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e1721fb804bd084a9f5f3e68bcf5d60e", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 183 - }, - "width": 113, - "height": 85, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563180553Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0e905ca043281182557a4078ddbda209", - "type": "headline", - "value": "2.7.2.1 Metabolism in plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.1 Metabolism in plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 435.42798 - }, - "width": 33, - "height": -11.358002, - "page": 55 - }, - { - "topLeft": { - "x": 141.74, - "y": 435.42798 - }, - "width": 108.08397, - "height": -11.358002, - "page": 55 - } - ], - "sectionNumber": 411, - "textBefore": null, - "textAfter": " The metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563180873Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7f373a9c131dbe4c73b7840f20e6e65a", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 628 - }, - "width": 181, - "height": 93, - "page": 55 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563181183Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cab046a2c7bae57aac53f429b97d8300", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 464 - }, - "width": 113, - "height": 74, - "page": 55 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563181513Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "24f08626a1830efaa31e7ff732c71c53", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 544 - }, - "width": 181, - "height": 78, - "page": 55 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563181823Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "af1ac233706dcf1a8dd669645b1f8c7e", - "type": "headline", - "value": "2.7.2.3 Metabolism in lactating ruminants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.3 Metabolism in lactating ruminants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 378.64798 - }, - "width": 33, - "height": -11.358002, - "page": 59 - }, - { - "topLeft": { - "x": 141.74, - "y": 378.64798 - }, - "width": 177.54, - "height": -11.358002, - "page": 59 - } - ], - "sectionNumber": 413, - "textBefore": null, - "textAfter": " Although the", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563182133Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3c6e9419b9d26bdcd5ce724522de5105", - "type": "headline", - "value": "2.7.2.2 Metabolism in poultry", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.2 Metabolism in poultry", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 757.298 - }, - "width": 33, - "height": -11.358002, - "page": 59 - }, - { - "topLeft": { - "x": 141.74, - "y": 757.298 - }, - "width": 114.67796, - "height": -11.358002, - "page": 59 - } - ], - "sectionNumber": 412, - "textBefore": null, - "textAfter": " Although the", - "comments": null, - "startOffset": 0, - "endOffset": 29, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563182443Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4fb843859d387894a8df5e54b5856e76", - "type": "headline", - "value": "2.7.2.5 Metabolism in fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.5 Metabolism in fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 556.388 - }, - "width": 33, - "height": -11.358002, - "page": 60 - }, - { - "topLeft": { - "x": 141.74, - "y": 556.388 - }, - "width": 95.387985, - "height": -11.358002, - "page": 60 - } - ], - "sectionNumber": 417, - "textBefore": null, - "textAfter": " No fish", - "comments": null, - "startOffset": 0, - "endOffset": 26, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563182753Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "44633db381bbc29dcf0a24d095f149e3", - "type": "headline", - "value": "2.7.2.4 Metabolism in pigs", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.4 Metabolism in pigs", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.45795 - }, - "width": 33, - "height": -11.358002, - "page": 60 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.45795 - }, - "width": 97.35597, - "height": -11.358002, - "page": 60 - } - ], - "sectionNumber": 414, - "textBefore": null, - "textAfter": " No metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 26, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563183063Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "212b0f3a054935951f1bacff068d0129", - "type": "headline", - "value": "2.7.3.1 Definition of the residue in plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.3.1 Definition of the residue in plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 33, - "height": -11.358002, - "page": 63 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 171.04802, - "height": -11.358002, - "page": 63 - } - ], - "sectionNumber": 419, - "textBefore": null, - "textAfter": " Metabolism studies", - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563183473Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c62070b3a9c56b922be646dd5efa8ba2", - "type": "headline", - "value": "2.7.3 Definition of the residue", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 63 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 121.03801, - "height": -11.358002, - "page": 63 - } - ], - "sectionNumber": 418, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563183783Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "19822b8cb1f24e7257588dc48747a32f", - "type": "headline", - "value": "2.7.3.2 Definition of the residue in animals", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.3.2 Definition of the residue in animals", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 176.05798 - }, - "width": 33, - "height": -11.357971, - "page": 65 - }, - { - "topLeft": { - "x": 141.74, - "y": 176.05798 - }, - "width": 179.58601, - "height": -11.357971, - "page": 65 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": " The metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563184183Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9c12c120b864929cf2c00f416e538712", - "type": "headline", - "value": "2.7.4 Summary of residue trials in plants and identification of critical GAP", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.4 Summary of residue trials in plants and identification of critical GAP", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 67 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 347.67603, - "height": -11.358002, - "page": 67 - } - ], - "sectionNumber": 421, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 76, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563184493Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f6e737a97fcbd5c91b899055f9f7787c", - "type": "headline", - "value": "2.7.4.1 Sunflower seeds", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.4.1 Sunflower seeds", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 33, - "height": -11.358002, - "page": 67 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 82.247986, - "height": -11.358002, - "page": 67 - } - ], - "sectionNumber": 434, - "textBefore": null, - "textAfter": " The representative", - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563184803Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5b555228eae937601ef09625d077a2b7", - "type": "headline", - "value": "2.7.4.2 Maize", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.4.2 Maize", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 719.97797 - }, - "width": 33, - "height": -11.358002, - "page": 68 - }, - { - "topLeft": { - "x": 141.74, - "y": 719.97797 - }, - "width": 31.272003, - "height": -11.358002, - "page": 68 - } - ], - "sectionNumber": 475, - "textBefore": null, - "textAfter": " The representative", - "comments": null, - "startOffset": 0, - "endOffset": 13, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563185113Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8baf7a9ee4b4c1e06e5ce83ecf4ea493", - "type": "headline", - "value": "2.7.5 Summary of feeding studies in poultry, ruminants, pigs and fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5 Summary of feeding studies in poultry, ruminants, pigs and fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 419.70798 - }, - "width": 24, - "height": -11.358002, - "page": 69 - }, - { - "topLeft": { - "x": 141.74, - "y": 419.70798 - }, - "width": 319.47607, - "height": -11.358002, - "page": 69 - } - ], - "sectionNumber": 508, - "textBefore": null, - "textAfter": " S-metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 69, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563185423Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b3930205158eb8399f03b1a96f280500", - "type": "headline", - "value": "2.7.5.2 Ruminant", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5.2 Ruminant", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 129.85797 - }, - "width": 33, - "height": -11.357971, - "page": 70 - }, - { - "topLeft": { - "x": 141.74, - "y": 129.85797 - }, - "width": 51.971985, - "height": -11.357971, - "page": 70 - } - ], - "sectionNumber": 510, - "textBefore": null, - "textAfter": " Based on", - "comments": null, - "startOffset": 0, - "endOffset": 16, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563185743Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0a04c4f33404a3d3e3aea58f12fe11c4", - "type": "headline", - "value": "2.7.5.1 Poultry", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5.1 Poultry", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 192.25793 - }, - "width": 33, - "height": -11.357971, - "page": 70 - }, - { - "topLeft": { - "x": 141.74, - "y": 192.25793 - }, - "width": 38.507996, - "height": -11.357971, - "page": 70 - } - ], - "sectionNumber": 509, - "textBefore": null, - "textAfter": " No feeding", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563186063Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f185a6d20cbd590d248e784c13253212", - "type": "headline", - "value": "2.7.7 Summary of residues in rotational crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.7 Summary of residues in rotational crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 418.748 - }, - "width": 24, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 418.748 - }, - "width": 201.82805, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 514, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563186383Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "800e53a56bdcf2b2a4624f30cfd1cff7", - "type": "headline", - "value": "2.7.5.3 Pig", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5.3 Pig", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 656.738 - }, - "width": 33, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 656.738 - }, - "width": 16.535995, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 511, - "textBefore": null, - "textAfter": " No feeding", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563186753Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4f796debfa6e233c561eb7718eb73d8c", - "type": "headline", - "value": "2.7.6 Summary of effects of processing", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.6 Summary of effects of processing", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 531.90796 - }, - "width": 24, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 531.90796 - }, - "width": 165.84004, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 513, - "textBefore": null, - "textAfter": " No processing", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563187073Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7c806e1c91083cdf339611eb62cc5984", - "type": "headline", - "value": "2.7.7.1 Metabolism in rotational crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.7.1 Metabolism in rotational crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 380.92798 - }, - "width": 33, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 380.92798 - }, - "width": 158.208, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 515, - "textBefore": null, - "textAfter": " The uptake", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563187373Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "731b76e4d508a72fe54b07c6599bc622", - "type": "headline", - "value": "2.7.5.4 Fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5.4 Fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 594.33795 - }, - "width": 33, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 594.33795 - }, - "width": 21.875992, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 512, - "textBefore": null, - "textAfter": " No feeding", - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563187693Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "89bcfdd4caa67f8d3200a183e17f84c2", - "type": "headline", - "value": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other\nsources", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 353.44797 - }, - "width": 24, - "height": -11.358002, - "page": 72 - }, - { - "topLeft": { - "x": 141.74, - "y": 353.44797 - }, - "width": 383.07812, - "height": -11.358002, - "page": 72 - }, - { - "topLeft": { - "x": 141.74, - "y": 339.64798 - }, - "width": 37.067993, - "height": -11.358002, - "page": 72 - } - ], - "sectionNumber": 551, - "textBefore": null, - "textAfter": " The toxicological", - "comments": null, - "startOffset": 0, - "endOffset": 84, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563188013Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fe7ef8b87492606faa15212c094fe9c1", - "type": "headline", - "value": "2.7.8 Summary of other studies", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.8 Summary of other studies", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 466.50797 - }, - "width": 24, - "height": -11.358002, - "page": 72 - }, - { - "topLeft": { - "x": 141.74, - "y": 466.50797 - }, - "width": 129.708, - "height": -11.358002, - "page": 72 - } - ], - "sectionNumber": 517, - "textBefore": null, - "textAfter": " No other", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563188323Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1e847c9adcc74832c364552583051669", - "type": "headline", - "value": "2.7.7.2 Magnitude of residues in rotational crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.7.2 Magnitude of residues in rotational crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 33, - "height": -11.358002, - "page": 72 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 211.56001, - "height": -11.358002, - "page": 72 - } - ], - "sectionNumber": 516, - "textBefore": null, - "textAfter": " Two new", - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563188633Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "612cd83a0489b3e92208bed484bf0a7c", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other\nsources", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 537, - "y": 437 - }, - "width": 170, - "height": 16, - "page": 74 - } - ], - "sectionNumber": 551, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563188943Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "54fdb0d777186666added246e0df2c40", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other\nsources", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 537, - "y": 462 - }, - "width": 170, - "height": 49, - "page": 74 - } - ], - "sectionNumber": 551, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563189263Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6ed8f74d1c7df9cf6f1ef5405aba07c6", - "type": "headline", - "value": "2.7.10 Proposed MRLs and compliance with existing MRLs", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.10 Proposed MRLs and compliance with existing MRLs", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 745.298 - }, - "width": 30, - "height": -11.358002, - "page": 76 - }, - { - "topLeft": { - "x": 141.74, - "y": 745.298 - }, - "width": 265.656, - "height": -11.358002, - "page": 76 - } - ], - "sectionNumber": 557, - "textBefore": null, - "textAfter": " EU MRLs", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563189583Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5434eddd6385d5bc91dc86cfd53f821f", - "type": "headline", - "value": "2.8 Fate and behaviour in the environment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8 Fate and behaviour in the environment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 304.48798 - }, - "width": 15, - "height": -11.357971, - "page": 76 - }, - { - "topLeft": { - "x": 141.74, - "y": 304.48798 - }, - "width": 200.196, - "height": -11.357971, - "page": 76 - } - ], - "sectionNumber": 617, - "textBefore": null, - "textAfter": " Under environmental", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563189903Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32e50c8bab81d92226c0ffa9cce24101", - "type": "headline", - "value": "2.7.11 Proposed import tolerances and compliance with existing import tolerances", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.11 Proposed import tolerances and compliance with existing import tolerances", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 366.88797 - }, - "width": 30, - "height": -11.358002, - "page": 76 - }, - { - "topLeft": { - "x": 141.74, - "y": 366.88797 - }, - "width": 378.45605, - "height": -11.358002, - "page": 76 - } - ], - "sectionNumber": 558, - "textBefore": null, - "textAfter": " Not applicable.", - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563190233Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8b3487b08688941a85085fff2209e592", - "type": "headline", - "value": "2.8.1 Summary of fate and behaviour in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.1 Summary of fate and behaviour in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 372.88797 - }, - "width": 24, - "height": -11.358002, - "page": 87 - }, - { - "topLeft": { - "x": 141.74, - "y": 372.88797 - }, - "width": 196.416, - "height": -11.358002, - "page": 87 - } - ], - "sectionNumber": 869, - "textBefore": null, - "textAfter": " Appendix 1", - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563190553Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7c115101880924cabe5e83d0b7b48956", - "type": "headline", - "value": "2.8.1.1 Adsorption and desorption in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.1.1 Adsorption and desorption in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 381.76797 - }, - "width": 33, - "height": -11.358002, - "page": 102 - }, - { - "topLeft": { - "x": 141.74, - "y": 381.76797 - }, - "width": 171.34795, - "height": -11.358002, - "page": 102 - } - ], - "sectionNumber": 981, - "textBefore": null, - "textAfter": " Already during", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563190893Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bacecef5b3b4cfe05cc485fee56c2961", - "type": "headline", - "value": "2.8.1.2 Mobility in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.1.2 Mobility in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 659.378 - }, - "width": 33, - "height": -11.358002, - "page": 106 - }, - { - "topLeft": { - "x": 141.74, - "y": 659.378 - }, - "width": 77.44798, - "height": -11.358002, - "page": 106 - } - ], - "sectionNumber": 1044, - "textBefore": null, - "textAfter": " Column leaching", - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563191243Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9a400fc875e5ef5c37cd2d8f28cfbad4", - "type": "headline", - "value": "2.8.2 Summary of fate and behaviour in water and sediment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.2 Summary of fate and behaviour in water and sediment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 404.44797 - }, - "width": 24, - "height": -11.358002, - "page": 114 - }, - { - "topLeft": { - "x": 141.74, - "y": 404.44797 - }, - "width": 274.47607, - "height": -11.358002, - "page": 114 - } - ], - "sectionNumber": 1065, - "textBefore": null, - "textAfter": " Route and", - "comments": null, - "startOffset": 0, - "endOffset": 57, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563191573Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "94be1bcdfbfed7fb943549db5d1f57b2", - "type": "headline", - "value": "2.8.3 Summary of fate and behaviour in air", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.3 Summary of fate and behaviour in air", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 291.64795 - }, - "width": 24, - "height": -11.357971, - "page": 116 - }, - { - "topLeft": { - "x": 141.74, - "y": 291.64795 - }, - "width": 190.22404, - "height": -11.357971, - "page": 116 - } - ], - "sectionNumber": 1066, - "textBefore": null, - "textAfter": " S-metolachlor has", - "comments": null, - "startOffset": 0, - "endOffset": 42, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563191913Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1384ffc50f68c59a7577882d8eb711b3", - "type": "headline", - "value": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active substance, metabolites, degradation and reaction products", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active\nsubstance, metabolites, degradation and reaction products", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 694.77795 - }, - "width": 24, - "height": -11.358002, - "page": 117 - }, - { - "topLeft": { - "x": 141.74, - "y": 694.77795 - }, - "width": 382.5722, - "height": -11.358002, - "page": 117 - }, - { - "topLeft": { - "x": 141.74, - "y": 680.97797 - }, - "width": 292.1881, - "height": -11.358002, - "page": 117 - } - ], - "sectionNumber": 1067, - "textBefore": null, - "textAfter": " As highest", - "comments": null, - "startOffset": 0, - "endOffset": 134, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563192223Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "677e2ef415b66fb9c7b128a61b72bebc", - "type": "headline", - "value": "2.8.5 Definition of the residues in the environment requiring further assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.5 Definition of the residues in the environment requiring further assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 359.80798 - }, - "width": 24, - "height": -11.358002, - "page": 118 - }, - { - "topLeft": { - "x": 141.74, - "y": 359.80798 - }, - "width": 371.52008, - "height": -11.358002, - "page": 118 - } - ], - "sectionNumber": 1068, - "textBefore": null, - "textAfter": " Soil: CGA40172,", - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563192543Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0deab01d4f6c0fc33537f618b806d619", - "type": "headline", - "value": "2.8.6 Summary of exposure calculations and product assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6 Summary of exposure calculations and product assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 119 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 295.45203, - "height": -11.358002, - "page": 119 - } - ], - "sectionNumber": 1069, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563192973Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "51970df3b3ead9780d8c185e2f8f20a9", - "type": "headline", - "value": "2.8.6.1 PECsoil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.1 PECsoil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 33, - "height": -11.358002, - "page": 119 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 35.61624, - "height": -11.838043, - "page": 119 - } - ], - "sectionNumber": 1123, - "textBefore": null, - "textAfter": " The PECsoil", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563193403Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8b2c39d740ebf0430f8099469959e69d", - "type": "headline", - "value": "2.8.6.2 PECgroundwater", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.2 PECgroundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 228.40796 - }, - "width": 33, - "height": -11.357971, - "page": 121 - }, - { - "topLeft": { - "x": 141.74, - "y": 228.40796 - }, - "width": 68.46768, - "height": -11.837952, - "page": 121 - } - ], - "sectionNumber": 1258, - "textBefore": null, - "textAfter": " The notifier", - "comments": null, - "startOffset": 0, - "endOffset": 22, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563193823Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9e61158743d7b50e62f502e874680482", - "type": "headline", - "value": "2.8.6.3 PECsurface water and PECsediment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.3 PECsurface water and PECsediment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 536.948 - }, - "width": 33, - "height": -11.358002, - "page": 126 - }, - { - "topLeft": { - "x": 141.74, - "y": 536.948 - }, - "width": 70.493774, - "height": -11.838043, - "page": 126 - }, - { - "topLeft": { - "x": 215.33, - "y": 536.948 - }, - "width": 76.824356, - "height": -11.838043, - "page": 126 - } - ], - "sectionNumber": 1285, - "textBefore": null, - "textAfter": " Predicted environmental", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563194143Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6626c0eeb86da67ec686f059f1943cdb", - "type": "headline", - "value": "2.8.6.5 PEC from other routes of exposure", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.5 PEC from other routes of exposure", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 477.54797 - }, - "width": 33, - "height": -11.358002, - "page": 127 - }, - { - "topLeft": { - "x": 141.74, - "y": 477.54797 - }, - "width": 179.58, - "height": -11.358002, - "page": 127 - } - ], - "sectionNumber": 1287, - "textBefore": null, - "textAfter": " No other", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563194473Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "253c1a7156f14a9ee1b27066dd57444c", - "type": "headline", - "value": "2.8.6.4 PECair", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.4 PECair", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 590.618 - }, - "width": 33, - "height": -11.358002, - "page": 127 - }, - { - "topLeft": { - "x": 141.74, - "y": 590.618 - }, - "width": 33.82332, - "height": -11.837982, - "page": 127 - } - ], - "sectionNumber": 1286, - "textBefore": null, - "textAfter": " S-metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563194813Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "21fab5640f3c4adc60a9cd36418257e5", - "type": "headline", - "value": "2.9.1 Summary of effects on birds and other terrestrial vertebrates", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1 Summary of effects on birds and other terrestrial vertebrates", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 364.60797 - }, - "width": 24, - "height": -11.358002, - "page": 127 - }, - { - "topLeft": { - "x": 141.74, - "y": 364.60797 - }, - "width": 312.552, - "height": -11.358002, - "page": 127 - } - ], - "sectionNumber": 1310, - "textBefore": null, - "textAfter": " Two new", - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563195203Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ad2d9af3225d1db7d2b3d3d2b7a6d423", - "type": "headline", - "value": "2.9 Effects on non-target species", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9 Effects on non-target species", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 402.40796 - }, - "width": 15, - "height": -11.358002, - "page": 127 - }, - { - "topLeft": { - "x": 141.74, - "y": 402.40796 - }, - "width": 146.20201, - "height": -11.358002, - "page": 127 - } - ], - "sectionNumber": 1288, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 33, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563195523Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "362c096c2284c31a52f965d9906f96a1", - "type": "headline", - "value": "2.9.2 Summary of effects on aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2 Summary of effects on aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 593.498 - }, - "width": 24, - "height": -11.358002, - "page": 130 - }, - { - "topLeft": { - "x": 141.74, - "y": 593.498 - }, - "width": 211.45204, - "height": -11.358002, - "page": 130 - } - ], - "sectionNumber": 1363, - "textBefore": null, - "textAfter": " Based on", - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563195863Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e90e3bce3c0c6b0d4a90758cb27338c0", - "type": "headline", - "value": "2.9.3 Summary of effects on arthropods", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.3 Summary of effects on arthropods", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 322.00793 - }, - "width": 24, - "height": -11.357971, - "page": 133 - }, - { - "topLeft": { - "x": 141.74, - "y": 322.00793 - }, - "width": 175.06203, - "height": -11.357971, - "page": 133 - } - ], - "sectionNumber": 1382, - "textBefore": null, - "textAfter": " Honey bees", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563196173Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "981012c7d164f63b78ea78729212bb6d", - "type": "headline", - "value": "2.9.4 Summary of effects on non-target soil meso- and macrofauna", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.4 Summary of effects on non-target soil meso- and macrofauna", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 526.02795 - }, - "width": 24, - "height": -11.358002, - "page": 135 - }, - { - "topLeft": { - "x": 141.74, - "y": 526.02795 - }, - "width": 312.44604, - "height": -11.358002, - "page": 135 - } - ], - "sectionNumber": 1383, - "textBefore": null, - "textAfter": " Studies regarding", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563196483Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aaec0717bb4315d7c337579b020359d9", - "type": "headline", - "value": "2.9.5 Summary of effects on earthworms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.5 Summary of effects on earthworms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 362.44797 - }, - "width": 24, - "height": -11.358002, - "page": 135 - }, - { - "topLeft": { - "x": 141.74, - "y": 362.44797 - }, - "width": 179.78404, - "height": -11.358002, - "page": 135 - } - ], - "sectionNumber": 1400, - "textBefore": null, - "textAfter": " The applicant", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563196803Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6167e6efcfd104aec24d70373f529d7f", - "type": "headline", - "value": "2.9.6 Summary of effects on other non-target soil meso- and macrofauna", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.6 Summary of effects on other non-target soil meso- and macrofauna", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 674.858 - }, - "width": 24, - "height": -11.358002, - "page": 137 - }, - { - "topLeft": { - "x": 141.74, - "y": 674.858 - }, - "width": 342.60803, - "height": -11.358002, - "page": 137 - } - ], - "sectionNumber": 1422, - "textBefore": null, - "textAfter": " Table 2.9-7:", - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563197103Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "34270d0c3376f1ad531923b9a10216e6", - "type": "headline", - "value": "2.9.7 Summary of effects on soil nitrogen transformation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.7 Summary of effects on soil nitrogen transformation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 488.82797 - }, - "width": 24, - "height": -11.358002, - "page": 138 - }, - { - "topLeft": { - "x": 141.74, - "y": 488.82797 - }, - "width": 262.26007, - "height": -11.358002, - "page": 138 - } - ], - "sectionNumber": 1435, - "textBefore": null, - "textAfter": " Table 2.9-8:", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563197423Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "611dc04d3f650c26b0a14db9f98e629d", - "type": "headline", - "value": "2.9.8 Summary of effects on terrestrial non-target higher plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.8 Summary of effects on terrestrial non-target higher plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 139 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 297.13397, - "height": -11.358002, - "page": 139 - } - ], - "sectionNumber": 1446, - "textBefore": null, - "textAfter": " Table 2.9-9:", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563197733Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d63e1461e774e394747033fbd61ce65b", - "type": "headline", - "value": "2.9.10 Summary of effects on biological methods for sewage treatment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.10 Summary of effects on biological methods for sewage treatment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 108.62195 - }, - "width": 30, - "height": -11.357971, - "page": 140 - }, - { - "topLeft": { - "x": 141.74, - "y": 108.62195 - }, - "width": 323.88007, - "height": -11.357971, - "page": 140 - } - ], - "sectionNumber": 1448, - "textBefore": null, - "textAfter": " No new", - "comments": null, - "startOffset": 0, - "endOffset": 68, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563198053Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "65576f4b63e78b6f968bb289cc3e78d9", - "type": "headline", - "value": "2.9.9 Summary of effects on other terrestrial organisms (flora and fauna)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9 Summary of effects on other terrestrial organisms (flora and fauna)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 171.13794 - }, - "width": 24, - "height": -11.357971, - "page": 140 - }, - { - "topLeft": { - "x": 141.74, - "y": 171.13794 - }, - "width": 345.80408, - "height": -11.357971, - "page": 140 - } - ], - "sectionNumber": 1447, - "textBefore": null, - "textAfter": " Not relevant.", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563198363Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3fbab2e5f5d973ed05ff9e7cda200c75", - "type": "headline", - "value": "2.9.11 Summary of product exposure and risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11 Summary of product exposure and risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 656.738 - }, - "width": 30, - "height": -11.358002, - "page": 141 - }, - { - "topLeft": { - "x": 141.74, - "y": 656.738 - }, - "width": 260.03998, - "height": -11.358002, - "page": 141 - } - ], - "sectionNumber": 1530, - "textBefore": null, - "textAfter": " Birds Table", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563198683Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5ba17fea08c6c097858ac35b2214dc70", - "type": "headline", - "value": "2.9.11.1 Summary of the risk assessment for aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.1 Summary of the risk assessment for aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 39, - "height": -11.358002, - "page": 148 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 279.71002, - "height": -11.358002, - "page": 148 - } - ], - "sectionNumber": 1650, - "textBefore": null, - "textAfter": " Risk assessment", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563198993Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4f3563bd975361b1c6150cdde53fc5c5", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.9.11.1 Summary of the risk assessment for aquatic organisms", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 442, - "y": 308 - }, - "width": 57, - "height": 43, - "page": 154 - } - ], - "sectionNumber": 1650, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563199303Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f7453422046b8fbe49e0c566e3a04aba", - "type": "headline", - "value": "2.9.11.2 Summary of the risk assessment for non-target arthropods", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.2 Summary of the risk assessment for non-target arthropods", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 39, - "height": -11.358002, - "page": 155 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 300.404, - "height": -11.358002, - "page": 155 - } - ], - "sectionNumber": 1675, - "textBefore": null, - "textAfter": " Procedures for", - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563199803Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b1523cf0176042207b2b9a8bdddc6dee", - "type": "headline", - "value": "2.9.11.3 Summary of the risk assessment for non-target soil meso- and macrofauna", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.3 Summary of the risk assessment for non-target soil meso- and macrofauna", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 615.33795 - }, - "width": 39, - "height": -11.358002, - "page": 157 - }, - { - "topLeft": { - "x": 141.74, - "y": 615.33795 - }, - "width": 380.75604, - "height": -11.358002, - "page": 157 - } - ], - "sectionNumber": 1800, - "textBefore": null, - "textAfter": " Summary of", - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563200123Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "83c54c76fae2e0cf4b184f667b94e02d", - "type": "headline", - "value": "2.9.11.4 Summary of the risk assessment for soil nitrogen transformation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.4 Summary of the risk assessment for soil nitrogen transformation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 234.76794 - }, - "width": 39, - "height": -11.357971, - "page": 161 - }, - { - "topLeft": { - "x": 141.74, - "y": 234.76794 - }, - "width": 330.528, - "height": -11.357971, - "page": 161 - } - ], - "sectionNumber": 1815, - "textBefore": null, - "textAfter": " Table 2.9-27:", - "comments": null, - "startOffset": 0, - "endOffset": 72, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563200423Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d34a7a742be7146773d5644c0a77c236", - "type": "headline", - "value": "2.9.11.5 Summary of the risk assessment for non-target terrestrial plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.5 Summary of the risk assessment for non-target terrestrial plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 465.42798 - }, - "width": 39, - "height": -11.358002, - "page": 162 - }, - { - "topLeft": { - "x": 141.74, - "y": 465.42798 - }, - "width": 329.294, - "height": -11.358002, - "page": 162 - } - ], - "sectionNumber": 1903, - "textBefore": null, - "textAfter": " Seedling emergence", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563200753Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2e84740933ae6d5156dc5145c5a0d142", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.9.11.5 Summary of the risk assessment for non-target terrestrial plants", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 71, - "y": 318 - }, - "width": 453, - "height": 453, - "page": 165 - } - ], - "sectionNumber": 1903, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563201073Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5d8ad2646713f6c4f497a7a6a4189a66", - "type": "headline", - "value": "2.10 Classification and labelling", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.10 Classification and labelling", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 21, - "height": -11.358002, - "page": 167 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 138.63597, - "height": -11.358002, - "page": 167 - } - ], - "sectionNumber": 1939, - "textBefore": null, - "textAfter": " Table 2.10-1:", - "comments": null, - "startOffset": 0, - "endOffset": 33, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563201383Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3ec099478e08c1a3d39d913ee3fe760a", - "type": "headline", - "value": "A9396G", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "A9396G", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 204.04321 - }, - "width": 36.796303, - "height": -11.023193, - "page": 168 - } - ], - "sectionNumber": 1958, - "textBefore": null, - "textAfter": " According to", - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563201713Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:08:24.320061Z", - "requestedDate": "2022-10-10T12:08:24.297899Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d41985615b698122933103b7b735ed83", - "type": "headline", - "value": "2.11.1 STEP 1: Exclusion of degradation products of no concern", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.1 STEP 1: Exclusion of degradation products of no concern", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 30, - "height": -11.358002, - "page": 170 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 293.54407, - "height": -11.358002, - "page": 170 - } - ], - "sectionNumber": 1986, - "textBefore": null, - "textAfter": " Residues of", - "comments": null, - "startOffset": 0, - "endOffset": 62, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563202103Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fdd9814b878f3709c03c9c1722ad5a50", - "type": "headline", - "value": "2.11 Relevance of metabolites in groundwater", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11 Relevance of metabolites in groundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 21, - "height": -11.358002, - "page": 170 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 209.21999, - "height": -11.358002, - "page": 170 - } - ], - "sectionNumber": 1959, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563202413Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "39e58b3f566bace9e3fc750ae39466c8", - "type": "headline", - "value": "2.11.2 STEP 2: Quantification of potential groundwater contamination", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.2 STEP 2: Quantification of potential groundwater contamination", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 519.068 - }, - "width": 30, - "height": -11.358002, - "page": 173 - }, - { - "topLeft": { - "x": 141.74, - "y": 519.068 - }, - "width": 327.26404, - "height": -11.358002, - "page": 173 - } - ], - "sectionNumber": 2014, - "textBefore": null, - "textAfter": " The results", - "comments": null, - "startOffset": 0, - "endOffset": 68, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563202723Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a7df378f69a2149383cb7ce42fb68321", - "type": "headline", - "value": "2.11.3 STEP 3: Hazard assessment - identification of relevant metabolites", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3 STEP 3: Hazard assessment - identification of relevant metabolites", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 30, - "height": -11.358002, - "page": 175 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 340.274, - "height": -11.358002, - "page": 175 - } - ], - "sectionNumber": 2040, - "textBefore": null, - "textAfter": " In accordance", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563203033Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0041c21c1f9c572d6d7a11ade94c8801", - "type": "headline", - "value": "2.11.3.1 STEP 3, Stage 1: Screening for biological activity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.1 STEP 3, Stage 1: Screening for biological activity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 552.78796 - }, - "width": 39, - "height": -11.358002, - "page": 176 - }, - { - "topLeft": { - "x": 141.74, - "y": 552.78796 - }, - "width": 251.23802, - "height": -11.358002, - "page": 176 - } - ], - "sectionNumber": 2062, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 59, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563203343Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7f0d27dfaaef865f0297f70dfa183142", - "type": "headline", - "value": "2.11.3.2 STEP 3, Stage 2: Screening for genotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.2 STEP 3, Stage 2: Screening for genotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 180.61798 - }, - "width": 39, - "height": -11.357971, - "page": 178 - }, - { - "topLeft": { - "x": 141.74, - "y": 180.61798 - }, - "width": 222.93001, - "height": -11.357971, - "page": 178 - } - ], - "sectionNumber": 2063, - "textBefore": null, - "textAfter": " According to", - "comments": null, - "startOffset": 0, - "endOffset": 52, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563203643Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "81f22a6369b5521c0a07ab3fc5cae27a", - "type": "headline", - "value": "2.11.3.3 STEP 3, Stage 3: Screening for toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.3 STEP 3, Stage 3: Screening for toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 492.30798 - }, - "width": 39, - "height": -11.358002, - "page": 179 - }, - { - "topLeft": { - "x": 141.74, - "y": 492.30798 - }, - "width": 198.942, - "height": -11.358002, - "page": 179 - } - ], - "sectionNumber": 2064, - "textBefore": null, - "textAfter": " Currently, the", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563203963Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f1b4bf1444120abf7654065d0b0a9308", - "type": "headline", - "value": "2.11.4 STEP 4: Exposure assessment – threshold of concern approach", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.4 STEP 4: Exposure assessment – threshold of concern approach", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 252.76794 - }, - "width": 30, - "height": -11.357971, - "page": 179 - }, - { - "topLeft": { - "x": 141.74, - "y": 252.76794 - }, - "width": 321.278, - "height": -11.357971, - "page": 179 - } - ], - "sectionNumber": 2065, - "textBefore": null, - "textAfter": " Based on", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563204263Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "97031e10e22462a22fc8b582f18be066", - "type": "headline", - "value": "2.11.5 STEP 5: Refined risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.5 STEP 5: Refined risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 30, - "height": -11.358002, - "page": 180 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 167.286, - "height": -11.358002, - "page": 180 - } - ], - "sectionNumber": 2142, - "textBefore": null, - "textAfter": " In case", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563204573Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "80ba317ee483de5fb4b2fdd43f4e37f0", - "type": "headline", - "value": "2.12.1 Identity and physical chemical properties", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.1 Identity and physical chemical properties", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 305.568 - }, - "width": 30, - "height": -11.357971, - "page": 183 - }, - { - "topLeft": { - "x": 141.74, - "y": 305.568 - }, - "width": 211.65001, - "height": -11.357971, - "page": 183 - } - ], - "sectionNumber": 2149, - "textBefore": null, - "textAfter": " S-Metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563204883Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cb02f4183de3509e6d173f3c5b52824a", - "type": "headline", - "value": "2.11.6 Overall conclusion", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.6 Overall conclusion", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 672.33795 - }, - "width": 30, - "height": -11.358002, - "page": 183 - }, - { - "topLeft": { - "x": 141.74, - "y": 672.33795 - }, - "width": 95.693985, - "height": -11.358002, - "page": 183 - } - ], - "sectionNumber": 2143, - "textBefore": null, - "textAfter": " Currently, the", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563205223Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8f166ece9ca6fef64e03eca64f9f4d87", - "type": "headline", - "value": "2.12 Consideration of isomeric composition in the risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12 Consideration of isomeric composition in the risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 343.36798 - }, - "width": 21, - "height": -11.357971, - "page": 183 - }, - { - "topLeft": { - "x": 141.74, - "y": 343.36798 - }, - "width": 310.716, - "height": -11.357971, - "page": 183 - } - ], - "sectionNumber": 2144, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563205553Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0a41f8e9ba051aef7391ec7800efb868", - "type": "headline", - "value": "2.12.3 Mammalian toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.3 Mammalian toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 371.92798 - }, - "width": 30, - "height": -11.358002, - "page": 184 - }, - { - "topLeft": { - "x": 141.74, - "y": 371.92798 - }, - "width": 103.535995, - "height": -11.358002, - "page": 184 - } - ], - "sectionNumber": 2151, - "textBefore": null, - "textAfter": " Applicant’s statement", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563205873Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1f235fcc7a3955ce00e6b896d1f6b744", - "type": "headline", - "value": "2.12.2 Methods of analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.2 Methods of analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 447.06796 - }, - "width": 30, - "height": -11.358002, - "page": 184 - }, - { - "topLeft": { - "x": 141.74, - "y": 447.06796 - }, - "width": 101.45999, - "height": -11.358002, - "page": 184 - } - ], - "sectionNumber": 2150, - "textBefore": null, - "textAfter": " Validated chiral", - "comments": null, - "startOffset": 0, - "endOffset": 26, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563206183Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5981c92025cede48ffe581be65a22509", - "type": "headline", - "value": "2.12.5 Residues and consumer risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.5 Residues and consumer risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 173.29797 - }, - "width": 30, - "height": -11.357971, - "page": 185 - }, - { - "topLeft": { - "x": 141.74, - "y": 173.29797 - }, - "width": 202.33797, - "height": -11.357971, - "page": 185 - } - ], - "sectionNumber": 2153, - "textBefore": null, - "textAfter": " S-metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563206543Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c227eb9f2550c26ddb8c4f2aea05771a", - "type": "headline", - "value": "2.12.4 Operator, worker, bystander and resident exposure", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.4 Operator, worker, bystander and resident exposure", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 273.76794 - }, - "width": 30, - "height": -11.357971, - "page": 185 - }, - { - "topLeft": { - "x": 141.74, - "y": 273.76794 - }, - "width": 261.40997, - "height": -11.357971, - "page": 185 - } - ], - "sectionNumber": 2152, - "textBefore": null, - "textAfter": " Metolachlor and", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563206863Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9fa6920641a0ec9db3370ec5d9f4bae8", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.12.3 Mammalian toxicity", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 93, - "y": 374 - }, - "width": 409, - "height": 121, - "page": 185 - } - ], - "sectionNumber": 2151, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563207183Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d5131736c77fde500c224107d0eb7390", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.12.3 Mammalian toxicity", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 158, - "y": 538 - }, - "width": 279, - "height": 233, - "page": 185 - } - ], - "sectionNumber": 2151, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563207493Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9a29eb1aedb61420dbb835defc5e5407", - "type": "headline", - "value": "2.13.1 Definition of residues for exposure/risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13.1 Definition of residues for exposure/risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 380.20798 - }, - "width": 30, - "height": -11.358002, - "page": 186 - }, - { - "topLeft": { - "x": 141.74, - "y": 380.20798 - }, - "width": 258.25208, - "height": -11.358002, - "page": 186 - } - ], - "sectionNumber": 2157, - "textBefore": null, - "textAfter": " Food of", - "comments": null, - "startOffset": 0, - "endOffset": 58, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563207813Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2f0c2eab1eea7384ef857e5a5160a370", - "type": "headline", - "value": "2.12.7 Ecotoxicology", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.7 Ecotoxicology", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 568.988 - }, - "width": 30, - "height": -11.358002, - "page": 186 - }, - { - "topLeft": { - "x": 141.74, - "y": 568.988 - }, - "width": 71.244, - "height": -11.358002, - "page": 186 - } - ], - "sectionNumber": 2155, - "textBefore": null, - "textAfter": " Metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 20, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563208123Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "15c18f41673efe1eec3a2a19c9662cfc", - "type": "headline", - "value": "2.13 Residue definitions", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13 Residue definitions", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 418.02798 - }, - "width": 21, - "height": -11.358002, - "page": 186 - }, - { - "topLeft": { - "x": 141.74, - "y": 418.02798 - }, - "width": 97.72798, - "height": -11.358002, - "page": 186 - } - ], - "sectionNumber": 2156, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563208443Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4b5c453f832ab04e4b22d7ff693475bc", - "type": "headline", - "value": "2.12.6 Environmental fate", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.6 Environmental fate", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 682.058 - }, - "width": 30, - "height": -11.358002, - "page": 186 - }, - { - "topLeft": { - "x": 141.74, - "y": 682.058 - }, - "width": 99.38397, - "height": -11.358002, - "page": 186 - } - ], - "sectionNumber": 2154, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563208753Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0295c503e3334dac2cde73fe9a842444", - "type": "headline", - "value": "2.13.2 Definition of residues for monitoring", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13.2 Definition of residues for monitoring", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 30, - "height": -11.358002, - "page": 187 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 187.44005, - "height": -11.358002, - "page": 187 - } - ], - "sectionNumber": 2160, - "textBefore": null, - "textAfter": " Food of", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563209063Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "265eb3cd7850b4c2d3e8b449b11aec6e", - "type": "headline", - "value": "3.1.1 Proposal on acceptability against the decision making criteria – Article 4 and annex II of regulation (EC) No 1107/2009", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.1 Proposal on acceptability against the decision making criteria – Article 4 and annex II of regulation (EC) No 1107/2009", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 420.78796 - }, - "width": 24, - "height": -11.358002, - "page": 189 - }, - { - "topLeft": { - "x": 141.74, - "y": 420.78796 - }, - "width": 606.29004, - "height": -11.358002, - "page": 189 - } - ], - "sectionNumber": 2266, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 125, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563209403Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "841a620ba203b976d682c63176cb53ef", - "type": "headline", - "value": "3 Proposed decision with respect to the application", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3 Proposed decision with respect to the application", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 497.68887 - }, - "width": 7.0199966, - "height": -12.26886, - "page": 189 - }, - { - "topLeft": { - "x": 141.74, - "y": 497.68887 - }, - "width": 291.61176, - "height": -12.26886, - "page": 189 - } - ], - "sectionNumber": 2161, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563209713Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "11f1d2c57cfde5b61c5886179c5e225a", - "type": "headline", - "value": "3.1 Background to the proposed decision", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1 Background to the proposed decision", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 458.61798 - }, - "width": 15, - "height": -11.358002, - "page": 189 - }, - { - "topLeft": { - "x": 141.74, - "y": 458.61798 - }, - "width": 190.01997, - "height": -11.358002, - "page": 189 - } - ], - "sectionNumber": 2162, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 39, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563210063Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "20275ba329daea4fb4f90174119ef462", - "type": "headline", - "value": "3.1.2 Proposal – Candidate for substitution", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.2 Proposal – Candidate for substitution", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 522.698 - }, - "width": 24, - "height": -11.358002, - "page": 205 - }, - { - "topLeft": { - "x": 141.74, - "y": 522.698 - }, - "width": 192.26399, - "height": -11.358002, - "page": 205 - } - ], - "sectionNumber": 2271, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563210373Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c09611174f28ad5adfc3f0d1fe47a48e", - "type": "headline", - "value": "3.1.3 Proposal – Low risk active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.3 Proposal – Low risk active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 241.84796 - }, - "width": 24, - "height": -11.358002, - "page": 205 - }, - { - "topLeft": { - "x": 141.74, - "y": 241.84796 - }, - "width": 188.78398, - "height": -11.358002, - "page": 205 - } - ], - "sectionNumber": 2278, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 42, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563210683Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "087222e0c5ecb423bae2cf61256d02e8", - "type": "headline", - "value": "3.1.4 List of studies to be generated, still ongoing or available but not peer reviewed", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.4 List of studies to be generated, still ongoing or available but not peer reviewed", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 383.82797 - }, - "width": 24, - "height": -11.358002, - "page": 206 - }, - { - "topLeft": { - "x": 141.74, - "y": 383.82797 - }, - "width": 398.4721, - "height": -11.358002, - "page": 206 - } - ], - "sectionNumber": 2328, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 87, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563211003Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c2501e9fbf417b1910d981cad29d66ec", - "type": "headline", - "value": "3.1.5 Issues that could not be finalised", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.5 Issues that could not be finalised", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 745.298 - }, - "width": 24, - "height": -11.358002, - "page": 212 - }, - { - "topLeft": { - "x": 141.74, - "y": 745.298 - }, - "width": 166.442, - "height": -11.358002, - "page": 212 - } - ], - "sectionNumber": 2336, - "textBefore": null, - "textAfter": " An issue", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563211323Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9653cefd45fd33427d690962157f1132", - "type": "headline", - "value": "3.1.6 Critical areas of concern", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.6 Critical areas of concern", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 306.16797 - }, - "width": 24, - "height": -11.357971, - "page": 212 - }, - { - "topLeft": { - "x": 141.74, - "y": 306.16797 - }, - "width": 126.07799, - "height": -11.357971, - "page": 212 - } - ], - "sectionNumber": 2345, - "textBefore": null, - "textAfter": " An issue", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563211633Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4bded3cb277df8f0caa656bc304c950b", - "type": "headline", - "value": "3.1.7 Overview table of the concerns identified for each representative use considered", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.7 Overview table of the concerns identified for each representative use\nconsidered", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 210.61798 - }, - "width": 24, - "height": -11.357971, - "page": 213 - }, - { - "topLeft": { - "x": 141.74, - "y": 210.61798 - }, - "width": 382.80408, - "height": -11.357971, - "page": 213 - }, - { - "topLeft": { - "x": 141.74, - "y": 196.818 - }, - "width": 55.007996, - "height": -11.357971, - "page": 213 - } - ], - "sectionNumber": 2369, - "textBefore": null, - "textAfter": " (If a", - "comments": null, - "startOffset": 0, - "endOffset": 86, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563211963Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6043426e215a7cd9736b120d134c0203", - "type": "headline", - "value": "3.1.8 Area(s) where expert consultation is considered necessary", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.8 Area(s) where expert consultation is considered necessary", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 134.29797 - }, - "width": 24, - "height": -11.357971, - "page": 214 - }, - { - "topLeft": { - "x": 141.74, - "y": 134.29797 - }, - "width": 294.36, - "height": -11.357971, - "page": 214 - } - ], - "sectionNumber": 2376, - "textBefore": null, - "textAfter": " It is", - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563212273Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "726f56586e4b1a40f1abd5f5eec467b1", - "type": "headline", - "value": "3.1.9 Critical issues on which the Co RMS did not agree with the assessment by the RMS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.9 Critical issues on which the Co RMS did not agree with the assessment by\nthe RMS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 324.28796 - }, - "width": 24, - "height": -11.357971, - "page": 215 - }, - { - "topLeft": { - "x": 141.74, - "y": 324.28796 - }, - "width": 382.42194, - "height": -11.357971, - "page": 215 - }, - { - "topLeft": { - "x": 141.74, - "y": 310.48798 - }, - "width": 45.552002, - "height": -11.357971, - "page": 215 - } - ], - "sectionNumber": 2381, - "textBefore": null, - "textAfter": " Points on", - "comments": null, - "startOffset": 0, - "endOffset": 86, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563212603Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "86c01122d9f68c9038f90842729c5fcc", - "type": "headline", - "value": "3.2 Proposed decision", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.2 Proposed decision", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 15, - "height": -11.358002, - "page": 216 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 92.183975, - "height": -11.358002, - "page": 216 - } - ], - "sectionNumber": 2382, - "textBefore": null, - "textAfter": " It is", - "comments": null, - "startOffset": 0, - "endOffset": 21, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563212993Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "868ff7723d3760b43b074132bf6f68b0", - "type": "headline", - "value": "3.3.1 Particular conditions proposed to be taken into account to manage the risk identified", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3.1 Particular conditions proposed to be taken into account to manage the risk\nidentified", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 717.698 - }, - "width": 24, - "height": -11.358002, - "page": 217 - }, - { - "topLeft": { - "x": 141.74, - "y": 717.698 - }, - "width": 382.53802, - "height": -11.358002, - "page": 217 - }, - { - "topLeft": { - "x": 141.74, - "y": 703.89795 - }, - "width": 48.779984, - "height": -11.358002, - "page": 217 - } - ], - "sectionNumber": 2387, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 91, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563213332Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "75687a1e1cca8a300401ca932f27a3ce", - "type": "headline", - "value": "3.3 Rational for the conditions and restrictions to be associated with the approval or authorisation(s), as appropriate", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3 Rational for the conditions and restrictions to be associated with the approval or authorisation(s), as appropriate", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 15, - "height": -11.358002, - "page": 217 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 382.81598, - "height": -11.358002, - "page": 217 - }, - { - "topLeft": { - "x": 141.74, - "y": 755.498 - }, - "width": 213.00002, - "height": -11.358002, - "page": 217 - } - ], - "sectionNumber": 2383, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 119, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563213652Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "38ffc7f82578eac69f3be152de2e7976", - "type": "headline", - "value": "3.4 Appendices", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4 Appendices", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 745.298 - }, - "width": 15, - "height": -11.358002, - "page": 218 - }, - { - "topLeft": { - "x": 141.74, - "y": 745.298 - }, - "width": 59.351974, - "height": -11.358002, - "page": 218 - } - ], - "sectionNumber": 2388, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563213982Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f63c688eaec21258ee12af7bc9d74eb3", - "type": "headline", - "value": "3.4.1 Guidance documents used in this assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.1 Guidance documents used in this assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 707.498 - }, - "width": 24, - "height": -11.358002, - "page": 218 - }, - { - "topLeft": { - "x": 141.74, - "y": 707.498 - }, - "width": 227.54396, - "height": -11.358002, - "page": 218 - } - ], - "sectionNumber": 2389, - "textBefore": null, - "textAfter": " [List of", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563214282Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f07933aff85a833efe551b8982b6c68d", - "type": "headline", - "value": "3.4.2 Reference list", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.2 Reference list", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 56.64, - "y": 498.69797 - }, - "width": 24, - "height": -11.358002, - "page": 221 - }, - { - "topLeft": { - "x": 127.46, - "y": 498.69797 - }, - "width": 69.33599, - "height": -11.358002, - "page": 221 - } - ], - "sectionNumber": 2396, - "textBefore": null, - "textAfter": " List [in", - "comments": null, - "startOffset": 0, - "endOffset": 20, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563214622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "22f1459e4accc52632b539aee0ec4ee1", - "type": "manual", - "value": "Version history", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 244.97, - "y": 746.73865 - }, - "width": 105.19412, - "height": 14.251781, - "page": 2 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:03:35.346Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:03:35.346Z", - "requestedDate": "2022-10-10T12:03:35.346Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8966dc2ae00a975a1063dbfb901589be", - "type": "manual", - "value": "Level 2", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 242.21, - "y": 477.0675 - }, - "width": 110.88, - "height": 32.146873, - "page": 18 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:05:17.621Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:05:17.621Z", - "requestedDate": "2022-10-10T12:05:17.621Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6c7dbb0c7a67731f44083144cfb6dac5", - "type": "manual", - "value": "Table of contents", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 238.97, - "y": 746.73865 - }, - "width": 117.20228, - "height": 14.251781, - "page": 3 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:03:56.399Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:03:56.399Z", - "requestedDate": "2022-10-10T12:03:56.399Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "67e62b590ec8974153609cfe4ca023bf", - "type": "manual", - "value": "Level 3", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 242.21, - "y": 477.0675 - }, - "width": 110.88, - "height": 32.146873, - "page": 188 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:08:58.144Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:08:58.144Z", - "requestedDate": "2022-10-10T12:08:58.144Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2adea2c13458b3de03a5122918ff7c7c", - "type": "manual", - "value": "Level 1", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 242.21, - "y": 477.0675 - }, - "width": 110.88, - "height": 32.146873, - "page": 8 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:04:49.47Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:04:49.47Z", - "requestedDate": "2022-10-10T12:04:49.47Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - } - ], - "legalBasis": [ - { - "name": "n-a.", - "description": "n-a.", - "reason": "n-a." - } - ], - "dictionaryVersion": 13, - "dossierDictionaryVersion": 1, - "rulesVersion": 3, - "legalBasisVersion": 2 -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Merge Multi Page Table.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Merge Multi Page Table.pdf deleted file mode 100644 index feba9632..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Merge Multi Page Table.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Merge Table.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Merge Table.pdf deleted file mode 100644 index 64e29896..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Merge Table.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Rotated Table Headers.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Rotated Table Headers.pdf deleted file mode 100644 index f4512499..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Rotated Table Headers.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Spanning Cells.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Spanning Cells.pdf deleted file mode 100644 index db5abbcd..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Spanning Cells.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/15 - Pretilachlor - Acute Oral Toxicity (Up and Down Procedure) - Rat_Page18.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/15 - Pretilachlor - Acute Oral Toxicity (Up and Down Procedure) - Rat_Page18.pdf deleted file mode 100644 index cce8d6fd..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/15 - Pretilachlor - Acute Oral Toxicity (Up and Down Procedure) - Rat_Page18.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/19 Chlorothalonil RAR 08 Volume 3CA B 6b metabolites Oct 2017_Page161.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/19 Chlorothalonil RAR 08 Volume 3CA B 6b metabolites Oct 2017_Page161.pdf deleted file mode 100644 index e61a6605..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/19 Chlorothalonil RAR 08 Volume 3CA B 6b metabolites Oct 2017_Page161.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/19 Chlorothalonil RAR 08 Volume 3CA B 6b metabolites Oct 2017_Page35.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/19 Chlorothalonil RAR 08 Volume 3CA B 6b metabolites Oct 2017_Page35.pdf deleted file mode 100644 index 82b928fb..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/19 Chlorothalonil RAR 08 Volume 3CA B 6b metabolites Oct 2017_Page35.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/24 - SYN549522 - Acute Oral Toxicity - Rats_Page17.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/24 - SYN549522 - Acute Oral Toxicity - Rats_Page17.pdf deleted file mode 100644 index 9fa78dd9..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/24 - SYN549522 - Acute Oral Toxicity - Rats_Page17.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/27 A8637C - EU AIR3 - MCP Section 1 - Identity of the plant protection product_Page6.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/27 A8637C - EU AIR3 - MCP Section 1 - Identity of the plant protection product_Page6.pdf deleted file mode 100644 index 8acd8dd7..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/27 A8637C - EU AIR3 - MCP Section 1 - Identity of the plant protection product_Page6.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/28 A8637C - EU AIR3 - MCP Section 10 - Ecotoxicological studies on the plant protection product_Page23.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/28 A8637C - EU AIR3 - MCP Section 10 - Ecotoxicological studies on the plant protection product_Page23.pdf deleted file mode 100644 index 565ee200..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/28 A8637C - EU AIR3 - MCP Section 10 - Ecotoxicological studies on the plant protection product_Page23.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/30 - Dicamba - Acute Oral Toxicity - Rats_Page5.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/30 - Dicamba - Acute Oral Toxicity - Rats_Page5.pdf deleted file mode 100644 index f78a8f28..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/30 - Dicamba - Acute Oral Toxicity - Rats_Page5.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/47 Cyprodinil - EU AIR3 - MCA Section 5 Supplement - Toxicological and metabolism studies on the active substance_Page30.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/47 Cyprodinil - EU AIR3 - MCA Section 5 Supplement - Toxicological and metabolism studies on the active substance_Page30.pdf deleted file mode 100644 index cc84da28..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/47 Cyprodinil - EU AIR3 - MCA Section 5 Supplement - Toxicological and metabolism studies on the active substance_Page30.pdf +++ /dev/null @@ -1,1099 +0,0 @@ -%PDF-1.5 % -1 0 obj <> endobj 2 0 obj <>stream - - - - - 2023-04-21T14:28:39+02:00 - 2023-04-21T14:28:39+02:00 - 2023-04-21T14:28:39+02:00 - Microsoft Office Word - application/pdf - - - Cyprodinil - - - - - Syngenta - - - uuid:1c69408b-4dd4-495d-bb41-1e73600b9cb8 - uuid:aa570980-254b-4193-96a2-75439a4e6938 - Aspose.Words for Java 16.7.0.0 - CGA219417_11532 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 5 0 obj <>/MediaBox[0 0 595.45001221 841.70001221]/Parent 3 0 R/Resources<>>>/Type/Page>> endobj 8 0 obj <>stream -1 0 0 -1 0 841.70001221 cm q 1 0 0 1 70.90000153 35.45000076 cm -70.90000153 0 m 524.54998779 0 l 524.54998779 58.04700089 l -70.90000153 58.04700089 l h W n q -1 -1 m 121.5 -1 l 121.5 31.39800262 l -1 31.39800262 l h W n BT /FAAAAH 6 Tf 1 0 0 -1 0 5.62799978 Tm 0 g (Annex)Tj ( )Tj 18.68000031 0 Td (to)Tj ( )Tj 6.67099953 0 Td (Regulation)Tj ( )Tj 30.35500145 0 Td (283/2013)Tj ET Q q 1 0 0 1 120.5 0 cm -1 -1 m 207.75 -1 l 207.75 31.39800262 l -1 31.39800262 l h W n BT /FAAAAH 8 Tf 1 0 0 -1 85.58999634 7.50400019 Tm 0 g (Cyprodinil)Tj ET Q q 1 0 0 1 327.25 0 cm -1 -1 m 141.94999695 -1 l 141.94999695 31.39800262 l -1 31.39800262 l h W n BT /FAAAAH 8 Tf 1 0 0 -1 37.78900146 7.50400019 Tm 0 g (M-CA,)Tj 22.66399765 0 Td ( )Tj 2.22299957 0 Td (Section)Tj ( )Tj 28.9070015 0 Td (5)Tj ( )Tj 6.67199707 0 Td (Supplement)Tj ET q 1 0 0 1 0 15.19900036 cm BT 1 0 0 -1 132.05200195 7.50400019 Tm (30)Tj ET Q Q q 0 G 1.5 w 0 32.64800262 m 468.20001221 32.64800262 l S Q q 0 G 0.75 w 0 30.77300262 m 468.20001221 30.77300262 l S Q q 1 0 0 1 0 33.39799881 cm Q Q q 1 0 0 1 70.90000153 797.05102539 cm -70.90000153 0 m 524.54998779 0 l 524.54998779 9.19900036 l -70.90000153 9.19900036 l h W n BT /FAAAAH 8 Tf 1 0 0 -1 0 7.50400019 Tm 0 g (Syngenta)Tj ( )Tj 36.02799988 0 Td ()Tj ( )Tj 6.67200089 0 Td (8)Tj 4.4489975 0 Td ( )Tj 2.22300339 0 Td (October)Tj ( )Tj 30.68000031 0 Td (2015)Tj ( )Tj 20.01999664 0 Td (updated)Tj 28.9180069 0 Td ( )Tj 2.22299194 0 Td (20/5/16,)Tj ( )Tj 31.13700867 0 Td (3/2/17,)Tj ( )Tj 26.68798828 0 Td (7/4/17,)Tj 24.4650116 0 Td ( )Tj 2.22299194 0 Td (8/6/17)Tj 181.34700012 0 Td (CGA219417_11532)Tj ET Q q 1 0 0 1 70.90000153 93.49700165 cm q 1 0 0 1 0 12.64900017 cm BT /FAAAIE 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (Statistical)Tj ( )Tj (analysis:)Tj /FAAACA 11 Tf 90.14299774 0 Td ( )Tj (None)Tj 29.32600403 0 Td ( )Tj ()Tj ( )Tj (see)Tj 25.0450058 0 Td ( )Tj (Evaluation)Tj 50.4019928 0 Td ( )Tj (Criteria)Tj ( )Tj (below.)Tj ET Q q 1 0 0 1 0 37.29800034 cm BT /FAAAIE 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (Evaluation)Tj ( )Tj (criteria:)Tj 92.56600189 0 Td ( )Tj /FAAACA 11 Tf (A)Tj ( )Tj (test)Tj ( )Tj (item)Tj ( )Tj (is)Tj ( )Tj (considered)Tj ( )Tj (as)Tj ( )Tj (a)Tj ( )Tj (mutagen)Tj ( )Tj (if)Tj ( )Tj (a)Tj ( )Tj (biologically)Tj ( )Tj (relevant)Tj ( )Tj (increase)Tj ( )Tj (in)Tj ( )Tj (the)Tj 348.51699829 0 Td ( )Tj -441.08300781 -12.64900017 TD (number)Tj ( )Tj (of)Tj ( )Tj (revertants)Tj ( )Tj (exceeding)Tj ( )Tj (the)Tj ( )Tj (threshold)Tj 198.84199524 0 TD ( )Tj (of)Tj 11.91300964 0 Td ( )Tj (twice)Tj ( )Tj (the)Tj ( )Tj (colony)Tj ( )Tj (count)Tj 102.63500977 0 Td ( )Tj (of)Tj ( )Tj (the)Tj ( )Tj (corresponding)Tj ( )Tj (solvent)Tj ( )Tj -313.39001465 -12.64900017 TD (control)Tj ( )Tj (is)Tj 41.24499893 0 TD ( )Tj (observed.)Tj ET Q q 1 0 0 1 0 87.24500275 cm BT /FAAACA 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (A)Tj ( )Tj (dose)Tj ( )Tj 33.60699844 0 Td (dependent)Tj ( )Tj (increase)Tj ( )Tj (is)Tj 94.06900024 0 Td ( )Tj (considered)Tj ( )Tj (biologically)Tj ( )Tj (relevant)Tj ( )Tj (if)Tj ( )Tj (the)Tj ( )Tj (threshold)Tj 213.20901489 0 Td ( )Tj (is)Tj 10.0869751 0 Td ( )Tj (exceeded)Tj 43.66201782 0 Td ( )Tj (at)Tj ( )Tj (more)Tj 36.04000854 0 Td ( )Tj (than)Tj ( )Tj -430.67401123 -12.64900017 TD (one)Tj ( )Tj (concentration.)Tj ( )Tj ET Q q 1 0 0 1 0 124.54299927 cm BT /FAAACA 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (An)Tj ( )Tj (increase)Tj ( )Tj (exceeding)Tj ( )Tj (the)Tj ( )Tj (threshold)Tj ( )Tj (at)Tj 170.12199402 0 Td ( )Tj (only)Tj ( )Tj (one)Tj ( )Tj (concentration)Tj ( )Tj (is)Tj ( )Tj (judged)Tj 146.32402039 0 Td ( )Tj (as)Tj ( )Tj (biologically)Tj ( )Tj (relevant)Tj ( )Tj (if)Tj 114.84899902 0 Td ( )Tj -431.29501343 -12.64900017 TD (reproduced)Tj ( )Tj (in)Tj ( )Tj (an)Tj 73.91100311 0 TD ( )Tj (independent)Tj ( )Tj (second)Tj ( )Tj (experiment.)Tj ET Q q 1 0 0 1 0 161.84100342 cm BT /FAAACA 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (A)Tj ( )Tj (dose)Tj ( )Tj 33.60699844 0 Td (dependent)Tj ( )Tj (increase)Tj ( )Tj (in)Tj 95.28800964 0 Td ( )Tj (the)Tj 16.18798828 0 Td ( )Tj (number)Tj ( )Tj (of)Tj 48.26501465 0 Td ( )Tj (revertant)Tj 41.83499146 0 Td ( )Tj (colonies)Tj ( )Tj (below)Tj ( )Tj (the)Tj 85.22801208 0 Td ( )Tj (threshold)Tj ( )Tj (is)Tj ( )Tj (regarded)Tj ( )Tj (as)Tj ( )Tj (an)Tj 120.04299927 0 Td ( )Tj -440.45401001 -12.64900017 TD (indication)Tj ( )Tj (of)Tj ( )Tj (a)Tj ( )Tj (mutagenic)Tj ( )Tj (potential)Tj ( )Tj (if)Tj 162.80700684 0 TD ( )Tj (reproduced)Tj ( )Tj (in)Tj ( )Tj (an)Tj ( )Tj (independent)Tj ( )Tj (second)Tj ( )Tj (experiment.)Tj ( )Tj (However,)Tj ( )Tj -162.80700684 -12.64900017 TD (whenever)Tj ( )Tj (the)Tj ( )Tj (colony)Tj 91.62999725 0 TD ( )Tj (counts)Tj ( )Tj (remain)Tj ( )Tj (within)Tj ( )Tj (the)Tj 111.80899811 0 Td ( )Tj (historical)Tj ( )Tj (range)Tj ( )Tj (of)Tj 82.77401733 0 Td ( )Tj (negative)Tj 40.00897217 0 Td ( )Tj (and)Tj 18.63201904 0 Td ( )Tj (solvent)Tj ( )Tj (controls)Tj ( )Tj (such)Tj 95.62600708 0 Td ( )Tj (an)Tj ( )Tj -440.48001099 -12.64899826 TD (increase)Tj ( )Tj (is)Tj 46.11600113 0 TD ( )Tj (not)Tj ( )Tj (considered)Tj ( )Tj (biologically)Tj ( )Tj (relevant.)Tj ET Q q 1 0 0 1 0 224.43699646 cm BT /FAAAIE 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (RESULTS)Tj ( )Tj (AND)Tj ( )Tj (DISCUSSION)Tj ET Q q 1 0 0 1 0 249.08599854 cm BT /FAAAIE 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (Preliminary)Tj ( )Tj (cytotoxicity)Tj ( )Tj (assay:)Tj /FAAACA 11 Tf ( )Tj (Not)Tj ( )Tj (performed.)Tj ET Q q 1 0 0 1 0 273.73498535 cm BT /FAAACA 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (Mutagenicity)Tj ( )Tj (assay:)Tj ( )Tj (The)Tj 110.88600159 0 Td ( )Tj (test)Tj ( )Tj (item)Tj 40.32600403 0 Td ( )Tj (Cyprodinil)Tj ( )Tj (tech.)Tj ( )Tj (was)Tj ( )Tj (assessed)Tj ( )Tj (for)Tj ( )Tj (its)Tj ( )Tj (potential)Tj ( )Tj (to)Tj ( )Tj (induce)Tj 247.45098877 0 Td ( )Tj (gene)Tj 23.51501465 0 Td ( )Tj -422.17800903 -12.64900017 TD (mutations)Tj ( )Tj (in)Tj ( )Tj (the)Tj ( )Tj (plate)Tj ( )Tj (incorporation)Tj ( )Tj (test)Tj ( )Tj (\(experiment)Tj ( )Tj (I\))Tj ( )Tj (and)Tj ( )Tj (the)Tj ( )Tj (pre-incubation)Tj ( )Tj (test)Tj ( )Tj (\(experiment)Tj 416.64001465 0 TD ( )Tj (II,)Tj ( )Tj (IIA,)Tj ( )Tj -416.64001465 -12.64900017 TD (IIB\))Tj ( )Tj (using)Tj 44.9129982 0 TD ( )Tj (Salmonella)Tj 52.23900223 0 Td ( )Tj (typhimurium)Tj 60.19399261 0 Td ( )Tj (strains)Tj 31.4690094 0 Td ( )Tj (TA)Tj ( )Tj (1535,)Tj ( )Tj (TA)Tj 62.32600403 0 Td ( )Tj (1537,)Tj ( )Tj (TA)Tj ( )Tj (98,)Tj ( )Tj (and)Tj 80.04499817 0 Td ( )Tj (TA)Tj ( )Tj (100,)Tj ( )Tj (and)Tj ( )Tj (the)Tj 74.23300171 0 Td ( )Tj (Escherichia)Tj ( )Tj -405.41900635 -12.64899826 TD (coli)Tj ( )Tj (strains)Tj ( )Tj (WP2)Tj 72.71399689 0 TD ( )Tj (uvrA)Tj ( )Tj (pKM)Tj ( )Tj (101)Tj 70.58200836 0 Td ( )Tj (and)Tj 18.63198853 0 Td ( )Tj (WP2)Tj ( )Tj (pKM)Tj ( )Tj (101.)Tj ET Q q 1 0 0 1 0 336.33099365 cm BT /FAAACA 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (Reduced)Tj ( )Tj (background)Tj ( )Tj (growth)Tj 127.07499695 0 Td ( )Tj (was)Tj 19.85700989 0 Td ( )Tj (observed)Tj 42.45799255 0 Td ( )Tj (at)Tj ( )Tj (the)Tj ( )Tj (following)Tj 72.40098572 0 Td ( )Tj (concentrations)Tj 66.89202881 0 Td ( )Tj (\(g/plate\):)Tj ET Q q 1 0 0 1 -3.5 360.98001099 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (Strain)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 142.1499939 -0.5 l 142.1499939 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 57.29499817 8.40200043 Tm 0 g (Exp.)Tj 17.75800323 0 Td ( )Tj (I)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 142.1499939 -0.5 l 142.1499939 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 55.54299927 8.40200043 Tm 0 g (Exp.)Tj 17.75800323 0 Td ( )Tj (II)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 14.59399986 8.40200043 Tm 0 g (Exp.)Tj 17.75800133 0 Td ( )Tj (IIA)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 14.74199963 8.40200043 Tm 0 g (Exp.)Tj ( )Tj (IIB)Tj ET Q Q q 1 0 0 1 0 10.84899998 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 7.046 8.40200043 Tm 0 g (without)Tj ( )Tj (S9)Tj ( )Tj (mix)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 8.59700012 8.40200043 Tm 0 g (with)Tj ( )Tj (S9)Tj ( )Tj (mix)Tj ( )Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 7.84600019 8.40200043 Tm 0 g (without)Tj 29.50500107 0 Td ( )Tj (S9)Tj 11.75499725 0 Td ( )Tj (mix)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 7.79699993 8.40200043 Tm 0 g (with)Tj ( )Tj (S9)Tj ( )Tj (mix)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 2.34599996 8.40200043 Tm 0 g (without)Tj ( )Tj 31.75500107 0 Td (S9)Tj 9.50499725 0 Td ( )Tj (mix)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 2.24600005 8.40200043 Tm 0 g (without)Tj ( )Tj (S9)Tj ( )Tj (mix)Tj ET Q Q Q q 1 0 0 1 0 21.69799995 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (TA)Tj ( )Tj (1535)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 16.5510006 8.40200043 Tm 0 g (333)Tj ( )Tj 15.74999809 0 Td (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.85099983 8.40200043 Tm 0 g (333)Tj ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 17.35099983 8.40200043 Tm 0 g (333)Tj ( )Tj 15.75000191 0 Td (-)Tj 2.99699783 0 Td ( )Tj (5000)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.05099964 8.40200043 Tm 0 g (333)Tj 13.50000095 0 Td ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 1 0 0 1 0 32.54700089 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (TA)Tj ( )Tj (1537)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 16.5510006 8.40200043 Tm 0 g (333)Tj ( )Tj 15.74999809 0 Td (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.85099983 8.40200043 Tm 0 g (333)Tj ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 17.35099983 8.40200043 Tm 0 g (100)Tj ( )Tj 15.75000191 0 Td (-)Tj 2.99699783 0 Td ( )Tj (5000)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.05099964 8.40200043 Tm 0 g (100)Tj 13.50000095 0 Td ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 16.35099983 8.40200043 Tm 0 g (33)Tj ( )Tj (-)Tj ( )Tj (333)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 14.0010004 8.40200043 Tm 0 g (100)Tj ( )Tj (-)Tj ( )Tj (333)Tj ET Q Q Q q 1 0 0 1 0 43.39599991 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (TA)Tj ( )Tj (98)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 16.5510006 8.40200043 Tm 0 g (333)Tj ( )Tj 15.74999809 0 Td (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.85099983 8.40200043 Tm 0 g (333)Tj ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 17.35099983 8.40200043 Tm 0 g (100)Tj ( )Tj 15.75000191 0 Td (-)Tj 2.99699783 0 Td ( )Tj (5000)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.05099964 8.40200043 Tm 0 g (100)Tj 13.50000095 0 Td ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 1 0 0 1 0 54.24499893 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (TA)Tj ( )Tj (100)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 16.5510006 8.40200043 Tm 0 g (333)Tj ( )Tj 15.74999809 0 Td (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.85099983 8.40200043 Tm 0 g (333)Tj ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 17.35099983 8.40200043 Tm 0 g (100)Tj ( )Tj 15.75000191 0 Td (-)Tj 2.99699783 0 Td ( )Tj (5000)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.05099964 8.40200043 Tm 0 g (100)Tj 13.50000095 0 Td ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 1 0 0 1 0 65.09400177 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (WP2)Tj ( )Tj (uvrA)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 34.79999924 8.40200043 Tm 0 g (/)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 30.10000038 8.40200043 Tm 0 g (/)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 17.35099983 8.40200043 Tm 0 g (333)Tj ( )Tj 15.75000191 0 Td (-)Tj 2.99699783 0 Td ( )Tj (5000)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.05099964 8.40200043 Tm 0 g (333)Tj 13.50000095 0 Td ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 1 0 0 1 0 75.94300079 cm q -0.75 -0.5 m 61 -0.5 l 61 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (WP2)Tj ( )Tj (uvrA)Tj ( )Tj 10.34899902 TL (pKM101)' ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 16.5510006 8.40200043 Tm 0 g (333)Tj ( )Tj 15.74999809 0 Td (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.85099983 8.40200043 Tm 0 g (333)Tj ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 17.35099983 8.40200043 Tm 0 g (333)Tj ( )Tj 15.75000191 0 Td (-)Tj 2.99699783 0 Td ( )Tj (5000)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.05099964 8.40200043 Tm 0 g (333)Tj 13.50000095 0 Td ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 0 G 0.5 w 0 0.5 m 0 97.14099884 l S Q q 0 G 0.5 w 60.25 0.5 m 60.25 10.84899998 l S Q q 0 G 0.5 w 60.25 11.34899998 m 60.25 21.69799995 l S Q q 0 G 0.5 w 60.25 22.19799995 m 60.25 32.54700089 l S Q q 0 G 0.5 w 60.25 33.04700089 m 60.25 43.39599991 l S Q q 0 G 0.5 w 60.25 43.89599991 m 60.25 54.24499893 l S Q q 0 G 0.5 w 60.25 54.74499893 m 60.25 65.09400177 l S Q q 0 G 0.5 w 60.25 65.59400177 m 60.25 75.94300079 l S Q q 0 G 0.5 w 60.25 76.44300079 m 60.25 97.14099884 l S Q q 0 G 0.5 w 201.6499939 0.5 m 201.6499939 10.84899998 l S Q q 0 G 0.5 w 201.6499939 11.34899998 m 201.6499939 21.69799995 l S Q q 0 G 0.5 w 201.6499939 22.19799995 m 201.6499939 32.54700089 l S Q q 0 G 0.5 w 201.6499939 33.04700089 m 201.6499939 43.39599991 l S Q q 0 G 0.5 w 201.6499939 43.89599991 m 201.6499939 54.24499893 l S Q q 0 G 0.5 w 201.6499939 54.74499893 m 201.6499939 65.09400177 l S Q q 0 G 0.5 w 201.6499939 65.59400177 m 201.6499939 75.94300079 l S Q q 0 G 0.5 w 201.6499939 76.44300079 m 201.6499939 97.14099884 l S Q q 0 G 0.5 w 343.04998779 0.5 m 343.04998779 10.84899998 l S Q q 0 G 0.5 w 343.04998779 11.34899998 m 343.04998779 21.69799995 l S Q q 0 G 0.5 w 343.04998779 22.19799995 m 343.04998779 32.54700089 l S Q q 0 G 0.5 w 343.04998779 33.04700089 m 343.04998779 43.39599991 l S Q q 0 G 0.5 w 343.04998779 43.89599991 m 343.04998779 54.24499893 l S Q q 0 G 0.5 w 343.04998779 54.74499893 m 343.04998779 65.09400177 l S Q q 0 G 0.5 w 343.04998779 65.59400177 m 343.04998779 75.94300079 l S Q q 0 G 0.5 w 343.04998779 76.44300079 m 343.04998779 97.14099884 l S Q q 0 G 0.5 w 409.04998779 0.5 m 409.04998779 10.84899998 l S Q q 0 G 0.5 w 409.04998779 11.34899998 m 409.04998779 21.69799995 l S Q q 0 G 0.5 w 409.04998779 22.19799995 m 409.04998779 32.54700089 l S Q q 0 G 0.5 w 409.04998779 33.04700089 m 409.04998779 43.39599991 l S Q q 0 G 0.5 w 409.04998779 43.89599991 m 409.04998779 54.24499893 l S Q q 0 G 0.5 w 409.04998779 54.74499893 m 409.04998779 65.09400177 l S Q q 0 G 0.5 w 409.04998779 65.59400177 m 409.04998779 75.94300079 l S Q q 0 G 0.5 w 409.04998779 76.44300079 m 409.04998779 97.14099884 l S Q q 0 G 0.5 w 474.84997559 0.5 m 474.84997559 97.14099884 l S Q q 0 G 0.5 w 135.6499939 11.34899998 m 135.6499939 21.69799995 l S Q q 0 G 0.5 w 135.6499939 22.19799995 m 135.6499939 32.54700089 l S Q q 0 G 0.5 w 135.6499939 33.04700089 m 135.6499939 43.39599991 l S Q q 0 G 0.5 w 135.6499939 43.89599991 m 135.6499939 54.24499893 l S Q q 0 G 0.5 w 135.6499939 54.74499893 m 135.6499939 65.09400177 l S Q q 0 G 0.5 w 135.6499939 65.59400177 m 135.6499939 75.94300079 l S Q q 0 G 0.5 w 135.6499939 76.44300079 m 135.6499939 97.14099884 l S Q q 0 G 0.5 w 278.6499939 11.34899998 m 278.6499939 21.69799995 l S Q q 0 G 0.5 w 278.6499939 22.19799995 m 278.6499939 32.54700089 l S Q q 0 G 0.5 w 278.6499939 33.04700089 m 278.6499939 43.39599991 l S Q q 0 G 0.5 w 278.6499939 43.89599991 m 278.6499939 54.24499893 l S Q q 0 G 0.5 w 278.6499939 54.74499893 m 278.6499939 65.09400177 l S Q q 0 G 0.5 w 278.6499939 65.59400177 m 278.6499939 75.94300079 l S Q q 0 G 0.5 w 278.6499939 76.44300079 m 278.6499939 97.14099884 l S Q q 0 G 0.5 w -0.25 0.25 m 475.09997559 0.25 l S Q q 0 G 0.5 w 0.25 11.09899998 m 474.59997559 11.09899998 l S Q q 0 G 0.5 w 0.25 21.94799995 m 474.59997559 21.94799995 l S Q q 0 G 0.5 w 0.25 32.79700089 m 474.59997559 32.79700089 l S Q q 0 G 0.5 w 0.25 43.64599991 m 474.59997559 43.64599991 l S Q q 0 G 0.5 w 0.25 54.49499893 m 474.59997559 54.49499893 l S Q q 0 G 0.5 w 0.25 65.34400177 m 474.59997559 65.34400177 l S Q q 0 G 0.5 w 0.25 76.19300079 m 474.59997559 76.19300079 l S Q q 0 G 0.5 w -0.25 97.39099884 m 475.09997559 97.39099884 l S Q Q q 1 0 0 1 0 458.6210022 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (/)Tj ( )Tj (=)Tj ( )Tj (no)Tj ( )Tj (reduced)Tj ( )Tj (background)Tj ( )Tj (growth)Tj ( )Tj (observed;)Tj 161.52900696 0 Td ( )Tj (n.p.)Tj ( )Tj (=)Tj 23.07598877 0 Td ( )Tj (not)Tj ( )Tj (performed)Tj ET Q q 1 0 0 1 0 468.97000122 cm Q q 1 0 0 1 0 481.61898804 cm BT /FAAACA 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (Distinct)Tj ( )Tj (toxic)Tj 59.57699966 0 Td ( )Tj (effects,)Tj ( )Tj (evident)Tj ( )Tj (as)Tj ( )Tj (a)Tj ( )Tj (reduction)Tj ( )Tj (in)Tj ( )Tj (the)Tj ( )Tj (number)Tj ( )Tj (of)Tj ( )Tj (revertants)Tj ( )Tj (\(below)Tj ( )Tj (the)Tj ( )Tj (indication)Tj 351.86901855 0 Td ( )Tj (factor)Tj 28.39697266 0 Td ( )Tj (of)Tj 11.9130249 0 Td ( )Tj -451.75601196 -12.64900017 TD (0.5\))Tj ( )Tj (were)Tj ( )Tj (observed)Tj ( )Tj (at)Tj ( )Tj (the)Tj ( )Tj (following)Tj 156.39399719 0 TD ( )Tj (concentrations)Tj ( )Tj (\(g/plate\):)Tj ET Q q 1 0 0 1 -3.5 518.91699219 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (Strain)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 142.1499939 -0.5 l 142.1499939 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 57.29499817 8.40200043 Tm 0 g (Exp.)Tj 17.75800323 0 Td ( )Tj (I)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 142.1499939 -0.5 l 142.1499939 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 55.54299927 8.40200043 Tm 0 g (Exp.)Tj 17.75800323 0 Td ( )Tj (II)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 14.59399986 8.40200043 Tm 0 g (Exp.)Tj 17.75800133 0 Td ( )Tj (IIA)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 14.74199963 8.40200043 Tm 0 g (Exp.)Tj ( )Tj (IIB)Tj ET Q Q q 1 0 0 1 0 10.84899998 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 7.046 8.40200043 Tm 0 g (without)Tj ( )Tj (S9)Tj ( )Tj (mix)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 8.59700012 8.40200043 Tm 0 g (with)Tj ( )Tj (S9)Tj ( )Tj (mix)Tj ( )Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 7.84600019 8.40200043 Tm 0 g (without)Tj 29.50500107 0 Td ( )Tj (S9)Tj 11.75499725 0 Td ( )Tj (mix)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 7.79699993 8.40200043 Tm 0 g (with)Tj ( )Tj (S9)Tj ( )Tj (mix)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 2.34599996 8.40200043 Tm 0 g (without)Tj ( )Tj 31.75500107 0 Td (S9)Tj 9.50499725 0 Td ( )Tj (mix)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAAIE 9 Tf 1 0 0 -1 2.24600005 8.40200043 Tm 0 g (without)Tj ( )Tj (S9)Tj ( )Tj (mix)Tj ET Q Q Q q 1 0 0 1 0 21.69799995 cm q -0.75 -0.5 m 61 -0.5 l 61 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (TA)Tj ( )Tj (1535)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 18.04999924 8.40200043 Tm 0 g (333,)Tj ( )Tj (5000)Tj -5.24699879 -10.34899902 TD (\(1000,)Tj ( )Tj (2500\))Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 13.35000038 8.40200043 Tm 0 g (333,)Tj ( )Tj (5000)Tj -5.24700069 -10.34899902 TD (\(1000,)Tj 23.24700165 0 TD ( )Tj (2500\))Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 18.85000038 8.40200043 Tm 0 g (333,)Tj ( )Tj (1000)Tj -5.24700069 -10.34899902 TD (\(2500,)Tj ( )Tj (5000\))Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 23.79999924 8.40200043 Tm 0 g (333)Tj -17.99599838 -10.34899902 TD (\(1000)Tj 20.99700165 0 TD ( )Tj (-)Tj ( )Tj (5000\))Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 1 0 0 1 0 42.89599991 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (TA)Tj ( )Tj (1537)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 16.5510006 8.40200043 Tm 0 g (333)Tj ( )Tj 15.74999809 0 Td (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 9.60099983 8.40200043 Tm 0 g (1000)Tj ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 17.35099983 8.40200043 Tm 0 g (333)Tj ( )Tj 15.75000191 0 Td (-)Tj 2.99699783 0 Td ( )Tj (5000)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.05099964 8.40200043 Tm 0 g (333)Tj 13.50000095 0 Td ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 16.35099983 8.40200043 Tm 0 g (33)Tj ( )Tj (-)Tj ( )Tj (333)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 14.0010004 8.40200043 Tm 0 g (100)Tj ( )Tj (-)Tj ( )Tj (333)Tj ET Q Q Q q 1 0 0 1 0 53.74499893 cm q -0.75 -0.5 m 61 -0.5 l 61 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (TA)Tj ( )Tj (98)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 16.5510006 8.40200043 Tm 0 g (333)Tj ( )Tj 15.74999809 0 Td (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 9.60099983 8.40200043 Tm 0 g (1000)Tj ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 18.85000038 8.40200043 Tm 0 g (333,)Tj ( )Tj (1000)Tj -5.24700069 -10.34899902 TD (\(2500,)Tj ( )Tj (5000\))Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 12.55000019 8.40200043 Tm 0 g (333,)Tj ( )Tj (1000)Tj -5.24700022 -10.34899902 TD (\(2500,)Tj ( )Tj (5000\))Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 1 0 0 1 0 74.94300079 cm q -0.75 -0.5 m 61 -0.5 l 61 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (TA)Tj ( )Tj (100)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 18.04999924 8.40200043 Tm 0 g (333,)Tj ( )Tj (1000)Tj -5.24699879 -10.34899902 TD (\(2500,)Tj ( )Tj (5000\))Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 13.35000038 8.40200043 Tm 0 g (333,)Tj ( )Tj (1000)Tj -5.24700069 -10.34899902 TD (\(2500,)Tj 23.24700165 0 TD ( )Tj (5000\))Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 30.10000038 8.40200043 Tm 0 g (333)Tj -17.99600029 -10.34899902 TD (\(1000)Tj 20.99700165 0 TD ( )Tj (-)Tj 5.24699783 0 Td ( )Tj (5000\))Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 12.55000019 8.40200043 Tm 0 g (333,)Tj ( )Tj (1000)Tj -5.24700022 -10.34899902 TD (\(250)Tj (0,)Tj ( )Tj (5000\))Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 1 0 0 1 0 96.14099884 cm q -0.75 -0.5 m 61 -0.5 l 61 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (WP2)Tj ( )Tj (uvrA)Tj ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 34.79999924 8.40200043 Tm 0 g (/)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 30.10000038 8.40200043 Tm 0 g (/)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 35.59999847 8.40200043 Tm 0 g (/)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 21.54999924 8.40200043 Tm 0 g (5000)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 11.84899998 l -0.75 11.84899998 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 1 0 0 1 0 106.98999786 cm q -0.75 -0.5 m 61 -0.5 l 61 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (WP2)Tj ( )Tj (uvrA)Tj ( )Tj 10.34899902 TL (pKM101)' ET Q Q q 1 0 0 1 60.25 0 cm -0.75 -0.5 m 76.15000153 -0.5 l 76.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 14.30099964 8.40200043 Tm 0 g (1000)Tj ( )Tj (-)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 135.6499939 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 11.10000038 8.40200043 Tm 0 g (2500,)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 201.6499939 0 cm -0.75 -0.5 m 77.75 -0.5 l 77.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 15.10099983 8.40200043 Tm 0 g (1000)Tj 18.00000191 0 Td ( )Tj (-)Tj 5.24699783 0 Td ( )Tj (5000)Tj ET Q Q q 1 0 0 1 278.6499939 0 cm -0.75 -0.5 m 65.15000153 -0.5 l 65.15000153 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 10.30000019 8.40200043 Tm 0 g (2500,)Tj ( )Tj (5000)Tj ET Q Q q 1 0 0 1 343.04998779 0 cm -0.75 -0.5 m 66.75 -0.5 l 66.75 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.60000038 8.40200043 Tm 0 g (n.p.)Tj ET Q Q q 1 0 0 1 409.04998779 0 cm -0.75 -0.5 m 66.55000305 -0.5 l 66.55000305 22.19799995 l -0.75 22.19799995 l h W n q 1 0 0 1 3.5 0.5 cm BT /FAAACA 9 Tf 1 0 0 -1 24.5 8.40200043 Tm 0 g (n.p.)Tj ET Q Q Q q 0 G 0.5 w 0 0.5 m 0 128.18800354 l S Q q 0 G 0.5 w 60.25 0.5 m 60.25 10.84899998 l S Q q 0 G 0.5 w 60.25 11.34899998 m 60.25 21.69799995 l S Q q 0 G 0.5 w 60.25 22.19799995 m 60.25 42.89599991 l S Q q 0 G 0.5 w 60.25 43.39599991 m 60.25 53.74499893 l S Q q 0 G 0.5 w 60.25 54.24499893 m 60.25 74.94300079 l S Q q 0 G 0.5 w 60.25 75.44300079 m 60.25 96.14099884 l S Q q 0 G 0.5 w 60.25 96.64099884 m 60.25 106.98999786 l S Q q 0 G 0.5 w 60.25 107.48999786 m 60.25 128.18800354 l S Q q 0 G 0.5 w 201.6499939 0.5 m 201.6499939 10.84899998 l S Q q 0 G 0.5 w 201.6499939 11.34899998 m 201.6499939 21.69799995 l S Q q 0 G 0.5 w 201.6499939 22.19799995 m 201.6499939 42.89599991 l S Q q 0 G 0.5 w 201.6499939 43.39599991 m 201.6499939 53.74499893 l S Q q 0 G 0.5 w 201.6499939 54.24499893 m 201.6499939 74.94300079 l S Q q 0 G 0.5 w 201.6499939 75.44300079 m 201.6499939 96.14099884 l S Q q 0 G 0.5 w 201.6499939 96.64099884 m 201.6499939 106.98999786 l S Q q 0 G 0.5 w 201.6499939 107.48999786 m 201.6499939 128.18800354 l S Q q 0 G 0.5 w 343.04998779 0.5 m 343.04998779 10.84899998 l S Q q 0 G 0.5 w 343.04998779 11.34899998 m 343.04998779 21.69799995 l S Q q 0 G 0.5 w 343.04998779 22.19799995 m 343.04998779 42.89599991 l S Q q 0 G 0.5 w 343.04998779 43.39599991 m 343.04998779 53.74499893 l S Q q 0 G 0.5 w 343.04998779 54.24499893 m 343.04998779 74.94300079 l S Q q 0 G 0.5 w 343.04998779 75.44300079 m 343.04998779 96.14099884 l S Q q 0 G 0.5 w 343.04998779 96.64099884 m 343.04998779 106.98999786 l S Q q 0 G 0.5 w 343.04998779 107.48999786 m 343.04998779 128.18800354 l S Q q 0 G 0.5 w 409.04998779 0.5 m 409.04998779 10.84899998 l S Q q 0 G 0.5 w 409.04998779 11.34899998 m 409.04998779 21.69799995 l S Q q 0 G 0.5 w 409.04998779 22.19799995 m 409.04998779 42.89599991 l S Q q 0 G 0.5 w 409.04998779 43.39599991 m 409.04998779 53.74499893 l S Q q 0 G 0.5 w 409.04998779 54.24499893 m 409.04998779 74.94300079 l S Q q 0 G 0.5 w 409.04998779 75.44300079 m 409.04998779 96.14099884 l S Q q 0 G 0.5 w 409.04998779 96.64099884 m 409.04998779 106.98999786 l S Q q 0 G 0.5 w 409.04998779 107.48999786 m 409.04998779 128.18800354 l S Q q 0 G 0.5 w 474.84997559 0.5 m 474.84997559 128.18800354 l S Q q 0 G 0.5 w 135.6499939 11.34899998 m 135.6499939 21.69799995 l S Q q 0 G 0.5 w 135.6499939 22.19799995 m 135.6499939 42.89599991 l S Q q 0 G 0.5 w 135.6499939 43.39599991 m 135.6499939 53.74499893 l S Q q 0 G 0.5 w 135.6499939 54.24499893 m 135.6499939 74.94300079 l S Q q 0 G 0.5 w 135.6499939 75.44300079 m 135.6499939 96.14099884 l S Q q 0 G 0.5 w 135.6499939 96.64099884 m 135.6499939 106.98999786 l S Q q 0 G 0.5 w 135.6499939 107.48999786 m 135.6499939 128.18800354 l S Q q 0 G 0.5 w 278.6499939 11.34899998 m 278.6499939 21.69799995 l S Q q 0 G 0.5 w 278.6499939 22.19799995 m 278.6499939 42.89599991 l S Q q 0 G 0.5 w 278.6499939 43.39599991 m 278.6499939 53.74499893 l S Q q 0 G 0.5 w 278.6499939 54.24499893 m 278.6499939 74.94300079 l S Q q 0 G 0.5 w 278.6499939 75.44300079 m 278.6499939 96.14099884 l S Q q 0 G 0.5 w 278.6499939 96.64099884 m 278.6499939 106.98999786 l S Q q 0 G 0.5 w 278.6499939 107.48999786 m 278.6499939 128.18800354 l S Q q 0 G 0.5 w -0.25 0.25 m 475.09997559 0.25 l S Q q 0 G 0.5 w 0.25 11.09899998 m 474.59997559 11.09899998 l S Q q 0 G 0.5 w 0.25 21.94799995 m 474.59997559 21.94799995 l S Q q 0 G 0.5 w 0.25 43.14599991 m 474.59997559 43.14599991 l S Q q 0 G 0.5 w 0.25 53.99499893 m 474.59997559 53.99499893 l S Q q 0 G 0.5 w 0.25 75.19300079 m 474.59997559 75.19300079 l S Q q 0 G 0.5 w 0.25 96.39099884 m 474.59997559 96.39099884 l S Q q 0 G 0.5 w 0.25 107.23999786 m 474.59997559 107.23999786 l S Q q 0 G 0.5 w -0.25 128.43800354 m 475.09997559 128.43800354 l S Q Q q 1 0 0 1 0 647.60498047 cm BT /FAAACA 9 Tf 1 0 0 -1 0 8.40200043 Tm 0 g (/)Tj ( )Tj (=)Tj ( )Tj (no)Tj ( )Tj (toxic)Tj ( )Tj (effect)Tj 64.0510025 0 Td ( )Tj (observed;)Tj ( )Tj (in)Tj ( )Tj (brackets)Tj ( )Tj (\()Tj ( )Tj (\))Tj 89.21700287 0 Td ( )Tj (=)Tj 7.32598877 0 Td ( )Tj (not)Tj ( )Tj (evaluable)Tj ( )Tj (due)Tj ( )Tj (to)Tj ( )Tj (reduced)Tj 105.70501709 0 Td ( )Tj (background)Tj ( )Tj (growth;)Tj ( )Tj (n.p.)Tj ( )Tj (=)Tj 98.05999756 0 Td ( )Tj (not)Tj ( )Tj (performed)Tj ET Q q 1 0 0 1 0 657.95397949 cm Q Q 1 0 0 -1 0 841.70001221 cm -endstream endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <>stream - POS/2cZ`cmap:^\<cvt t,fpgm7x ?glyf TTheadƧ6hhea$hmtxgHloca.LLmaxp ] namek#post$ prep_`(hj3%3f.xC TMC kF3!@L  $ #%()+,-./0123456789:;ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz  "e #%()+,-./0123456789:;ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz  "e !  46LLJk#j$$%$]E.X9K -(#KPJ 1F%O"NAGi@'LHQP.;L -#"sZPRn\Z[In~`5br(8 n+F@h33n5C4\]|(;H{7cx!z'4RFTm?N+En!I{nc(i~?2&5@EIWl&@[{w~(8/@FM~{/h   37x{#Xby!$]ehj /7?PW\@!$0MM]fz|/=JP_f|*D!a +3%?CZk"#',?WXw ""*6J\ -#Axy22%i54BHJWdqqrvwzz"#07C[`exxxx{-AGJP[]]_c'Eg&AHk2HI_c -6PT' M)[/td_|D= -a6;Pyd_UVCFJ]e7td %/B?v:7Q)?VN/4$4Z#/DtAPOQRIn{{j"% L}4mi jj88bZDmHm@@\Y+L@ HHd%2v1x - cB,4A8HXlYCp(7BPZdsx\,cAKU_s Ad*8t,@ - ,;DVcWd6P9ND$B"`9,N8iT=qAPO5G9P+WUs\rXDp@BUT@?>=<;:987543210/.-,+*)('&%$#"!  - ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y QX# D#Y!!-, EhD ` EFvhE`D-, -C#Ce --, - C#C -,#p>#pE: -,E#DE#D-, E%EadPQXED!!Y-,Cc#b#B+-, EC`D-,CCe --, i@a ,b`+ d#da\XaY-,E+#Dz-,E+#D-,CXE+#DzEi #D QX+#Dz!zYY-,-,%F`F@aH-,KS \XYXY-, %E#DE#DEe#E %`j #B#hj`a Ry!@E TX#!?#YaDRy@ E TX#!?#YaD-,C#C -,C#C -, C#C -, C#Ce -,C#Ce -,C#Ce -,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KdQXEi C`:!!!Y-,%# `#-,%# a#-,%-, ` <<-, a <<-,++**-,CC -,>**-,5-,v#p E PXaY:/-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,&&&&Eh:-,&&&&Ehe:-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CXY-,CXY-,KTC\ZX8!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,KS#KQZX:+!!Y-,KS#KQZX;+!!Y-,KS#KQZC\ZX8!!Y-, KT&KTZ -C\ZX8!!Y-,F#F`F# F`ab# #''pE` PXaFY`h:-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYY-,CTXKS#KQZX8!!Y!!!!Y-B@ -A %V+<pO jB+9%% c:)%% B-QWk$ -4 -4 -4 @Y -4  6Mkkyy  -&CA -/&hwv v7$Z@Z!jj _/p&&%n2+NCX@  - - -MM] -MMYN]]M??9910KSy2Cy@$ &%  &  -% -% % %+++++*++]q]q++++#&&#"3267#"$54$323267W',1?\ĜvrY\ /k*ĒvՙpuwkF\>$/3J !T@' W& &  @@2?@&+4#K5#G5#?5#9=4#@$(+4###@#`###@###@  2? &+4 4 "#'58q++N+++]M]N]qr+++++q++M?<54&&#"!567654&'5MNZz!PPas-'>9++X-A'-/(!/5'>;'>{TCTVZPYl4$$'a}D!?? -e%$$#1R@$K -c?$$ lj4%'J"/t@//# $@ "$# $@#-%& ))@1K51;=41@04P1101@1P1p11* @ 0 @ P  0Nq+]qC\X !?  ? ?+++Y<].B13IVgX[jMC27Vb6#49&@eA_H4%%!`c7%{H /儎{"z9TY;\1<\@9 92@@aK59~-<--!-5- 5EJJI5Xf5 3>-1>P>c`>r:> -P>t;H;@89;23 +,(+,%+,)<3333=3M3}33333333 p33;@ U!eu;Lz p &++,))f/;H2]//@)+4_o@4 ,,/,?,,D)C%%%  U/ ?       @@>>@>`>>@(P(?+7772@#%4o0@P`=8U1+N]q+Mqq+]]q]]r+<]]??9+/]q+<9]qr+9]qr9999<<<]+rCTX ]Y10Cy@28:# -%&!% &9& "#:7  -" 8;++++<+++++++rq]rq]q+q+++%#"&546%54&&#"#"&546632327#"&'32IPj5@(A*&I;?Urn - 2kDPZ -y;'!-2iOk^j7)+(1EL3HFqB*@!%JCK9GQ67.#Kn)'@ - & 9  ? "$4 4+144+5+4+4+@'4+ +  4))""##$)@# -2@.Bl[@@ZZ@@[;c7$$"c"c7%@0YYP  5@&4?OV@j F^  ?  ?0@ y0@P]@ ?@ ? P.BLvc7$$"cb7%Q2@\ 0? ))%&)%*86* #$ # #   ) G K @ @ 2@ ?@ ?E@/@ 4/+ ?k@&+& @4[! U!@ - U!!!@ 4!!!"@:2?4/4O4_4o4444 U U@ 4")(2?((@ 4(38q+N+q+M]+q++C\X ?@2?@!?<#?<%?@ ?++++++YN]qr+M]+q++C\X!  ?!@ ?!^2?!!?!#?!%?! ?+++++++Y+qC\X@@(?@?@?@?@ ?+++++Y?C\X? ? ??++++Y?C\X@? ? ??++++Y]++C\X@/@ -?/@ ?/@ ?+++Y]++C\X%-? г? @ ?%-? @ ?%- ?%?% ? !?+++++++++Yq10q]]]+#&&#"#"'&#"#332654&'&'&546323267"=A): &]NVCp !!"-F0=+++Y]]3!526654&!2!326654&# D]J^CD]vlE|F@)6UKY9Ojn9"%%#8npn9"%D{b>5Y%j3k 2@4I I I ,+N]M<??10+2#"&5462#"&546VEaaEEaaDFabEEaaaEEaaEEarbEEaaEEbS$l3l@ -$%)x$%)* -# -4 -4 -4*@C -4hh w w$$&* -D#F)@*)*&* %)J@?p\"@?"#3Z@"Z0+ "5+ 5" >5@ 45(45S!n++NMCX   M] MYN+))P**}/=v+N] -@F#? -0 -@ -p - -_ - - - !@4!p!!0!@!_!!!!=v+N]qr+]qr+0P},=+N]q! 2=+N -&0'@''=X+N]"! ( _  }P##(Po}"=v+Nq]rLGz+:%% #O`iuR%%Zl$6"%j!k9-@90W)w! +0+-+)/" +$,6*6+g))*4*49ZI@Z6661Z  x@FZ)+&  vv) +) #51#5 O_oW&&&@;@ 4;1.:9X+NM]N+M]]??9]q999]]]CTX@  %)&+j iz y)+  ]qY10]q]#&&#"#"&'&#"#332654&&'.546323267 )fw@/SR@rV0:%%,p3hWB>/ k -  8@ 4p888@ 48(/.@4p.....78T!=v,++N]r+  ?1/ ?1/ &A_9+&++@@98'&@Aճ!m*++?<< P  P*!nX+]q<]q<]<]<?W&Lo!h4'%%"f:QoL!#@:$4#3#89i     ! !@@6 -( !  #-I4#.@ @-I4`  "#l!m,++N]+MNEeD+?@p/@ 4/./l!m++]+]]<<]]]?JJ HYZX.jjh.((88FF ggg /  / / *'($+//F  ? ^ !/ '/$ $+$ `1111@ (41/@)) '4'D''!+01!U++N]M]]NEeD+r?9.:De1EhSgG42=(6&H%%"&p;%,%%=Kz4Ak*&F7+ 9 -@8K5P-%5F!+!+$@"&$!#" -$##$ @#'$+##!  -f_@V5y+ -  *@!A?@=5 @EG4@C5@9:4@564@014@+-4@'(4@"$4@4@4@--/-p--@>5-9:4-564-014-,.4-'(4-4-@4-*''&@!A?&/&&&&7:4&/14&@ $4&,N+N+++]q+'5+VJ'5';'>yNGeK9l5$$%cs5.9:4.014.'(4.4.,.4.@4.*('@!A?'/''''7:4'/14'"$4'@ !4'-N+N++++]q+LQCdk5$$!et;!7E d"$$ kj4%?1"$@K5P$$  * I 9 "@ 4!@ 4$##$##$"## -e - ""**@EG4@=5@C5@9:4@014@'(4@"$4@+-4@4@4 @ -$@!A?$@>5$9:4$014$,.4$*5$'(4$4$@4$$$/$p$$*!A?7:4/14*5@$4/#N+N]q+++++})$(8'>$k5$}PIasj4%d:Oj4%N_#@m$ Y # -,*Wf gv v -r#%!& !H +2?@ 4%%%22?(+4@ 4$8+N+]++M]N]]q++Mr??q<999]q9q910]q]rq%#"547632#"&'&'&#"326@Bof{ؑE8;M 0"4TI7K1X|yƿZ9DNd?3M;+.Z4 "I @ 0   o+N]M?102#"&546FabEEaa4bEEaaEEbB37@ I -KF@ 3A+]?9910]56654'&#"#"&54632fti +;WdGVz,2S \>BdtBBk-+@\@/$*+)  + $"$#?2&-,+ -/@?////@04)"@4")/--))*  ) ? @/)24  0   `   /0/./!d++qN]qr++M<qq]<q++NEeD]+?5#535'4632#"&547654'&#"3 V?5Ӵ{wJ=4= 'Ew^%$$0LbE/\8-B6!  -05wbMF0=L@W% ?,% -) ).$D - -3 59; N%%) )8H* -C @H$B! ):$>) / >4U>@?>@9>@&'4>@4>@40>>4>@@47 /@/14@ +1/E&H ?H@ - ? HHH:@2? ::2rr/@),B@ ?B@ ?/BBBBH!@ ?@ ?/@&402?4444@!&+,@2?,@()4,@#%4,o,,P,,,wM8U+]q+++<]q+]]++]]++]q<q+]++??<+<9/9+/CTX@!4+Y+]++++++CTX>%'4>4++Y99999999910]q]+!##"'"372#"&&5467&5467&&54632"32654'&"32654'&&;1oJr-=7>OqhU~ZE^jsx]J:PO6uonA053SJC+LC?@C"#!  ""@ ?@7? ٷ"2 *"":@ ?:@7?:::B :ٶ"@ ?@7? ٷ# "#)@ ?)@7?)))# )@^#3 9"#"!(C?*)):99#BBB>233_33}E`E@EPEEEE >P}D=v+N]qr;'>LA:$%%3d"$$>;k5$$ kj4%ch5"_oA 5#5@  @Po+N]] -Ȯke9PUQI+.SQ2):QD5JﯩhcOQI:9Rjd2oy>@ +N/M10!5!yGoEL -@  - -@ - @  "  @ -   +]NM??<]]C\X@@?@?@?@ ?++++Y99.+}9910]!"#!kqS:&&b(9_+SRfkP@(7    0/@ @Vo+]]<<<??10]]&h1D&0WK4]Nk.DAZeF52QD@fYkR@"6    @OV 0R+<<<]]??10]]567676'&'5h1C'0WK4]Of.EAZ:(GeF52Q .L,!@M -," J  -&&&& -& & OF -O f -v - -z). - - - - - "# ""&Q,,(@j'&Q Q $"#& O O&%%.. >>-,($(( $9,(%(%$-.!=++??<<<9/<<N<,.-  -<4@<K***ͷD888ʹ@00F 4@F ͷ!@  JK!z++N]Mrr]]rrNEeD?<3tv0C -&8+%8.2*˰lQd]Dqݹd;1 #bG0 8uEL"P@. - -(( -8I  - -\@""""""  "@ - ȳ"@@P$я""@4"#+N+rMq?]?<]C\X@@?@?@?@ ?++++YqC\X??? ? ?+++++Y]qC\X@"@?"@?"@?"@ ?"@ ?"@ ?++++++Y.+}9910q]r]q!!#"'&5463232654$!"8{e3YY>A+'Pa=,'Rs6L }>,8+B D* xTHc$2O@(  E h&y&%7V2w $ $ CTX@ *1" % 43 %. -. - ??99@5+?4 S P%c s % 2$$ %1" @U% 2$$ @ 2 2$"2 1 $2 -. -  4@01@P4"""0*@ 4*@  @4 3++r+]q+??99999.+}9+9999<]]Y10]]#"&5467&&546326654'&#"32654o[q%$8*JC^i-  0Y/IdiuƏmD{gϷ`2|JE5aHI#I^8k]L1@ )Ii)9,%6O2_2P3k23@3P3p33333 22s st(  )'(/39I F1rr ?  -  (!  1*01@)  - {@i) -)())(   - -  -(()*))* -( U**)*)(  - 1  - 3A - )<@? 423g!m,++N+MNEeD?<<F=8,^}!h+@h+y+ -?@ ! A `!& 44ζ@   -  -))) -@-@4,X+N+qqM]]9/<??++9/]910]]5>54&#"'6632!"'&5463232654&/rX@yZb%HኍU[u{O9B+!UJj#!9u7#"&546632654'&'&#"32?>W0oow~j) -*/(2'B+I'&ڎ {xpUW)+;iD@ ?JE+N?M10!5!!yNJJ.i@F$@&#"$& , r*@2?O0K50;=40@ 4P00p000((@@ -2?@ 4/8+N+]q+M]N]r+++]q+8#/%L*B9'>$[b@$}67mE\%%%.Gh&CgW;2L*W@ - - ""& @#!5 &%%%> -  b,fO++9/]<]<??<9/++105!#"#"&54632326654&&##,<$ NnjV>=S7&=+8C9'%%"fhñwmFWN9 -Q,]h4'.PL;a="(4=@4 - / ;II n v = ;==..;> S/T;jg.;;;../-  ""- &\"7;87 \# %"#66/56//.;.(;;-  ; F#?;@8F#?;/. =;/. 76&%@==-><=T!=++NqC'\2DKT-;$ C9-E$ i+WGQE~- %%*t*j4%%%"f|h4'%%!gZU3& %%)v #Y%@ 4 I - I -I 0K!F@ 3$z+N]M???9910]+2#"&54656654'&#"#"&54632UE`aDEa`Sti +;WdGVz`EEaaEE`,2S \>Bdt(m Y @  - - - ?  @o@ Rc+Nq]M]<<]/]]10!3!!#!( $GV -@&H -@ -@ ,, @ 4 Ж+NEeD+<EeD<<BdtPk&@E hhg%  -II  -DC -h"g%  &  -4 -4 -4 -4 -4@? -4& -4 -4 - -   - -AJ w wxw"v% - - Q -@4 (4  #5%,4615e@ W'(l!nX++NMCX@ ###M((@ 4(M]N+]M]#M(( 4(MN+]MY?<+?99]++]10KSyLCy@6 &!%&%%& #% %%&#%"% % %$%++<+<+++++++++]q++++++++]qC\X@ 9999++++Y]327#"$'&! "3276'&.’(-wJ:9nbR{VU{M` =&4z0lzusKFkFj%@ 4 -@),4 -@^ 4$Hf @@4* "/"P""""""""`""""@4"@;5""' - -* -OP`po 44!$4/+++qrKQXY3/3/9/3/++]qrKRX@Y<3/+?/ B?%3NQ;A'QhU$?T(^!qK|Fp޸_<5FqRar !EW R9QJLs'\K&9*Os+9+Q&9S0)V)V&sj9P)4VJsOsF/sFs?NZBBM9+9V+(sD2L7f2ER.3JEHO!?sN9.(dwW9Pkll - 4 X@r~! -!#%d&f(D*,:../p124h6R8L:R<?C:EGHILIKzN$P PvRdT@VWXZ$[[\]]_``2bde(fhjmNnoqVrrtuwxnxy{4{~TR</VS8R@(R,v0 L & )! AM;c C t. -*&( @,L x  8 R@ (R  , v 0 L & - -.  2  (F0V2&.24Fz.4 -*& -2*<$ f$,r**(- --* - -.z. - -.  ( 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Times New RomanBoldMonotype:Times New Roman Bold (Microsoft)Version 6.87TimesNewRomanPS-BoldMTTimes New Roman is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Stanley Morison, Victor Lardent 1932You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic  as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software ), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Times New RomanBoldMonotype:Times New Roman Bold (Microsoft)Version 6.87TimesNewRomanPS-BoldMTTimes New Roman is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Stanley Morison, Victor Lardent 1932You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.NegretaTimes New Roman Negretatu nTimes New Roman tu nfedTimes New Roman fedFettTimes New Roman FettTimes New Roman  2014 The Monotype Corporation. All Rights Reserved. - -Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.NegritaTimes New Roman NegritaLihavoituTimes New Roman LihavoituGrasTimes New Roman GrasFlkvrTimes New Roman FlkvrGrassettoTimes New Roman GrassettoVetTimes New Roman VetHalvfetTimes New Roman HalvfetPogrubionaTimes New Roman PogrubionaNegritoTimes New Roman Negrito>;C68@=K9Times New Roman >;C68@=K9Tu nTimes New Roman Tu nKal1nTimes New Roman Kal1nKrepkoTimes New Roman Krepko#mTimes New Roman #mLodiaTimes New Roman Lodia!A T<  2  2 ( A?__@x3@r3@n3@j3@T3@J32@ - 2 2@Z3@A V3S3P3@M3@G3DE2@B3@>3:3A$ @p//@3A/`  ?O -lEE2@+.2@()22'2BB2682*-2A -((.22@2@APo-12 -2A  @2@2߲042߳2PA# 2Ay)z2~ٲ2ٲ(*2A -|2sq4lk2 @ 2@2kkn/n 2A @Ҳ 2A -@ 2@3@ 2A &82A&0 00Po0/py2y$(2}|2~~ 2@|2| 2?O@س2o@2@Բ 2{z2z2@ 2AToTTTTT/T_T@P2Z@I3HHH"2G"22-2/QKONd@Q2N8:20NN#2N2F 2C -2D+2+2*2A:37 707322PAd2@2`222202P22666p661?11111`10`00P//@/`/////--0----o,, @:@5%,2@j%,2@.%,2@(%,27` p 0 @ P  :3@:3MMM7A @>>>MMM---@M:27_o/?O_o/?O` p 0 @ P   P`p/?@AC`p@P#0#@#0#p@"0$@$$ $$$$$$$A:#0#`p@P#0ײ#7A_/?o@',2&3@"3@3@3@2_A?D3@=3@:3A9_O/??pO_/?z/z@ i(((A# # # # # W# @ # # # # A -J$ $ $ j@$ $ $ $ $ " !@" " " " " " \" Q" L" A -(  ^ @ Y : A -4 4 4 54 4 4 [ [  -*> *>!M%MAMRMrMA  * **^*9*#fff4f4ffA (&M?MA >%@*r*(*$*$*f.ff(lA (&sMqM$pM/oM5k>i>A gf*af*_fA ](\5GM9F>A E>%DCB@*0>*&=f%>*)*  f -&Mr>V@(MbM@Mr>@ *f"*@*.&y(Mf)fbf&(@ fL*+&f)@@*y&uMtMs*p(^j(@i*Rh* gf)efga*`5^*S5KfVI>HfRF&?fV@ ;f42*.5-CU7/r@.~bTB/'%!  -@+JKKSB7+KR8+KP[XYKcKb S# -QZ#BKKTB8+TXCX,FYYv??>9FD>9FD>9FD>9FD>9F`D>9F`DED+++++++++++++++++++++++++KSXY2KSXYK)S \XljEDkjEDYXhlERXlhDYYK;S \X>kEDMkEDYX\>ERX>\DYYK;S \X>ED>>EDYXOERXODYYKZS \XC>ED>>EDYXCERXCDYYKS \X*lED@lEDYXl*ERX*lDYYKS \X&&EDf&EDYX2&ERX&2DYYKQS \X&&ED(&EDYX&ERX&DYYKS \X&&ED5&EDYX(&ERX&(DYY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++eB+++++++++++++++++++++++++++++++++++++++++++++++++++=vnXEe#E`#Ee`#E`vhb nvEe#E &`bch &aev#eDn#D =XEe#E &`bch &aeX#eD=#DXETXX@eD=@=E#aDYN8qEe#E`#Ee`#E`vhb 8Ee#E &`bch &ae#eD8#D NqEe#E &`bch &aeq#eDN#DqETXq@eDN@NE#aDYKRBKPXBYC\XBY -CX`!YBp>CX;!~ +Y #B #BCX-A-A +Y#B#BCX~;! +Y#B#BtEiDEiDssssttuuuu+++ss++++++EiDssst+EDssssstttEDsttttttuuuEDsuEDssttEDsssssttttuuuuuuuuuuu++tttttts+CXMMEiDM:2+Ys++uuu+++++ss+C\X3@ 3MMMA @>>>MMM---7+tttttts++Ysststststststu+sus+++s++++u+++s+++++t+s+sst+ss++++++s+s+++t+++sssss+ss+++s++++sts+s++++u++++++++u+++++s++++stu++sss+++u++s++++++++++stust+stu+++++++++++++++++++stu+++++EiD++ -endstream endobj 16 0 obj 52268 endobj 13 0 obj <> endobj 17 0 obj <>stream - POS/2WXv`cmap8< cvt !7HfpgmsJ (jglyf6headי6hheaM$hmtx !N(loca=$maxpb$ namew2^D/post$d t prep? h53%3f.xC TMC @ F3!@L  | "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz{}~       " 2!"!"""H"d"e "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz{}~       " 2!"!"""H"d"eD?L$FG&( %-|bN`:=>>ECCg?.LLJk#j%$1JAPGy#D%F\r(K$Ep9K -ClS/CH,+%(%$H'j$b|!`4k;KkMy le.C &=Nae{1@'BN++I_ 5Kuz11)UKY0?*X0Y"tt2Md**~W8QZovw ~z&BKOQSd 18NRg!q6:#Whl~&-0;DDDGXu )js~#5ATYrIaanK',47bfjklppr|!0ijm|""(6?CFgc22H(Hb*Y[Vy%-.|#*,1?GIIMQQUUWZZabhh%'/9CCGORRgooprv~%-aq,/<VgEh4UjPb|%/sxpU%Tlf ikFoV":fT(oC:}: iX4iZx>*#zJ$^9qp@L  7! -Y&PU5z0|nf'+EM2A,R0]:X20|d(Mej/ "_ -CKw (_E`{d]O ^F2<Z,A IqH@@}:>jPH)jiLiCR_\gS*v6YV+4HH%>S?("bJmH3NFpyQ -hlO%f0i)/\p@BUT@?>=<;:9876543210/.-,+*)('&%$#"!  - ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y QX# D#Y!!-, EhD ` EFvhE`D-, -C#Ce --, - C#C -,#p>#pE: -,E#DE#D-, E%EadPQXED!!Y-,Cc#b#B+-, EC`D-,CCe --, i@a ,b`+ d#da\XaY-,E+#Dz-,E+#D-,CXE+#DzEi #D QX+#Dz!zYY-,%F`F@aH-,KS \XYXY-, %E#DE#DEe#E %`j #B#hj`a Ry!@E TX#!?#YaDRy@ E TX#!?#YaD-,C#C -,C#C -, C#C -, C#Ce -,C#Ce -,C#Ce -,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KdQXEi C`:!!Y-,%# `#-,%# a#-,%-, ` <<-, a <<-,++**-,CC -,>**-,5-,v#p E PXaY:/-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,&&&&Eh:-,&&&&Ehe:-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,KS#KQZ%%%I#EiRZX%%%F#Ei`HY!!!-,CXY-,CXY-,KTC\ZX8!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,KS#KQZX:+!!Y-,KS#KQZX;+!!Y-,KS#KQZC\ZX8!!Y-, KT&KTZ -C\ZX8!!Y-,F#F`F# F`ab# #XXpE` PXaFY`h:-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYY-,CTXKS#KQZX8!!Y!!!!Y-M -) k^+<#9]SQ9(nO'/%%0\Q%%.!,_ $,hh@ 9=4@=4@=4)<I@ [Z[Zktt      4G    h@ @ ?  3@ 3 @ O_o@@ @ `   @@_o+N]MblWF%BuqԐgg81-Jh$a  @ &@&@&`&&&&@_o%+N]MN]qM??10Cy@L$#$"$%&% &!bbb b$ b bb -b++++++++*+++*+**47632#"'&7326764'&'&#"JtZ`|bmE9q6t.0$9):D5H4ORA豕ar9s0!=S"L0@ ()*0==/Yohm/y/  -0F0660G0'&00+)&0;:9550?2O2hzvyt0000222220%HIF/ZYV/jx000 !" !".(!"!#!#!'!#"@>0/00/// 00'(0[/." !!!!!!!@22@  U1a+N+Cn+N]qrr+M++]qr+<+<<<<]<?]q?r]q+9]qr+++/CTX ]Y99910Cy@G5;#7868  -!" "5 9  "#;984 54 ":<+++<<++<+<++***rqqqr]CX?]Y]+rC\X1@9.9.97 9 9 @ 9 9 9@ 9 -( 97( 9 -( -97( -9 -( 97( 9+++++++++++++++Y]Y%#"&54766754&#"#"&5463232767#"&'32G$6=_{)WS?%&/&%/zN; - Y.#  h@@`@vAiA "iA#iA@   I@@50$+N]+54'&&#"J!<\`8 -%%Bǡr8%%1zܔ* Xh(@*u v -w %%}zz<(#( _C &&&  @#@ *@*@*`****>@ 0@)+N]MN]qM<??<9/]r99CTX ]Y10Cy@,% % &% #bb!#b$ -&b b" b++++++++*]q]632#"'&4$6332654&#"k$g|̋akGF3IW}&Wh% Oljcప\HXDS`B/ Jk$@B //// }{x HY/$K (ߵ+A  /@/ 2?@&& <  UI%dc+N+]rMN]rqMq?q]?10Cy@  %& &% -  -- - -++++++++q]rq]#&&#"3267# '&54$3232767>桇}v현yf?* k3϶߸qTH0byL!@CYi55!UU W!kvy ### @ !  ! !@ !!>G@ -@#@#`##!!@ @"+N]M]<]q]?<?9/99.+}9CTX@ rrr  ]Y10q]]C\X@ kodpp]Y]!#"&5463232654&'&'yNhY WQsyzo.#'/KMumL'k'7S2+!4{:-o +@@ @ @:5 @?5_   jz+qr++?10%2#"&546/@A..AAA..AA./@k8W@, ()+OO :F@686____ *:t t tvppp/p0 +3 3 4 5345//-  ))-3>>?0000!=4=5H H*T V WV)V+356TTTY2\3\4\5\6Z7 ) )# :;)0:rr$/0/(*+::N8oK@ 51oK@4*++<  + *& + *#(1#( @"4&&#@/ +  #@.....@G5@.... .0...F9F+N]]+qrMr]qrr9/+??<99.+}]q10Cy@6$0(& , 3)&3$&30 3 -- 3 ,+'*3)*%#3/3++<<+<<++++++]r]CX@ c f gc+]Y]qr+q]C\X@ 909309+++Y#.#"#"'&&#"#332654&'&$&&546323267%]\h+>龋K;4%%Xl}7:'Lly8! -k+^Q>3K}fmQ ?/ђ`Z2f,tT5/<CTX@%@U@U U UUU U@ U ,?//+++++/+10++CTX@ U U U UUU@Up  iI@, UU UUU U9/++++++??]]]10+++++++ @A 9__?O O _ _ '0@0 5, e @,  ./$P`+]qr<<<<]]]<??<<99910q]qr]r+YY3#32673#"&&5#566767J3(!>'#D.X*7s-)FY>)(bc3_ch!iH&e%0CTX@'@U U (U @ U  U @U  UUU UU$@% ,  U -/+??99?/+++++/+++++10+CTX@W@`p - $%%, U -U U UU - U& U  U &UU U'&9/+++9/++9/++++++???99?]10@5'` ]6 '`'p''4 7: HH O'#!O%'#'AD %E@ -%%, - - ! g@p@%$P `&+N]qr+F" - #' -C,'6E)^IL'$$$#Pc=$pJ'9"CTX@);@U2 -*U -U - ) U U U U @ U (+@ .%6Y'@ @ U?+?///9/+++++/++10+CTX2 U2 -@ U - -;:) UU U @U ;:('.% 6Y????999/++++9/++10@~ -;C ]69I[,;,?;K,[,jj,syy, 0;X3Y4l4@;/() )")'#'!O'D+(.66Y.% 21 - -` - - - - g@ P!p!!!!!!!!`:K+]qr<<]r?Q\@X0/$9ryal-^3%% 1dbY0o#:XNfqNnS@'YY ` @ :*@ _+N]M]?9910]q56654'&#"#"&54632ngq  %1:K6Bg,"P  :31Fs_g#yL!@Y  vv(!" !#!( (?5@# #p####!U U U" U U U"ac+N+++#U'MATUD)7M@9)(%GVW<,%, - GF10 -Y$!0 p  5@7).+$807p7775@MWA$LLMPMMMMMM4M`XYZ!d++N+]qrA(u00+ $T0'32(e#.t(c#(AZ' />}%@cq(%kP8CTX@ & -4&-,/-8-??//9/10@E - &4 '3 .& -% $ r -u 2:.Z6.???8&?(940:I OOFI&L(K4@:VV%P:u &,,) -)/: -:U Z6P:CTX@$y88,v//.&4 -..9..:99/9///??9]]10@&'445 - 3 - &45435%/5  }P/%o#####%..93-))'3P}55%$5%55% ''03 33 54& 3'% 8/& - 45@, BU,//.8.- BU--- - Eo.% @ 5@463g5.'339:M!͉++]+]+q]?<<]+d=QbN74\M&/&vJbC.y h - @( E @@*     @    @   If@ @?`@+Nq<]q]:iW)#3>L@:ZZZZkkkk/!?!O!!" !##!@ +@?P(@ U U U "+@?_(@ U U d]+++]CX 5 4++Y+<+++<]CX@ @ 5@ 4++Y+?=F;IY@P&6-[v*vS*.R ?7O[o7u&p[5>EKOO4K[[[[ 356[J6?6!JC -  %%޴U% ?%@  ?%%%%X+!!@ U!!!! ?! ?!@JJ@ ?J@ ?J,UJP@o@U5CC1@ J -/P M<1@ -QQ,,M0009M0@0o0000U0 U059.TT޴ UTʴUT޴UT@ - UT%((@4(O(p((((U(U(@U(u [0[@[[[[@ 4[FFUF1 p@U U U@??10PP4 4UUiZ[x! -++++++]qrr+++]q+r+q+++]q+r++++q++]r?r?]q?r+]]r+++]++]CX!!]Y+r]+++CX%%]Yr<<9999999910Cy@zKW:E$5&%213141A&O&.%*&V%T;K5M B? =?P-MR+T DFU'WVW:;L1J KJ56@C ><N/QS)Q EC++++<+<<+<<+<+++++++++++++*+r]q]qrC\X@ -. ?59.9+++Y&&5463232###"'#"'&5476767&&546"32654'&32654'&'&5TZ͠`++w8ĥDG,!0p=]ojK 5_4+9JdD4PLbE3/0:d34N)Y@  -Hp&9  pRqcW26%B c1#^vzWBrzZB3X%0$>H4#hL(4@$U% U"&#-I$-.f$  %&%GXoo${{ss v"x% -%&-$ $'$$--0-- (01:.:0f$i/ -*!"%(!#!#@,%$$"$ *)@UP`4@2(!X5!@EO5!!O!!!6@6p6664U U U" U U U5a+N+++*@ -0@4+N]M]q??9910Cy@2+/"%!#bb,*b.0b" b b+-b/-b+++++++++q]q]r&&54632#"'&546%6654&#"32654'&]̩l9LڱlVy1x@vff516SPml&GVrLkNfqyasZl}OiwvO4h/F`zWH9jOz+CTX@%-@U-@U-@ U+) U@U U U @ -$%)/??/++++10+++CTX@)$) UUU@ UUڷU-,9/++++++/???10@> &DD H /-! - _*_+"@#$%+P0*) -R--*+@ ()$``4::4??4$14@!4_p,+N]r+++++M<<<<<<]r?S)(BXqiX:43J&.@L",$$(DbZH@2 -D01jJ9F:=#/bzEV\@W $$'&ND^/4O^.$$ -8V=H#pSVh2L - 9 @< 9A E -F K" ))8)@4`444 -4A #z.$$..#%."% I)((004@+/4C )(h @ P   3  @ P-----3_@ -@4444>@3+N]M]q]]q]]q<?+r?]9/10Cy@6./& -"!#!$!%!%&& - b/-b b! 'b - .0b b++<++++++*]q]rq++6632!"&5463232654'&'&&##5>54&#"h:WB}pc/!x%*f#+N OH`hJjOZ1{D',? lOK8(A -^OgQh' @3{'"'hy}z w x yw  - );'!'%c@'PC@ /%o%%% > e@)@))@)`))))@!@ - - -(+N]M]q]?<?9/]r999910Cy@*$ &%&#& !bb$!b bb" %b++++++++++q]]5667#"&547632#654&&#"326l)f{Ƨwơ3ByMYYA_.~%u$eݷyjNaxwV,TJ|:@#  -  - "PT^+]<<<??10]]&'&57|e2{N!J}o%Lf6n*D֯ ,ͱCTX&!,@ &(%???//9/10CTX&@D U U UUU& (!y,,u%% u(( ,,-!!.-9/9/????]?]]910+++++.@?5'  %' ._.i p.%(%( .5.@4!..)d6#. -&&,&9&U& %7$7'OLMIG$F'M(M)%().%%(.%(%(. %' ()5CCPRVR) #%&. & Yww &&'%% - #! ), -(' }@@%$  $)())(&'&%'0  $ -% - -%#$$0)&# -  -(! @ - ,j%@(@'%%$$( e -e)#@@/P$/ %%% 4%&g@ @ -/_&@&&& }'/@ - (((( 4(g@P)))) )@)))))`-+]qr+]q]q+]q]qr?<<<?<<<<<<9.+}ć.+}ć.+}ć.+}++<<10]]q]]r+++]+C\X& ?$ ?9999%99++++++++YYY!'&'&'5!654&'5!##&&' 5!4'<H'9!W))%8<%,<%%#6 %% iII3 .JV9@$)*H -  -" 0@X+]<<<??10]556654'..e{M!K|d*Kfwn%EkհLL >@+>* B@ `    @ @ @G5@G5   @ @P +]N]M?<++?<.+}ıCTX@ tt]Y10qr]r++!#!"'R@ g6'@  @ 0`po+]?PV!L-*(/@7%d6  -/++++ - - pp - *! &@ !"!&@)!#&!#+,( - # -#&(((@%''&'+())0)@)p))O@.U U U" U U U.ac+N+++!" -!#!#%-!#5=!###$$>== -.--"@"" "0"p""""" @G`GG GGE%"5P4`44Fa+MrC&(.M.F#  *qD  .;{!/ -$$3gY8$$ !QBG#p}L9CTX 8)&@9' 0  //?9??/10@    -  - -099 9 4 4@ 46 5/J YX &+, ( (()*('16940GDK HTXXY -X XX0T1idl hhk3vvvv -x { {x}x u//01 (/0 / -00  Jh/e0h1 8lon-eeh K LH(K/YW/Q0PPZ  - /*)19 CTX@;:0  8)&  9'?<?5.@......,U U U" U U U-.w!ac++N+++*2,HhL{Y%%'&4Kg!%%1 zlg"%%@dal[(#%%?Fj`k@@  && @5:5@#75 pP` 1!Z++NqXB\eU%6#rl~!,%$wf?MwoxOT)l@/  u 16PXP^RCTX@( K{P`0 Dt_o0 -?r]]?r]]9999@ A $@2 - $   P0 _0 ->>@,..P 0 @ p  /?O . 5!͉++NqMN]]rM]?:3.wPgLFbj @d67' '''@  0 @  +]q?10Cy@*  -  ++++++++q+2#"&546"32654&]]\jT]\\]nJ1+/ -!4@4 - - ( ( &""-5@  (*$$ *@ *,4P*`*** @ O  U U2@$ U/1U U$ U@U0 /]]]qr++<++<<<3/]q+++3/]]q+99/33?6F -F -Y2F#Y@:F** '8>68P..@..@ B88BTZ+NM]q??<<<<9999.+}10Cy@pA4%0&%%@&8&,%<%&!& %%316A$>9+6;)>"  5/2?&27-:=(:  ++++++++++++++++++*+++++++++]]#!2#"&&5466"327654'&2#"&&5466"327654'&p$YUvOOPF3O$0"21 GMtIOOG0#-."0.$00!k]WiiW8xI74MM3nZgZkiV56FóG37IK3L?,CTX:7(%@&!.&8&????9/10@y  &:xw!@9/9A@+@AA@#4vxz"p+z-"#!"#-/#%&8? 9A A/ " $+(.//=00 ;!6'0+G A A0AA-t-|/+/C+Y Y! ##>?AKC'.$.e!!.CTX@"A@)&.!.%:7(%&8&?<?<9]99@K. /-! /""?-? '-('9?:9&"%&8/78-""--/?@> / /.!.!"988''&h??+ 0\`p -@D S d  2"""ö@A!k++]]]q]?<<]Y]CX@ i!d+o/`A]Y]+r++C\X@f'i8* ?# 9@ 9# 9. 9#H9&099"(99 99@ 9-9" 989'9ز9 ز9+ز9>ر9+++++++++++++++++++++]Y]]Y!5676654'&'!567667&&'5!6654'&&'5!D#yuZ: 0-6L3%>pH@mcsP;0* .H9$6ZRN_%% %G\:' *%%X[c%%.%G16(%%NiL -CTX /?9?/10@ ! 9!5!354!,/4!@ #4!!!idty -!ZWP!ei[Y[ -^Y@!PTWS !48FI%)(((! !0!`!!CTX@! -*  ?*^8.Y@/:E L% !1e~Z#%% .$2jt-5 % #c@!%g6"   @N@@ @   6:!!!!$jz+NM]]??/999910q+2#"&54656654'&#"#"&54632.AA..AA^gq  %1:K6Bg@..AA..@,"P  :31Fs_gL.մ0@?5@0^^P0,{y&y''0( 0P0(! $('$(%.00F@0QXZX(P0sss(s*p0(*0*00 (!"& (. !#$&"'&''&@"'(''(&/(0('&UU@ U"@ U U '@ 5 '0'@'P'p''''/k+]+++<+++<?)=$0%. ;,I%"0))`>;6K{--!JnEDb%4662-D#2O&-%:B',*I1+9Cv+(7.032'0R.7  !/-*%Y@ -+9CTX@ @ 4//+99'@ '@ BB A D@ D@+@?oOoo/O_S@(@` 0Pp\X^+]]]]q<]]]q<<</]q.+}ć.+}Y10]r55Ya4.V[*ekW@! -@ *:*!=++NM]NEeD?M9910]327632#"&5476f%  -(>+9DjX;k+>5'5  <-3&rTva@%[ @//  /  / oo `AQ' -Q 'Q' Q `QQ'` '@` 0@p \ X^+]q]<<]/]<]10]]%!5!3!!P RR %\s|'O_L'@;:5P0@ \ \X^+<<<]]qr<<<?]q+<<]<<10!!!!%77sRR'[7CTX@ @ 4//+99'@ '@ BB A D@ D@.@?o@P``@p S@_o\X^+]]q<]]]]]q<<</]q.+}ć.+}Y10r]'4bWnjZekO@   @:**!=++NM]NEeD?M99910]567654'&#"#"&547632g%  (>*:CkY;e/=5&5 <-2&qTva@tFI)@ %$@ 4$$""' , %/$@ !4$$$$$@ 4$$  U$@$U& U p U$U@ UP/]]q+++<<3/]q+++<<3/3/993/+]+<??3/3/+;+1HrUiCgSk}@ p11*)+]FI&@Lxp([Tkddt ho - - - -hh -|8$$8!!8>8 0@Pp%(kz+]<<<<<<??9/]910]]&&54654&'56654&5467I.ykky.ѧum--mi#H5H})|I5I#L;De45eD;LF&@Jw%) T[eevu -h   hh - - |8$$8!!8>8%'+<<<<<<??9/]q910]q]556654&5467&&54654&.ykky.ѧum..mk#H5H})}H5H#~M;Cf45eD;L8&x*/@U///;H+,)++]]+55L@@b488DJ  %NEN -db`trp -  -  " - -  -  @@3 - ##  0@/?O2 y!k]++NM]N]]<? 6X^+NR0%l$1SJqxXkIhA/.AA./A%LB@F/].bssu-z.-..-. C-I.Y9.DE267,&'56$&+. B "=BB #!B% #+B& "0B6 #>@-BABB-j..<=<,+ D+*!!I=0<<*@66* CDڳ!Xz++]<]NEeD<<<<<9/M]?<<<<<<<<<5#33!526654&5" -UcK(BA#L_P"f 8%&Ir;) %'$8'(8LHET-$$+RD?N<%,F,U*$$*AnD)$$*EL(%#k   #%4 -04*54@*54*548*54    -g6 TT5 -5@ -mm!jz++]9/9/?N 2@$'4C%+2/]q992/]+??2/]2A) *L@">>>,.-0/3*,+>A 1Q8F# @ G 10E&>)Ʒ?K @&&`55;op-@D<_o -JK!TZ++N]M]]rNEeDM<<?<?<99.+}9999910]++q]]rq!3267#"&'#"&5467&&547632654'&'%6654&#"&&'326WSnYGE`%%mRd|q®/"~b}w)|{YBWY"̈́f=xyu?ui%?ŠhSKIYjnUzyh=ZFgj_Ґ.$ ;\H^y:1y{Eak2aF,BT@jAAPUv(AVEXPV P Q R_!   OhegyAABB3BOR1BA *OA3CB@ >>hCCBBF&BBGL6FQ@6F.46 -Rg811UV F*? 0@V98III: "0"@"P""UVٳ!^7++N]M]N]M9/???]]9999ɇ<10Cy@;DK7=0GHFHEH;:<:,& %& %%$&(% &D=ItK7I/- tuu%u@' tH:CtJ8L0 -+t!uu#u )t++++++++++<<++++++++++++++**q]]]]]88]q32654$#"3 3!"$532#"&547#"&5476327"32667654&uA+ I͒Ӷtpt:Z&hMLMDGns[CY!KMqP;G,: 8Iqx$ ,H"4HA8[jjhqSEEnOtŐX?OX\dBNQ#k Q@ -g6 *54 8*54  T 5@ - m T+9/NEeD?M<10r+++&5463264--;6#({+@:;0%pdhHWz@"Yd6+%$ Y2$8H0YzIvQIYY &Q -)u&% N)GJ@ICID'(,/A/C/D/NHUWNxzw%xIvQIBCH=C7WGNXUO&OQ&O@Q%F(I Q%I+8UUUACC8N&NN&CNA&(FU"UCNA&1 +  @h/?_;h+78.8 86(>So""XF.846K@F F0FFFFXjz+]]//]999.+}ć.+}9999910]]]]q]]]+&&54632#"&547654&#"#"&5463232654'&'&'&5467654&'&yC9xn"",:3Ie-jJ4jsF5xl/,'8Cm0~D3l%4F4XRKJz?uV'.&)6fI@*FMsRZ[EMpAzX%3/(Ah=>1K_kQ[\%[F;Qn50]Ak?ld%,57@Yi6'/7/0:4K4_4f,yvu,v0y5355 -@'&!5- 2%-5& ''c c!"" @27 7@7`777 '@ !`!p!!* @  _o6+N]M]<՟|#( gNI #q@Bvlch @uy=F@ F !X++NMNEeD?M10Cy@.&&  -  ++++++++++q]]]2#"&546"32654'&D|zvf4JE'?9KG,h||}+Zbc9Y`c>Oln@  ' 7 G W   - - <   - @ 4oܷ ?TZ+<<]<?<<<<9910q#67!5!&&'VcM^g;L<;l%-0lea^vLSn&N@ ?!!2H+)++]5'@ -gGH+N/M10!5!%J#k1@ -&& T@\ m>^+?<10r]676632 E+$* - =#(,>7('G7@1*%*%+ - -#+#+  5%- )(45' |%4%'- 4'| '@:4?0@ 69()) E8T+<]]]qr</]<<<<910]]3#"&'&#"#>323263#"''&#"#>32326+d.hߜAFa+;q8+.ha;%Kf -+d.hߜAFa+:q8+.ib:%Kf~[@W`YuC P*`p[?W`YuD P*_,Wn@ -)':5v  4'| 4 '@"0@ E0 EX+]]]]/<<910]3#"&'&#"#6632326*-e.jݚAF`,\,.hSEKfZ@Va`9`r9 I@,T'd6 @@@  @_oTTZ+N]M]NEeD/]M/]10+2#"&546!2#"&546-??--@@.?@,-@?9@--??--@@--??--@%[+'@0@ \X^+N]]/M10!5![6RLSn&~"@ P`pH+!)++]55nNFw@=8m} -8 -/?U - BU -@1 -U -0@//?O_/qq3/]3/r3/3/]9++9+??3/3/]]+0FuUdvn;@p0? !++NqM]/]10q]3#vj#n޸,~h_<qRt^Q !EWt^9,J"I XVJbs9D9<LdE  n#9=9*F H>=V#|O SQT .LH9s!*3# S9D9cs""K)V")H3bnH9d%%%%JtdSCCI%f\Dp1WEdd9K^aqQl{OLdT9%LCvv\ Vrx "L&,*-\035888:;@BG8IJLMRU0X^Z\_0b`d>efHjk,l"l^mzmoprtLvTz~~~2J|X(.xL 4pf -ͦ~Ф:рѼ6</V4:8XF"v0 N & , IU;f C  w    8 XF   " v 0 N & - w   w  w w)7 w w$G*U-c - w w - w  w 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Times New RomanRegularMonotype:Times New Roman Regular (Microsoft)Version 6.87TimesNewRomanPSMTTimes New Roman is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Stanley Morison, Victor Lardent 1932You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic  as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software ), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Times New RomanRegularMonotype:Times New Roman Regular (Microsoft)Version 6.87TimesNewRomanPSMTTimes New Roman is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Stanley Morison, Victor Lardent 1932You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.Normaloby ejnnormalStandard 2014 The Monotype Corporation. All Rights Reserved. - -Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.NormaaliNormlNormaleStandaardNormalny1KG=K9NormlneNavadnothngArrunta!dA -T<*?A`?pEE2@+.2@()22'߲2޲BB2޲682޳*-2A -(߳(.2A ~@ڳ$&2dɲ 2A -d2Aso/O/oTkj"vutusA 0 0@ll2ml2}!#2}2A -}}}}|!#2|2A-||||0s@sss ssssssssswj)j(@g9@2?f@f2f@f -2@f 2@f 2?e@e 2@e2@e 2kAc{cc$c4cDcc$/Nm@0D2P-<@)_<7` p  0 @ P o/?O_:3@G:3  0@P`p ` p  0 @ P Abbbpbb_ ^ _0_@^^__^_ 0P`p 0'0J   ' P 0P` 0@@a'))))@L<F%@<%@ -:#r9<8I1$0%*$&#VU75u@,tbVQ;3-   -@+JKKSBKKTB7+KR8+KP[XY8+TXCX/|YYKcKb S# -QZ#Bv??>9FD>9FD>9FD>9FD>9F`D>9F`D++++++++++++++++++++++++KSXY2KSXYKGS \XqoEDpoEDYXzqERXqzDYYKGS \X"pED<pEDYX"ERX"DYYKLS \XI"ED""EDYXIERXIDYYKgS \X$qEDPqEDYX$ERX$DYYKS \X"ED""EDYX ERX DYYKS \X%%ED,%EDYX7%ERX%7DYYKS \X%%ED#%EDYXY%ERX%YDYYKS \X%%ED(%EDYX%ERX%DYY+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++eB+++++++++++++++++++++++++++++++++++++++++++adcEe#E`#Ee`#E`vhb dEe#E &`bch &ae#eDd#D acEe#E &`bch &aec#eDa#DcETXc@eDa@aE#aDYCKEe#E`#Ee`#E`vhb CEe#E &`bch &ae#eDC#D KEe#E &`bch &aeK#eD#DKETXK@eD@E#aDYKRBKPXBYC\XBY -CX`!YBp>CX;!~ +Y #B #BCX-A-A +Y#B#BCX~;! +Y#B#B+EiDEiDEiDEiDssstsssstuu+ssttuEiDsst+K!SKFQZX<> endobj 19 0 obj <>stream - POS/22]`cmapG<dcvt nZfpgmɼglyfxOOheadfw_6hhea3_$hmtx8N`loca`maxp ah nameBa!post* prep!A 33f *xC TMC @ Q3>@&  XR@ ,-/0123456789ACGMORS_abcdegilmnoprtuxy  ,-/0123456789ACGMORS_abcdegilmnoprtuxy  &iiiD|ZRRD/W~ "APoLu\7LnpX cc-\ @Wr]g!wM+Le|C]h5G!\M-x ,I?)9Io#o 2@z1UW~~FB/OV)or,11di+ &  sC_a^m8Q[h|ATkhqBBSsX2Q|  !U{{~!""#rw"+5<Yoq22 *<Qaajx *>LQ_jqx !".5BOO^eq *G]ety -"&+G_u\ -m6>PQ]`E3-_dM?}$x;;N&;MKSj1<ex ~ 90+ -P >X!q}E -+NT2N7kwdg3|)n*i9$]u -MRhm}qyXgV%|2!r\/AMrLjUxiWnTgeRZgn-|{pLFF-S%>S?("bJmH3NFpyQ -hlOa+{eRtei\@uq@FXWVUTA@?>=<;:987543210/.-,+*)('&%$#"!  - ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y QX# D#Y!!-, EhD ` EFvhE`D-, -C#Ce --, - C#C -,#p>#pE: -,E#DE#D-, E%EadPQXED!!Y-,Cc#b#B+-, EC`D-,CCe --, i@a ,b`+ d#da\XaY-,E+#Dz-,E+#D-,CXE+#DzEi #D QX+#Dz!zYY-,-,%F`F@aH-,KS \XYXY-, %E#DE#DEe#E %`j #B#hj`a Ry!@E TX#!?#YaDRy@ E TX#!?#YaD-,C#C -,C#C -, C#C -, C#Ce -,C#Ce -,C#Ce -,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KdQXEi C`:!!!Y-,%# `#-,%# a#-,%-, ` <<-, a <<-,++**-,CC -,>**-,5-,v##p #E PXaY:/-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,&&&&Eh:-,&&&&Ehe:-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CXY-,CXY-,KTC\ZX8!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,KS#KQZX:+!!Y-,KS#KQZX;+!!Y-,KS#KQZC\ZX8!!Y-, KT&KTZ -C\ZX8!!Y-,KRX%%I%%Ia TX! CUX%%88Y@TX CTX%8Y CTX%%88%8YYYY!!!!-,F#F`F# F`ab# #ŠpE` PXaFY`h:-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYY-,CTXKS#KQZX8!!Y!!!!Y-,W+X KS&KQZX -8 -!!Y!!!!Y-, CT#_#x!CV#y!C# \X!!!GY #cVXcVX!!!,Y!Yb \X!!!Y#b \X!!! Ya#!-, CT#{#x!Cr#y!C \X!!!cY #cVXcVX&[&&&!!!!6#Y!Y&#b \X\Z#!#!Yb \X!!#!Y&a#!-B@ -1 .+<@@" 4y  -  A @V @V @@V$@U@ U (U U @ U  U " U @ U U @ U -U @ U @364   N@464p3 @V @V @V%UU@U U - U U@U U U@364 N]q++++++++++<+++<<]q+]q++++++++++++++++<<?@U]] U eko e  U@R U U'1:1AMAQ\Ramaxx P`p -U@U A @V @V @V@ ܴ U U U @ '*4  %&4#40 @V3 @V @V @@V$@$*4?O @V @@+V U U U U U U47+N++++++++]+M++++Nq++q++++M+++?]++?9/]eclM,D'> ޶ U U@e U U - GHVYgi4::5EKKE\\ R]]Rmm dmmdw  [TT -[ lee -l - A @V @V @@V$@ U@ U@U U U U UU U@$%40  @V1@ #40 @V @V @@AV$ U U U U U U U U@$%4? @V @V @V147++++]++++++++++++q+]+]]+++++++++++++??10q]qC\X@ SS bb ]Y++++7632#"32654&#"D{'v "P@! 6Zfm  U U U$ U U U U4"'4'4'4'4س&444@I4%JJ S \mr xy -   ! -   @V@ U!"A @V @V @V&U U@ U U] $p$$$" @V @V - @@V   UU U@ U U U@ - U]#;+N+++++++]*@` , %L E , &,#9 6J FVX h -.#,'>#>'L',,6!6)?,F F!E)T!T)ic!c)`,,'!#'(@ 0`p}@ -E" -3%3 -A @V - @V - @@$V -%@`,@ U,@ UU@UU U@ UU U UA - @V @@ Vt%" @V @V @@V$?O @V @@.V U U" U U U U+,t!4P++N++++++++]qM+++++++++++++++]q<+++<??]??<10]q]q32676'#"5463253#"&32654&#"f 2Ct}vnэze۠Ꙧ}|zxXQ%2dZ7<ݘjx*&@ 4 4@4+$   - 3A @V @V @@V%@364@U(UU@ U U@ UU@ U U@ UN@464p  @V  @V @V % @364   U @U  U - U @U  U  U NGP++++++++]q++++]q+]q+++++++++++<+++???<99910Cy@    ++**]+++!5#"&&'&53326653?|^O nQQ;HmO5s1GQS97p - @V - A @V @V @V @V A @V @V @V @V A @V @V @V6 U784454014"%4@%4Op -%784@354 U@U U - U UU U U@ - UNGP++++++++++]qr++<<??10]qr++++++++++++++++++33FJ>(7@, * *) **9 67:*I*] ]*j i*`0 ) ( U'@ U((((D@ U U U5@O U+,*499,IH,VY+fi+v +74/$42!_)o))/? @V UU@U UU& @V @V, @@V, - -BU@ UE' -2 )aaA @V @V @@ V U%!$U$@ U$ U$ U$ U$@ U$U$ U$[@'@&& &0&&9U&ִU& @V&19@ #409999U @@ V%"/ @V/ @V/ @@V/$? @V @V @@.VU U U U U U U18++++++++++]q+++++]q++++]++++++++<++++??+?++9/++++++++]qq999910]++++q]++q%#"&546676767654'&#"'>32#&326765|G_fvcj U@_ U 2 cpt  *(* G VWVhk{޲(9@ (9  &J&  @V @V - @@ -V&  @@ V Uc\+N++]M+++N]M??910++]]q]++r#"$54$32&&#"326=כC,;3“\m憣1nU-銼!Q& @V @V @V @V @V @V @V @V @V @V @V @V @V @V  @VCTX@ -  @ @ U/+???910@s9(V -@ @ (04 (04  ' ' ' 6 6 5 ((HYYYiiiyv yzz  -  - BUCTX@ D  ???9]99@7  -% - -  % - - /?@@T@ ?@_B"E -T@ @@ 0 O P  B/? |f+q]q]q]q??<<<.+}ć.+}9<<KSKQZC@PZX 88YY+10C\X޶79 -"799"9++++Y]q++q]+]Y+++++++++++++++'326767673673#";,@t -=K?  ) #22Bp ::JJY[ \\jk imk  #++5:FJZ   A @V @V @@V$ - -@ -` - - @ U @ U -@ U - U - U - U -U -@ U -t33 @V @V @@V%?O@U U U U UU@U U UG7+N+++++++++]qr@;/#4CSft      - (" " @V @V @V%@364 U@U U UU@U U UNG+++++++++]q+<+++]r???999999ɇ}10]r]336632&#">i?[^>BB;^&qH:'G?`rF@| - % 4 D 55WT -RSgde c`+<<Kp.$ .:5 KE FIW -V g    - A - @V @V3 @V%A @V @V @@$V%@`@ U@ UU@UU U@ UU U U @Vt @V @V @V$ @V @@;V?O U U U U U U4P+N++++++]q++M++++++++++++++]q<++++<++??/ @V - @V  @V @V @V @VCTX@4 @Pp  U U U U/++++??]2]210@G CCSS``    -jiju p -  "_o@&0@P`p    A - @V @@V$ U"A - @V @@V$ +@+@V@ @V@ @V6 @@ V@ U@UH U UI @V @V @@!V$? U -U U @V @V14++++++]q+++++++++++]rKS#KQZX8Y++r+++r??9/9/]]10]q]qY++++++#"4632&&#"326<r鉭Zj -kl‚U!ó @V @V @V @V @V @VCTX@ U -@  U U/++//??9/+10@4 U UKy  * - @ -@@@@ _oA @V @V @@Vs@!#40 U 5 88@ !#4 @+]++]q++++]<?]?9/]9/].+}910C@PX 00 8888Yq]++Y++++++732654&#"'!!632#"&UlW(OtĢO?v\Ǒ&>#=A @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V U U @M 4%    #  # # -%%%%%UU@ U U@ U U UU U U] @V @V @@ V%U@ U U@ U U -U@ U U U]3# @V# @V# @@V#%?O@U U U U UU@U - U U$%x!GP++N+++++++++]qrpXdL:&N_bX'l_:xxPo[@5 z+N]/M105!sʑc3@K   @OO@XX WU_Z_VW A @V @V @V&  @VU U U U U@ U @V @V - @@ -V&  @V @@V U Uc\+N++++]M+++N]+++++++]M+++??10]q]]]q!2#"$7324&#"c6FymZ4 @{ $5E?"3Bp:<<LL]] X]^jl hnn  //0?@LPf  - A @V @V @@"V$  @ ` @ U U  U U U U U @ U t @V @V3 @V @@V U U3 @V @@V%?OU@U U U U UU@U U UG7+N++++++++++]qrc`Ҋ~K|]Ya p@    @0 s@!#4O_os O__?_o+N]q?rs^sg0pMQOa7U*#CTX %U U@( U U U,+ (OP@ U "??+]29/]299/++/+++10CTX %U@* U U,+ (OP "??]29/]299/+/++10@G:L@#[W#flmg#z} =:)d(O_"Ph A' @V @V @V9 @V @V @V 8@@!#40,8% @V% @V% @V%s@!#4 @+Nj+]++++]q+++++++?]?9/]10C@PX'#!  8888Y]q]YY732>54'#"5432#"&4&#"326p|aS}P66mƏ{z˥tx|}SznLp Vk4Ĝi@ ?CA+N/M105!i޸pĀ_<'*qQ^gQ >NCz)V9ssK9$sDsBssJs<sSsV9sUsf!ssFA9V\PsUs9cssMsas9msUslD  Rz`l!#8#%'(h+l-x.04V458;D=jAAHBE,GfHJ@L$NO)</Y: -$D2 -vd0  & " 1 E/ t  #/? O  - $ D2  - v  bm 0  & -        )  $9*G-U -   -    2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.ArialRegularMonotype:Arial Regular (Microsoft)Version 6.87ArialMTArial is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic  as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software ), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.ArialRegularMonotype:Arial Regular (Microsoft)Version 6.87ArialMTArial is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.Normaloby ejnnormalStandard 2014 The Monotype Corporation. All Rights Reserved. - -Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Arial is a trademark of The Monotype Corporation.NormaaliNormlNormaleStandaardNormalny1KG=K9NormlneNavadnothngArrunta'A T,,,"+*<*(&м)))+';@#2A- /   o   _ o A'/O__o@3@3@jl2@a3@\]2@WY2@MQ2@DI2@:3@142@.B2@',2@%2 - 2Ap@$&2d 2A -d2AJ?/?_?Ӳ792Ӳ+/2Ӳ%2Ӳ2Ӳ2Ҳ)&;@">3"%12A!?!!!!!@! "2@!2@"*?2@!.:2oAJ/`?_"""/"?"_"""!!o!!!!/!?!O!""!!@+HO7 A &A9&%8s542V&, /& 8ʸ&~&}Gke&^s@R&ZHDb@s?^<&50+*V)#U7h@,XO62,!  -@+JKKSBKcKb S# -QZ#BKKTB8+KR7+KP[XY8+TXCX(YYv??>9FD>9FD>9FD>9FD>9F`D>9F`D+++++++++++++++++++++++KSXY2KSXYKS \XEDEDYX>ERX>DYYKVS \X ED&EDYX ERX DYYKS \X%ED$EDYX %ERX% DYYKS \Xs$ED$$EDYX sERXs DYYKS \X%ED%%EDYXERXDYYK>S \XEDEDYXERXDYYKVS \XED/EDYXERXDYYKS \XEDEDYX ERX DYY+++++++++++++++++++++++++++++++++++++++++eB++;Yc\Ee#E`#Ee`#E`vhb cYEe#E &`bch &aeY#eDc#D ;\Ee#E &`bch &ae\#eD;#D\ETX\@eD;@;E#aDYGP47Ee#E`#Ee`#E`vhb 4PEe#E &`bch &aeP#eD4#D G7Ee#E &`bch &ae7#eDG#D7ETX7@eDG@GE#aDYKSBKPXBYC\XBY -CX`!YBp>CX;!~ +Y #B #BCX-A-A +Y#B#BCX~;! +Y#B#B+tusuEiDEiDEiDsssstustu++++tu+++++sssssssssssssssssssssssss+++E@aDstK*SK?QZXE@`DYK:SK?QZX E`DYK.SK:QZXE@`DYK.SK>/Dest[null/XYZ 255 594 0]/Rect[276.98999023 797.05102539 312.55999756 806.25]/Subtype/Link/Type/Annot>> endobj 7 0 obj <>/Dest[null/XYZ 292 420 0]/Rect[435.93899536 797.05102539 539.09997559 806.25]/Subtype/Link/Type/Annot>> endobj 4 0 obj <> endobj xref -0 21 -0000000000 65535 f -0000000016 00000 n -0000000076 00000 n -0000003677 00000 n -0000207694 00000 n -0000003759 00000 n -0000207398 00000 n -0000207546 00000 n -0000003990 00000 n -0000043897 00000 n -0000044367 00000 n -0000045197 00000 n -0000171106 00000 n -0000098380 00000 n -0000045821 00000 n -0000046022 00000 n -0000098358 00000 n -0000098572 00000 n -0000171084 00000 n -0000171288 00000 n -0000207376 00000 n -trailer -<<1B673B0E7C61A749A697ED6E4C8B4F29>]>> -startxref -207920 -%%EOF diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/49 Cyprodinil - EU AIR3 - MCA Section 8 Supplement - Ecotoxicological studies on the active substance_Page61.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/49 Cyprodinil - EU AIR3 - MCA Section 8 Supplement - Ecotoxicological studies on the active substance_Page61.pdf deleted file mode 100644 index 5064ac33..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/49 Cyprodinil - EU AIR3 - MCA Section 8 Supplement - Ecotoxicological studies on the active substance_Page61.pdf +++ /dev/null @@ -1,1414 +0,0 @@ -%PDF-1.5 % -1 0 obj <> endobj 2 0 obj <>stream - - - - - 2023-04-17T10:31:12+02:00 - 2023-04-17T10:31:12+02:00 - 2023-04-17T10:31:12+02:00 - Microsoft Office Word - application/pdf - - - Section 6 M-II ECOTOXICOLOGICAL STUDIES - - - - - Cyprodinil - - - - - Sonia Ellis - - - uuid:ade8325a-b9a3-44c5-9f2c-5ab72db8b048 - uuid:6c934d7f-e146-4b71-b5f3-f9343892f4cb - Aspose.Words for Java 16.7.0.0 - CGA219417_11533 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 5 0 obj <>/MediaBox[0 0 595.45001221 841.70001221]/Parent 3 0 R/Resources<>>>/Type/Page>> endobj 11 0 obj <>stream -1 0 0 -1 0 841.70001221 cm q 1 0 0 1 70.90000153 35.45000076 cm -70.90000153 0 m 524.54998779 0 l 524.54998779 58.04700089 l -70.90000153 58.04700089 l h W n q -1 -1 m 121.5 -1 l 121.5 31.39800262 l -1 31.39800262 l h W n BT /FAAAAH 6 Tf 1 0 0 -1 0 5.62799978 Tm 0 g (Annex)Tj ( )Tj 18.68000031 0 Td (to)Tj ( )Tj 6.67099953 0 Td (Regulation)Tj ( )Tj 30.35500145 0 Td (283/2013)Tj ET Q q 1 0 0 1 120.5 0 cm -1 -1 m 207.75 -1 l 207.75 31.39800262 l -1 31.39800262 l h W n BT /FAAAAH 8 Tf 1 0 0 -1 85.58999634 7.50400019 Tm 0 g (Cyprodinil)Tj ET Q q 1 0 0 1 327.25 0 cm -1 -1 m 141.94999695 -1 l 141.94999695 31.39800262 l -1 31.39800262 l h W n BT /FAAAAH 8 Tf 1 0 0 -1 37.78900146 7.50400019 Tm 0 g (M-CA,)Tj 22.66399765 0 Td ( )Tj 2.22299957 0 Td (Section)Tj ( )Tj 28.9070015 0 Td (8)Tj ( )Tj 6.67199707 0 Td (Supplement)Tj ET q 1 0 0 1 0 15.19900036 cm BT 1 0 0 -1 132.05200195 7.50400019 Tm (61)Tj ET Q Q q 0 G 1.5 w 0 32.64800262 m 468.20001221 32.64800262 l S Q q 0 G 0.75 w 0 30.77300262 m 468.20001221 30.77300262 l S Q q 1 0 0 1 0 33.39799881 cm Q Q q 1 0 0 1 70.90000153 797.05102539 cm -70.90000153 0 m 524.54998779 0 l 524.54998779 9.19900036 l -70.90000153 9.19900036 l h W n BT /FAAAAH 8 Tf 1 0 0 -1 0 7.50400019 Tm 0 g (Syngenta)Tj (/)Tj ( )Tj 38.25099945 0 Td ()Tj ( )Tj ET BT 1 0 0 -1 44.92300034 7.50400019 Tm (8)Tj ( )Tj 6.67200089 0 Td (October)Tj ( )Tj 30.68000031 0 Td (2015)Tj 17.79699707 0 Td ( )Tj 2.22299957 0 Td (updated)Tj ( )Tj 31.14100647 0 Td (20/5/16,)Tj ( )Tj 31.13699341 0 Td (3/2/17,)Tj ( )Tj 26.68800354 0 Td (31/5/17)Tj ET BT 1 0 0 -1 397.07299805 7.50400019 Tm (CGA219417_11533)Tj ET Q q 1 0 0 1 70.90000153 93.49700165 cm q 1 0 0 1 -5.4000001 0 cm q -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 76.49500275 l -0.625 76.49500275 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 37.84899902 10.40200043 Tm 0 g (Control)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.05199814 10.40200043 Tm 0 g (n.a.)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.45199966 10.40200043 Tm 0 g (n.a.)Tj ET Q Q q 1 0 0 1 0 15.09899998 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.72499847 10.40200043 Tm 0 g (0.46)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 41.42499924 10.40200043 Tm 0 g (0.356)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 58.45000076 10.40200043 Tm 0 g (77)Tj ET Q Q Q q 1 0 0 1 0 30.19799995 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 49.34999847 10.40200043 Tm 0 g (1)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 41.42499924 10.40200043 Tm 0 g (0.873)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 58.45000076 10.40200043 Tm 0 g (87)Tj ET Q Q Q q 1 0 0 1 0 45.29700089 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.97499847 10.40200043 Tm 0 g (2.2)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.67499924 10.40200043 Tm 0 g (1.92)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 58.45000076 10.40200043 Tm 0 g (87)Tj ET Q Q Q q 1 0 0 1 0 60.39599991 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 0 -60.39599991 cm -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 76.49500275 l -0.625 76.49500275 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.625 10.40200043 Tm 0 g (1/24)Tj ET Q Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.97499847 10.40200043 Tm 0 g (4.6)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.67499924 10.40200043 Tm 0 g (4.22)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 58.45000076 10.40200043 Tm 0 g (92)Tj ET Q Q Q q 1 0 0 1 0 75.49500275 cm q -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 31.19799995 l -0.625 31.19799995 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 37.84899902 10.40200043 Tm 0 g (Control)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.05199814 10.40200043 Tm 0 g (n.a.)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.45199966 10.40200043 Tm 0 g (n.a.)Tj ET Q Q Q q 1 0 0 1 0 90.59400177 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 0 -15.09899998 cm -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 31.19799995 l -0.625 31.19799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.875 10.40200043 Tm 0 g (1/0)Tj ET Q Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.97499847 10.40200043 Tm 0 g (4.6)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.67499924 10.40200043 Tm 0 g (4.65)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.20000076 10.40200043 Tm 0 g (101)Tj ET Q Q Q q 1 0 0 1 0 105.69300079 cm q -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 31.19799995 l -0.625 31.19799995 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 37.84899902 10.40200043 Tm 0 g (Control)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.05199814 10.40200043 Tm 0 g (n.a.)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.45199966 10.40200043 Tm 0 g (n.a.)Tj ET Q Q Q q 1 0 0 1 0 120.79199982 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 0 -15.09899998 cm -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 31.19799995 l -0.625 31.19799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.625 10.40200043 Tm 0 g (2/24)Tj ET Q Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.97499847 10.40200043 Tm 0 g (4.6)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.67499924 10.40200043 Tm 0 g (4.73)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.20000076 10.40200043 Tm 0 g (103)Tj ET Q Q Q q 1 0 0 1 0 135.89100647 cm q -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 61.39599991 l -0.625 61.39599991 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 37.84899902 10.40200043 Tm 0 g (Control)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.05199814 10.40200043 Tm 0 g (n.a.)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.45199966 10.40200043 Tm 0 g (n.a.)Tj ET Q Q Q q 1 0 0 1 0 150.99000549 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.72499847 10.40200043 Tm 0 g (0.46)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 41.42499924 10.40200043 Tm 0 g (0.498)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.20000076 10.40200043 Tm 0 g (108)Tj ET Q Q Q q 1 0 0 1 0 166.08900452 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 49.34999847 10.40200043 Tm 0 g (1)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.67499924 10.40200043 Tm 0 g (1.08)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.20000076 10.40200043 Tm 0 g (108)Tj ET Q Q Q q 1 0 0 1 0 181.18800354 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 0 -45.29700089 cm -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 61.39599991 l -0.625 61.39599991 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.875 10.40200043 Tm 0 g (3/0)Tj ET Q Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.97499847 10.40200043 Tm 0 g (2.2)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.67499924 10.40200043 Tm 0 g (2.27)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.20000076 10.40200043 Tm 0 g (103)Tj ET Q Q Q q 1 0 0 1 0 196.28700256 cm q -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 61.39599991 l -0.625 61.39599991 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 37.84899902 10.40200043 Tm 0 g (Control)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.05199814 10.40200043 Tm 0 g (n.a.)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 56.45199966 10.40200043 Tm 0 g (n.a.)Tj ET Q Q Q q 1 0 0 1 0 211.38600159 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.72499847 10.40200043 Tm 0 g (0.46)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 41.42499924 10.40200043 Tm 0 g (0.361)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 58.45000076 10.40200043 Tm 0 g (79)Tj ET Q Q Q q 1 0 0 1 0 226.48500061 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 49.34999847 10.40200043 Tm 0 g (1)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 41.42499924 10.40200043 Tm 0 g (0.818)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 58.45000076 10.40200043 Tm 0 g (82)Tj ET Q Q Q q 1 0 0 1 0 241.58399963 cm q -0.625 -1 m 114.67500305 -1 l 114.67500305 16.09899902 l -0.625 16.09899902 l h W n Q q 1 0 0 1 0 -45.29700089 cm -0.625 -0.25 m 114.67500305 -0.25 l 114.67500305 61.39599991 l -0.625 61.39599991 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.625 10.40200043 Tm 0 g (4/24)Tj ET Q Q q 1 0 0 1 114.05000305 0 cm -0.625 -0.25 m 114.625 -0.25 l 114.625 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 45.97499847 10.40200043 Tm 0 g (2.2)Tj ET Q Q q 1 0 0 1 228.05000305 0 cm -0.625 -0.25 m 114.52500153 -0.25 l 114.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 43.67499924 10.40200043 Tm 0 g (1.72)Tj ET Q Q q 1 0 0 1 341.95001221 0 cm -0.625 -0.25 m 137.32499695 -0.25 l 137.32499695 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 58.45000076 10.40200043 Tm 0 g (78)Tj ET Q Q Q q 0 G 0.75 w 0 0.75 m 0 256.68301392 l S Q q 0 G 0.75 w 114.05000305 0.75 m 114.05000305 75.49500275 l S Q q 0 G 0.75 w 114.05000305 76.24500275 m 114.05000305 105.69300079 l S Q q 0 G 0.75 w 114.05000305 106.44300079 m 114.05000305 135.89100647 l S Q q 0 G 0.75 w 114.05000305 136.64100647 m 114.05000305 196.28700256 l S Q q 0 G 0.75 w 114.05000305 197.03700256 m 114.05000305 256.68301392 l S Q q 0 G 0.75 w 228.05000305 0.75 m 228.05000305 15.09899998 l S Q q 0 G 0.75 w 228.05000305 15.84899998 m 228.05000305 30.19799995 l S Q q 0 G 0.75 w 228.05000305 30.94799995 m 228.05000305 45.29700089 l S Q q 0 G 0.75 w 228.05000305 46.04700089 m 228.05000305 60.39599991 l S Q q 0 G 0.75 w 228.05000305 61.14599991 m 228.05000305 75.49500275 l S Q q 0 G 0.75 w 228.05000305 76.24500275 m 228.05000305 90.59400177 l S Q q 0 G 0.75 w 228.05000305 91.34400177 m 228.05000305 105.69300079 l S Q q 0 G 0.75 w 228.05000305 106.44300079 m 228.05000305 120.79199982 l S Q q 0 G 0.75 w 228.05000305 121.54199982 m 228.05000305 135.89100647 l S Q q 0 G 0.75 w 228.05000305 136.64100647 m 228.05000305 150.99000549 l S Q q 0 G 0.75 w 228.05000305 151.74000549 m 228.05000305 166.08900452 l S Q q 0 G 0.75 w 228.05000305 166.83900452 m 228.05000305 181.18800354 l S Q q 0 G 0.75 w 228.05000305 181.93800354 m 228.05000305 196.28700256 l S Q q 0 G 0.75 w 228.05000305 197.03700256 m 228.05000305 211.38600159 l S Q q 0 G 0.75 w 228.05000305 212.13600159 m 228.05000305 226.48500061 l S Q q 0 G 0.75 w 228.05000305 227.23500061 m 228.05000305 241.58399963 l S Q q 0 G 0.75 w 228.05000305 242.33399963 m 228.05000305 256.68301392 l S Q q 0 G 0.75 w 341.95001221 0.75 m 341.95001221 15.09899998 l S Q q 0 G 0.75 w 341.95001221 15.84899998 m 341.95001221 30.19799995 l S Q q 0 G 0.75 w 341.95001221 30.94799995 m 341.95001221 45.29700089 l S Q q 0 G 0.75 w 341.95001221 46.04700089 m 341.95001221 60.39599991 l S Q q 0 G 0.75 w 341.95001221 61.14599991 m 341.95001221 75.49500275 l S Q q 0 G 0.75 w 341.95001221 76.24500275 m 341.95001221 90.59400177 l S Q q 0 G 0.75 w 341.95001221 91.34400177 m 341.95001221 105.69300079 l S Q q 0 G 0.75 w 341.95001221 106.44300079 m 341.95001221 120.79199982 l S Q q 0 G 0.75 w 341.95001221 121.54199982 m 341.95001221 135.89100647 l S Q q 0 G 0.75 w 341.95001221 136.64100647 m 341.95001221 150.99000549 l S Q q 0 G 0.75 w 341.95001221 151.74000549 m 341.95001221 166.08900452 l S Q q 0 G 0.75 w 341.95001221 166.83900452 m 341.95001221 181.18800354 l S Q q 0 G 0.75 w 341.95001221 181.93800354 m 341.95001221 196.28700256 l S Q q 0 G 0.75 w 341.95001221 197.03700256 m 341.95001221 211.38600159 l S Q q 0 G 0.75 w 341.95001221 212.13600159 m 341.95001221 226.48500061 l S Q q 0 G 0.75 w 341.95001221 227.23500061 m 341.95001221 241.58399963 l S Q q 0 G 0.75 w 341.95001221 242.33399963 m 341.95001221 256.68301392 l S Q q 0 G 0.75 w 478.65002441 0.75 m 478.65002441 256.68301392 l S Q q 0 G 0.75 w -0.375 0.375 m 479.02502441 0.375 l S Q q 0 G 0.75 w 114.42500305 15.47399998 m 478.27502441 15.47399998 l S Q q 0 G 0.75 w 114.42500305 30.57299995 m 478.27502441 30.57299995 l S Q q 0 G 0.75 w 114.42500305 45.67200089 m 478.27502441 45.67200089 l S Q q 0 G 0.75 w 114.42500305 60.77099991 m 478.27502441 60.77099991 l S Q q 0 G 0.75 w 0.375 75.87000275 m 478.27502441 75.87000275 l S Q q 0 G 0.75 w 114.42500305 90.96900177 m 478.27502441 90.96900177 l S Q q 0 G 0.75 w 0.375 106.06800079 m 478.27502441 106.06800079 l S Q q 0 G 0.75 w 114.42500305 121.16699982 m 478.27502441 121.16699982 l S Q q 0 G 0.75 w 0.375 136.26600647 m 478.27502441 136.26600647 l S Q q 0 G 0.75 w 114.42500305 151.36500549 m 478.27502441 151.36500549 l S Q q 0 G 0.75 w 114.42500305 166.46400452 m 478.27502441 166.46400452 l S Q q 0 G 0.75 w 114.42500305 181.56300354 m 478.27502441 181.56300354 l S Q q 0 G 0.75 w 0.375 196.66200256 m 478.27502441 196.66200256 l S Q q 0 G 0.75 w 114.42500305 211.76100159 m 478.27502441 211.76100159 l S Q q 0 G 0.75 w 114.42500305 226.86000061 m 478.27502441 226.86000061 l S Q q 0 G 0.75 w 114.42500305 241.95899963 m 478.27502441 241.95899963 l S Q q 0 G 0.75 w -0.375 257.05801392 m 479.02502441 257.05801392 l S Q Q q 1 0 0 1 0 257.43301392 cm Q q 1 0 0 1 0 270.08200073 cm BT /FAAABC 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (The)Tj ( )Tj (median)Tj 52.22900009 0 Td ( )Tj (lethal)Tj ( )Tj (concentration)Tj 89.79399109 0 Td ( )Tj (\(LC)Tj /FAAABC 7 Tf 20.4690094 -1.64999962 TD (50)Tj /FAAABC 11 Tf 7 1.64999962 TD (\))Tj ( )Tj (was)Tj ( )Tj (defined)Tj ( )Tj (as)Tj ( )Tj (the)Tj ( )Tj (concentration)Tj 149.96600342 0 TD ( )Tj (resulting)Tj ( )Tj (in)Tj ( )Tj (50%)Tj ( )Tj (mortality)Tj ( )Tj (of)Tj 130.45300293 0 Td ( )Tj (the)Tj ( )Tj -449.91101074 -12.64900017 TD (fish)Tj ( )Tj (in)Tj ( )Tj (the)Tj ( )Tj (time)Tj ( )Tj (period)Tj 97.14700317 0 TD ( )Tj (specified)Tj ( )Tj (and)Tj 61.08499146 0 Td ( )Tj (was)Tj 19.85700989 0 Td ( )Tj (calculated)Tj ( )Tj (as)Tj ( )Tj (the)Tj ( )Tj 78.1809845 0 Td (geometric)Tj ( )Tj (mean)Tj ( )Tj (of)Tj ( )Tj (the)Tj ( )Tj (two)Tj ( )Tj (consecutive)Tj ( )Tj (test)Tj 190.59802246 0 Td ( )Tj -446.86801147 -12.64900017 TD (concentrations)Tj ( )Tj (with)Tj ( )Tj (0)Tj ( )Tj (and)Tj ( )Tj (100%)Tj ( )Tj (mortality,)Tj ( )Tj (and)Tj ( )Tj (the)Tj ( )Tj (95%)Tj ( )Tj (confidence)Tj ( )Tj (limits)Tj ( )Tj (as)Tj ( )Tj (the)Tj ( )Tj (test)Tj 370.23901367 0 TD ( )Tj (concentrations)Tj ( )Tj (with)Tj ( )Tj (0)Tj ( )Tj -370.23901367 -12.64899826 TD (and)Tj ( )Tj (100%)Tj ( )Tj (mortality.)Tj ( )Tj (The)Tj ( )Tj (NOEC)Tj 142.66700745 0 TD ( )Tj (\(No)Tj ( )Tj (Observed)Tj ( )Tj (Effect)Tj 94.375 0 Td ( )Tj (Concentration\))Tj ( )Tj (is)Tj ( )Tj (defined)Tj ( )Tj (as)Tj ( )Tj (the)Tj ( )Tj (highest)Tj ( )Tj (tested)Tj 205.58399963 0 Td ( )Tj -442.62600708 -12.64900208 TD (concentration)Tj ( )Tj (which)Tj ( )Tj (did)Tj 106.2990036 0 TD ( )Tj (not)Tj ( )Tj (produce)Tj ( )Tj (an)Tj 68.11598969 0 Td ( )Tj (adverse)Tj ( )Tj (effect)Tj ( )Tj (when)Tj ( )Tj (compared)Tj ( )Tj (to)Tj ( )Tj (the)Tj 164.30601501 0 Td ( )Tj (control)Tj ( )Tj (and)Tj ( )Tj (was)Tj 72.39700317 0 Td ( )Tj (determined)Tj 52.22897339 0 Td ( )Tj -463.34698486 -12.64899826 TD (by)Tj ( )Tj (visual)Tj ( )Tj (inspection)Tj ( )Tj (of)Tj ( )Tj (the)Tj ( )Tj (data.)Tj ( )Tj (Mortalities)Tj ( )Tj (were)Tj ( )Tj (observed)Tj ( )Tj (at)Tj 270.94900513 0 TD ( )Tj (the)Tj ( )Tj (highest)Tj ( )Tj (geometric)Tj ( )Tj (mean)Tj 124.01300049 0 Td ( )Tj (measured)Tj ( )Tj -394.96200562 -12.64900208 TD (concentration)Tj ( )Tj (tested)Tj ( )Tj (\(4.5)Tj ( )Tj (mg)Tj ( )Tj (CGA219417/L.)Tj ( )Tj ET Q q 1 0 0 1 0 370.625 cm BT /FAAABC 11 Tf 1 0 0 -1 0 10.27000046 Tm 0 g (Symptoms)Tj ( )Tj (of)Tj 58.97999954 0 Td ( )Tj (toxicity)Tj ( )Tj (observed)Tj ( )Tj (at)Tj ( )Tj (2.1)Tj ( )Tj (mg/L)Tj ( )Tj (and)Tj ( )Tj (above)Tj ( )Tj (during)Tj ( )Tj (the)Tj ( )Tj (study)Tj ( )Tj (included)Tj ( )Tj (strong)Tj ( )Tj (ventilation,)Tj ( )Tj -58.97999954 -12.64900017 TD (tumbling)Tj ( )Tj (during)Tj ( )Tj (swimming,)Tj 123.14299774 0 TD ( )Tj (apathy,)Tj 34.82100677 0 Td ( )Tj (fish)Tj ( )Tj (mainly)Tj ( )Tj (on)Tj ( )Tj (the)Tj ( )Tj (bottom)Tj ( )Tj (of)Tj ( )Tj (the)Tj ( )Tj (vessel)Tj 174.13999939 0 Td ( )Tj (lying)Tj ( )Tj (on)Tj ( )Tj (their)Tj ( )Tj (sides)Tj ( )Tj (or)Tj ( )Tj (backs.)Tj ( )Tj -332.10400391 -12.64900017 TD (No)Tj ( )Tj (mortality)Tj ( )Tj (or)Tj ( )Tj (symptoms)Tj 116.41300201 0 TD ( )Tj (of)Tj ( )Tj (toxicity)Tj ( )Tj (were)Tj ( )Tj (observed)Tj ( )Tj (in)Tj ( )Tj (the)Tj ( )Tj (negative)Tj ( )Tj (control)Tj 216.26101685 0 Td ( )Tj (or)Tj ( )Tj (solvent)Tj ( )Tj (control.)Tj ( )Tj (The)Tj 105.69799805 0 Td ( )Tj -438.37200928 -12.64899826 TD (mortality)Tj ( )Tj (data)Tj ( )Tj (and)Tj 80.02899933 0 TD ( )Tj (estimated)Tj ( )Tj (LC)Tj /FAAABC 7 Tf 61.70800018 -1.64999771 TD (50)Tj /FAAABC 11 Tf 7 1.64999771 TD ( )Tj (values)Tj ( )Tj (are)Tj ( )Tj (shown)Tj ( )Tj (in)Tj ( )Tj (the)Tj 105.99899292 0 TD ( )Tj (table)Tj ( )Tj (below:)Tj ET Q q 1 0 0 1 0 433.2210083 cm q 1 1 0 rg 54.46699905 0 m 60.02899933 0 l 60.02899933 11.4989996 l 54.46699905 11.4989996 l h f* Q q 1 1 0 rg 60.02899933 0 m 65.59099579 0 l 65.59099579 11.4989996 l 60.02899933 11.4989996 l h f* Q BT /FAAABF 10 Tf 1 0 0 -1 0 9.38000011 Tm 0 g (Table)Tj ( )Tj 28.89599991 0 Td (8.2.1-)Tj (2)Tj (8)Tj 36.69500351 0 Td (:)Tj 3.3299942 0 Td ( )Tj 2.77799988 0 Td (Effects)Tj ( )Tj 36.1230011 0 Td (of)Tj 9.43800354 0 Td ( )Tj 2.77799988 0 Td (CGA219417)Tj ( )Tj 58.36899567 0 Td (on)Tj ( )Tj 14.99499512 0 Td (the)Tj ( )Tj 17.77799988 0 Td (survival)Tj ( )Tj 40.58100891 0 Td (of)Tj ( )Tj 12.21598816 0 Td (carp)Tj ET q 0 G 0.5 w 54.46699905 7.07999992 m 60.02899933 7.07999992 l S Q Q q 1 0 0 1 -5.4000001 450.72000122 cm q -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 40.79700089 l -0.625 40.79700089 l h W n Q q 1 0 0 1 90.40000153 0 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 40.79700089 l -0.625 40.79700089 l h W n Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 295.9750061 -0.25 l 295.9750061 26.44799995 l -0.625 26.44799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAABCC 9 Tf 1 0 0 -1 40.28499985 10.40200043 Tm 0 g (Mortality)Tj ( )Tj (observed)Tj ( )Tj (\(cumulative)Tj ( )Tj (number)Tj ( )Tj (of)Tj 163.97200012 0 Td ( )Tj (dead)Tj 20.75498962 0 Td ( )Tj (fish\))Tj -95.30099487 -10.34899902 TD (\(n)Tj ( )Tj (=)Tj ( )Tj (7\))Tj ET Q Q q 1 0 0 1 0 25.44799995 cm q -0.625 -1 m 91.02500153 -1 l 91.02500153 15.34899902 l -0.625 15.34899902 l h W n Q q 1 0 0 1 0 -25.44799995 cm -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 40.79700089 l -0.625 40.79700089 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAABCC 9 Tf 1 0 0 -1 23.29800034 10.40200043 Tm 0 g (Nominal)Tj ( )Tj -11.74400043 -10.34899902 TD (concentrations)Tj ( )Tj -9.62599945 -10.34900093 TD (\(mg)Tj ( )Tj (CGA219417/L\))Tj ET Q Q q 1 0 0 1 90.40000153 0 cm -0.625 -1 m 93.52500153 -1 l 93.52500153 15.34899902 l -0.625 15.34899902 l h W n Q q 1 0 0 1 90.40000153 -25.44799995 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 40.79700089 l -0.625 40.79700089 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAABCC 9 Tf 1 0 0 -1 10.18000031 10.40200043 Tm 0 g (Mean)Tj 21.99499893 0 Td ( )Tj (measured)Tj ( )Tj -19.37099838 -10.34899902 TD (concentrations)Tj ( )Tj -9.62599945 -10.34900093 TD (\(mg)Tj ( )Tj (CGA219417/L\))Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -1 m 57.27500153 -1 l 57.27500153 15.34899902 l -0.625 15.34899902 l h W n q 1 0 0 1 5.4000001 0 cm BT /FAABCC 9 Tf 1 0 0 -1 6.92199993 10.40200043 Tm 0 g (2.5)Tj ( )Tj (hour)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -1 m 57.375 -1 l 57.375 15.34899902 l -0.625 15.34899902 l h W n q 1 0 0 1 5.4000001 0 cm BT /FAABCC 9 Tf 1 0 0 -1 6.34600019 10.40200043 Tm 0 g (24)Tj 9 0 Td ( )Tj (hours)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -1 m 64.17500305 -1 l 64.17500305 15.34899902 l -0.625 15.34899902 l h W n q 1 0 0 1 5.4000001 0 cm BT /FAABCC 9 Tf 1 0 0 -1 9.74600029 10.40200043 Tm 0 g (48)Tj ( )Tj (hours)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -1 m 57.27500153 -1 l 57.27500153 15.34899902 l -0.625 15.34899902 l h W n q 1 0 0 1 5.4000001 0 cm BT /FAABCC 9 Tf 1 0 0 -1 6.296 10.40200043 Tm 0 g (72)Tj ( )Tj (hours)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -1 m 62.375 -1 l 62.375 15.34899902 l -0.625 15.34899902 l h W n q 1 0 0 1 5.4000001 0 cm BT /FAABCC 9 Tf 1 0 0 -1 8.84599972 10.40200043 Tm 0 g (96)Tj ( )Tj (hours)Tj ET Q Q Q q 1 0 0 1 0 39.79700089 cm q -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 26.44799995 l -0.625 26.44799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 13.68099976 10.40200043 Tm 0 g (Dilution)Tj ( )Tj (water)Tj ( )Tj 13.37199974 -10.34899902 TD (control)Tj ET Q Q q 1 0 0 1 90.40000153 0 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 26.44799995 l -0.625 26.44799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 1.05999994 15.57600021 Tm 0 g (Dilution)Tj 30.00100136 0 Td ( )Tj (water)Tj ( )Tj (control)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 26.44799995 l -0.625 26.44799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 15.57600021 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 26.44799995 l -0.625 26.44799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.72500038 15.57600021 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 26.44799995 l -0.625 26.44799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 24.125 15.57600021 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 26.44799995 l -0.625 26.44799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 15.57600021 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 26.44799995 l -0.625 26.44799995 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 23.22500038 15.57600021 Tm 0 g (0)Tj ET Q Q Q q 1 0 0 1 0 65.24500275 cm q -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 12.17800045 10.40200043 Tm 0 g (Solvent)Tj ( )Tj (control)Tj ET Q Q q 1 0 0 1 90.40000153 0 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 13.42800045 10.40200043 Tm 0 g (Solvent)Tj ( )Tj (control)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.72500038 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 24.125 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 23.22500038 10.40200043 Tm 0 g (0)Tj ET Q Q Q q 1 0 0 1 0 80.34400177 cm q -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 31.92499924 10.40200043 Tm 0 g (0.10)Tj ET Q Q q 1 0 0 1 90.40000153 0 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 34.55199814 10.40200043 Tm 0 g (n.a.)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.72500038 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 24.125 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 23.22500038 10.40200043 Tm 0 g (0)Tj ET Q Q Q q 1 0 0 1 0 95.44300079 cm q -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 31.92499924 10.40200043 Tm 0 g (0.22)Tj ET Q Q q 1 0 0 1 90.40000153 0 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 34.55199814 10.40200043 Tm 0 g (n.a.)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.72500038 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 24.125 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 23.22500038 10.40200043 Tm 0 g (0)Tj ET Q Q Q q 1 0 0 1 0 110.54199982 cm q -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 31.92499924 10.40200043 Tm 0 g (0.46)Tj ET Q Q q 1 0 0 1 90.40000153 0 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 33.17499924 10.40200043 Tm 0 g (0.42)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.72500038 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 24.125 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 23.22500038 10.40200043 Tm 0 g (0)Tj ET Q Q Q q 1 0 0 1 0 125.64099884 cm q -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 34.17499924 10.40200043 Tm 0 g (1.0)Tj ET Q Q q 1 0 0 1 90.40000153 0 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 33.17499924 10.40200043 Tm 0 g (0.95)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.72500038 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 24.125 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 23.22500038 10.40200043 Tm 0 g (0)Tj ET Q Q Q q 1 0 0 1 0 140.74000549 cm q -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 34.17499924 10.40200043 Tm 0 g (2.2)Tj ET Q Q q 1 0 0 1 90.40000153 0 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 35.42499924 10.40200043 Tm 0 g (2.1)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.72500038 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 24.125 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 23.22500038 10.40200043 Tm 0 g (0)Tj ET Q Q Q q 1 0 0 1 0 155.83900452 cm q -0.625 -0.25 m 91.02500153 -0.25 l 91.02500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 34.17499924 10.40200043 Tm 0 g (4.6)Tj ET Q Q q 1 0 0 1 90.40000153 0 cm -0.625 -0.25 m 93.52500153 -0.25 l 93.52500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 35.42499924 10.40200043 Tm 0 g (4.6)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (0)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.72500038 10.40200043 Tm 0 g (4)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 24.125 10.40200043 Tm 0 g (7)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.67499924 10.40200043 Tm 0 g (7)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 23.22500038 10.40200043 Tm 0 g (7)Tj ET Q Q Q q 1 0 0 1 0 170.93800354 cm q -0.625 -0.25 m 183.92500305 -0.25 l 183.92500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 39.5019989 10.40200043 Tm 0 g (LC)Tj /FAAABC 6 Tf 11.5 -1.34999943 TD (50)Tj /FAAABC 9 Tf 6 1.34999943 TD ( )Tj (\(mg)Tj ( )Tj (CGA219417/L\))Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 14.76200008 10.40200043 Tm 0 g (>4.5)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 17.35000038 10.40200043 Tm 0 g (4.1)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.75 10.40200043 Tm 0 g (3.0)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 17.29999924 10.40200043 Tm 0 g (3.0)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 19.85000038 10.40200043 Tm 0 g (3.0)Tj ET Q Q Q q 1 0 0 1 0 186.03700256 cm q -0.625 -0.25 m 183.92500305 -0.25 l 183.92500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 42.26900101 10.40200043 Tm 0 g (95%)Tj ( )Tj (confidence)Tj 58.22299576 0 Td ( )Tj (interval)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 21.4260006 10.40200043 Tm 0 g (-)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 16.22500038 10.40200043 Tm 0 g (n.d.)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 10.625 10.40200043 Tm 0 g (2.1)Tj ( )Tj ()Tj ( )Tj (4.5)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 7.17500019 10.40200043 Tm 0 g (2.1)Tj ( )Tj ()Tj ( )Tj (4.5)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 9.72500038 10.40200043 Tm 0 g (2.1)Tj ( )Tj ()Tj ( )Tj (4.5)Tj ET Q Q Q q 1 0 0 1 0 201.13600159 cm q -0.625 -0.25 m 183.92500305 -0.25 l 183.92500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 74 10.40200043 Tm 0 g (NOEC)Tj ET Q Q q 1 0 0 1 183.30000305 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 21.4260006 10.40200043 Tm 0 g (-)Tj ET Q Q q 1 0 0 1 239.94999695 0 cm -0.625 -0.25 m 57.375 -0.25 l 57.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 17.35000038 10.40200043 Tm 0 g (2.1)Tj ET Q Q q 1 0 0 1 296.70001221 0 cm -0.625 -0.25 m 64.17500305 -0.25 l 64.17500305 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 20.75 10.40200043 Tm 0 g (2.1)Tj ET Q Q q 1 0 0 1 360.25 0 cm -0.625 -0.25 m 57.27500153 -0.25 l 57.27500153 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 17.29999924 10.40200043 Tm 0 g (2.1)Tj ET Q Q q 1 0 0 1 416.8999939 0 cm -0.625 -0.25 m 62.375 -0.25 l 62.375 16.09899902 l -0.625 16.09899902 l h W n q 1 0 0 1 5.4000001 0.75 cm BT /FAAABC 9 Tf 1 0 0 -1 19.85000038 10.40200043 Tm 0 g (2.1)Tj ET Q Q Q q 0 G 0.75 w 0 0.75 m 0 216.23500061 l S Q q 0 G 0.75 w 90.40000153 0.75 m 90.40000153 39.79700089 l S Q q 0 G 0.75 w 90.40000153 40.54700089 m 90.40000153 65.24500275 l S Q q 0 G 0.75 w 90.40000153 65.99500275 m 90.40000153 80.34400177 l S Q q 0 G 0.75 w 90.40000153 81.09400177 m 90.40000153 95.44300079 l S Q q 0 G 0.75 w 90.40000153 96.19300079 m 90.40000153 110.54199982 l S Q q 0 G 0.75 w 90.40000153 111.29199982 m 90.40000153 125.64099884 l S Q q 0 G 0.75 w 90.40000153 126.39099884 m 90.40000153 140.74000549 l S Q q 0 G 0.75 w 90.40000153 141.49000549 m 90.40000153 155.83900452 l S Q q 0 G 0.75 w 90.40000153 156.58900452 m 90.40000153 170.93800354 l S Q q 0 G 0.75 w 183.30000305 0.75 m 183.30000305 39.79700089 l S Q q 0 G 0.75 w 183.30000305 40.54700089 m 183.30000305 65.24500275 l S Q q 0 G 0.75 w 183.30000305 65.99500275 m 183.30000305 80.34400177 l S Q q 0 G 0.75 w 183.30000305 81.09400177 m 183.30000305 95.44300079 l S Q q 0 G 0.75 w 183.30000305 96.19300079 m 183.30000305 110.54199982 l S Q q 0 G 0.75 w 183.30000305 111.29199982 m 183.30000305 125.64099884 l S Q q 0 G 0.75 w 183.30000305 126.39099884 m 183.30000305 140.74000549 l S Q q 0 G 0.75 w 183.30000305 141.49000549 m 183.30000305 155.83900452 l S Q q 0 G 0.75 w 183.30000305 156.58900452 m 183.30000305 170.93800354 l S Q q 0 G 0.75 w 183.30000305 171.68800354 m 183.30000305 186.03700256 l S Q q 0 G 0.75 w 183.30000305 186.78700256 m 183.30000305 201.13600159 l S Q q 0 G 0.75 w 183.30000305 201.88600159 m 183.30000305 216.23500061 l S Q q 0 G 0.75 w 478.65002441 0.75 m 478.65002441 216.23500061 l S Q q 0 G 0.75 w 239.95001221 25.44799995 m 239.95001221 39.79700089 l S Q q 0 G 0.75 w 239.95001221 40.54700089 m 239.95001221 65.24500275 l S Q q 0 G 0.75 w 239.95001221 65.99500275 m 239.95001221 80.34400177 l S Q q 0 G 0.75 w 239.95001221 81.09400177 m 239.95001221 95.44300079 l S Q q 0 G 0.75 w 239.95001221 96.19300079 m 239.95001221 110.54199982 l S Q q 0 G 0.75 w 239.95001221 111.29199982 m 239.95001221 125.64099884 l S Q q 0 G 0.75 w 239.95001221 126.39099884 m 239.95001221 140.74000549 l S Q q 0 G 0.75 w 239.95001221 141.49000549 m 239.95001221 155.83900452 l S Q q 0 G 0.75 w 239.95001221 156.58900452 m 239.95001221 170.93800354 l S Q q 0 G 0.75 w 239.95001221 171.68800354 m 239.95001221 186.03700256 l S Q q 0 G 0.75 w 239.95001221 186.78700256 m 239.95001221 201.13600159 l S Q q 0 G 0.75 w 239.95001221 201.88600159 m 239.95001221 216.23500061 l S Q q 0 G 0.75 w 296.70001221 25.44799995 m 296.70001221 39.79700089 l S Q q 0 G 0.75 w 296.70001221 40.54700089 m 296.70001221 65.24500275 l S Q q 0 G 0.75 w 296.70001221 65.99500275 m 296.70001221 80.34400177 l S Q q 0 G 0.75 w 296.70001221 81.09400177 m 296.70001221 95.44300079 l S Q q 0 G 0.75 w 296.70001221 96.19300079 m 296.70001221 110.54199982 l S Q q 0 G 0.75 w 296.70001221 111.29199982 m 296.70001221 125.64099884 l S Q q 0 G 0.75 w 296.70001221 126.39099884 m 296.70001221 140.74000549 l S Q q 0 G 0.75 w 296.70001221 141.49000549 m 296.70001221 155.83900452 l S Q q 0 G 0.75 w 296.70001221 156.58900452 m 296.70001221 170.93800354 l S Q q 0 G 0.75 w 296.70001221 171.68800354 m 296.70001221 186.03700256 l S Q q 0 G 0.75 w 296.70001221 186.78700256 m 296.70001221 201.13600159 l S Q q 0 G 0.75 w 296.70001221 201.88600159 m 296.70001221 216.23500061 l S Q q 0 G 0.75 w 360.25 25.44799995 m 360.25 39.79700089 l S Q q 0 G 0.75 w 360.25 40.54700089 m 360.25 65.24500275 l S Q q 0 G 0.75 w 360.25 65.99500275 m 360.25 80.34400177 l S Q q 0 G 0.75 w 360.25 81.09400177 m 360.25 95.44300079 l S Q q 0 G 0.75 w 360.25 96.19300079 m 360.25 110.54199982 l S Q q 0 G 0.75 w 360.25 111.29199982 m 360.25 125.64099884 l S Q q 0 G 0.75 w 360.25 126.39099884 m 360.25 140.74000549 l S Q q 0 G 0.75 w 360.25 141.49000549 m 360.25 155.83900452 l S Q q 0 G 0.75 w 360.25 156.58900452 m 360.25 170.93800354 l S Q q 0 G 0.75 w 360.25 171.68800354 m 360.25 186.03700256 l S Q q 0 G 0.75 w 360.25 186.78700256 m 360.25 201.13600159 l S Q q 0 G 0.75 w 360.25 201.88600159 m 360.25 216.23500061 l S Q q 0 G 0.75 w 416.8999939 25.44799995 m 416.8999939 39.79700089 l S Q q 0 G 0.75 w 416.8999939 40.54700089 m 416.8999939 65.24500275 l S Q q 0 G 0.75 w 416.8999939 65.99500275 m 416.8999939 80.34400177 l S Q q 0 G 0.75 w 416.8999939 81.09400177 m 416.8999939 95.44300079 l S Q q 0 G 0.75 w 416.8999939 96.19300079 m 416.8999939 110.54199982 l S Q q 0 G 0.75 w 416.8999939 111.29199982 m 416.8999939 125.64099884 l S Q q 0 G 0.75 w 416.8999939 126.39099884 m 416.8999939 140.74000549 l S Q q 0 G 0.75 w 416.8999939 141.49000549 m 416.8999939 155.83900452 l S Q q 0 G 0.75 w 416.8999939 156.58900452 m 416.8999939 170.93800354 l S Q q 0 G 0.75 w 416.8999939 171.68800354 m 416.8999939 186.03700256 l S Q q 0 G 0.75 w 416.8999939 186.78700256 m 416.8999939 201.13600159 l S Q q 0 G 0.75 w 416.8999939 201.88600159 m 416.8999939 216.23500061 l S Q q 0 G 0.75 w -0.375 0.375 m 479.02502441 0.375 l S Q q 0 G 0.75 w 0.375 40.17200089 m 478.27502441 40.17200089 l S Q q 0 G 0.75 w 0.375 65.62000275 m 478.27502441 65.62000275 l S Q q 0 G 0.75 w 0.375 80.71900177 m 478.27502441 80.71900177 l S Q q 0 G 0.75 w 0.375 95.81800079 m 478.27502441 95.81800079 l S Q q 0 G 0.75 w 0.375 110.91699982 m 478.27502441 110.91699982 l S Q q 0 G 0.75 w 0.375 126.01599884 m 478.27502441 126.01599884 l S Q q 0 G 0.75 w 0.375 141.11500549 m 478.27502441 141.11500549 l S Q q 0 G 0.75 w 0.375 156.21400452 m 478.27502441 156.21400452 l S Q q 0 G 0.75 w 0.375 171.31300354 m 478.27502441 171.31300354 l S Q q 0 G 0.75 w 0.375 186.41200256 m 478.27502441 186.41200256 l S Q q 0 G 0.75 w 0.375 201.51100159 m 478.27502441 201.51100159 l S Q q 0 G 0.75 w -0.375 216.61000061 m 479.02502441 216.61000061 l S Q Q Q 1 0 0 -1 0 841.70001221 cm -endstream endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>stream - POS/2cZ`cmap5<cvt t,fpgm7x ?glyfD}*headƧp6hhea$hmtx`@locaЎ Dmaxp ]P namekp#post$\ prep_`(|hj3%3f.xC TMC kF3!@L   #%&()*+,-./0123456789:=ABCDEFGHIKLMNOPRSTUVWXY[]abcdefghijklmnopqrstuvwxyz  #%&()*+,-./0123456789:=ABCDEFGHIKLMNOPRSTUVWXY[]abcdefghijklmnopqrstuvwxyz  # :LLJk#j$$%$]E.X9K -(#KPJ 1F%O"NAGi@'LHQP.;L -#"sZPRn\Z[In~`5br(8 n+F@h33n5C4\]|(;H{7cx!z'4RFTm?N+En!I{nc(i~?2&5@EIWl&@[{w~(8/@FM~{/h   37x{#Xby!$]ehj /7?PW\@!$0MM]fz|/=JP_f|*D!a +3%?CZk"#',?WXw ""*6J\ -#Axy22%i54BHJWdqqrvwzz"#07C[`exxxx{-AGJP[]]_c'Eg&AHk2HI_c -6PT' M)[/td_|D= -a6;Pyd_UVCFJ]e7td %/B?v:7Q)?VN/4$4Z#/DtAPOQRIn{{j"% L}4mi jj88bZDmHm@@\Y+L@ HHd%2v1x - cB,4A8HXlYCp(7BPZdsx\,cAKU_s Ad*8t,@ - ,;DVcWd6P9ND$B"`9,N8iT=qAPO5G9P+WUs\rXDp@BUT@?>=<;:987543210/.-,+*)('&%$#"!  - ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y QX# D#Y!!-, EhD ` EFvhE`D-, -C#Ce --, - C#C -,#p>#pE: -,E#DE#D-, E%EadPQXED!!Y-,Cc#b#B+-, EC`D-,CCe --, i@a ,b`+ d#da\XaY-,E+#Dz-,E+#D-,CXE+#DzEi #D QX+#Dz!zYY-,-,%F`F@aH-,KS \XYXY-, %E#DE#DEe#E %`j #B#hj`a Ry!@E TX#!?#YaDRy@ E TX#!?#YaD-,C#C -,C#C -, C#C -, C#Ce -,C#Ce -,C#Ce -,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KdQXEi C`:!!!Y-,%# `#-,%# a#-,%-, ` <<-, a <<-,++**-,CC -,>**-,5-,v#p E PXaY:/-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,&&&&Eh:-,&&&&Ehe:-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CXY-,CXY-,KTC\ZX8!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,KS#KQZX:+!!Y-,KS#KQZX;+!!Y-,KS#KQZC\ZX8!!Y-, KT&KTZ -C\ZX8!!Y-,F#F`F# F`ab# #''pE` PXaFY`h:-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYY-,CTXKS#KQZX8!!Y!!!!Y-B@ -A %V+<pO jB+9%% c:)%% B-Pk @3hh -  '''( - -4 -4 -4 -4 -4@d -4 -4 -4      -   ffxw vv V55  nX+NMCX@M@/ ?  M]N]qM]@M@/ ?  MN]qMY??10KSyQCy@<%&& %& %%%% % % -%%++<+<+++++*+++++]q]C\X9@ 99 99 9 9 9++++++++Y++++++++q]$! '&"32765&DȞ8aOzUgEXbd_ n .Lt2@  nKn)'@ - & 9  ? "$4 4+144+5+4+4+@'4+ +  4))""##$)@# -2@) / >4U>@?>@9>@&'4>@4>@40>>4>@@47 /@/14@ +1/E&H ?H@ - ? HHH:@2? ::2rr/@),B@ ?B@ ?/BBBBH!@ ?@ ?/@&402?4444@!&+,@2?,@()4,@#%4,o,,P,,,wM8U+]q+++<]q+]]++]]++]q<q+]++??<+<9/9+/CTX@!4+Y+]++++++CTX>%'4>4++Y99999999910]q]+!##"'"372#"&&5467&5467&&54632"32654'&"32654'&&;1oJr-=7>OqhU~ZE^jsx]J:PO6uonA053SJC\1<\@9 92@@aK59~-<--!-5- 5EJJI5Xf5 3>-1>P>c`>r:> -P>t;H;@89;23 +,(+,%+,)<3333=3M3}33333333 p33;@ U!eu;Lz p &++,))f/;H2]//@)+4_o@4 ,,/,?,,D)C%%%  U/ ?       @@>>@>`>>@(P(?+7772@#%4o0@P`=8U1+N]q+Mqq+]]q]]r+<]]??9+/]q+<9]qr+9]qr9999<<<]+rCTX ]Y10Cy@28:# -%&!% &9& "#:7  -" 8;++++<+++++++rq]rq]q+q+++%#"&546%54&&#"#"&546632327#"&'32IPj5@(A*&I;?Urn - 2kDPZ -y;'!-2iOk^j7)+(1EL3HFqB*@!%JCK9GQ67.#F7+ 9 -@8K5P-%5F!+!+$@"&$!#" -$##$ @#'$+##!  -f_@V5y+ -  *@!A?@=5 @EG4@C5@9:4@564@014@+-4@'(4@"$4@4@4@--/-p--@>5-9:4-564-014-,.4-'(4-4-@4-*''&@!A?&/&&&&7:4&/14&@ $4&,N+N+++]q+'5+VJ'5';'>yNGeK9l5$$%cs.Bl[@@ZZ@@[;c7$$"c"c7%Q2@\ 0? ))%&)%*86* #$ # #   ) G K @ @ 2@ ?@ ?E@/@ 4/+ ?k@&+& @4[! U!@ - U!!!@ 4!!!"@:2?4/4O4_4o4444 U U@ 4")(2?((@ 4(38q+N+q+M]+q++C\X ?@2?@!?<#?<%?@ ?++++++YN]qr+M]+q++C\X!  ?!@ ?!^2?!!?!#?!%?! ?+++++++Y+qC\X@@(?@?@?@?@ ?+++++Y?C\X? ? ??++++Y?C\X@? ? ??++++Y]++C\X@/@ -?/@ ?/@ ?+++Y]++C\X%-? г? @ ?%-? @ ?%- ?%?% ? !?+++++++++Yq10q]]]+#&&#"#"'&#"#332654&'&'&546323267"=A): &]NVCp !!"-F0=54&&#"!567654&'5MNZz!PPas-'>9++X-A'-/(!/5'>;'>{TCTVZPYl4$$'a}D!?? -e%$$#1R@$K -c?$$ lj4%J L "4"@;4 "@"P""0"@" "" "#( p*@"   > P  P*!nX+]q<]q<]<]<?W&Lo!h4'%%"f:QoO] 5@XK]ohey% -  -"@4Vfo"w"  * + ] F(& @ 2?@"4i2? 4@5/"?"_""" )22??&04@ 4!8+N]++++M]N]++q+M++<??<<]q10Cy@%++++*+]+q]q!3267#"'&54324&'&#"] ZEa9.:De1EhSgG42=(6&H%%"&p;%,%%=K.B13IVgX[jMC27Vb6#49&@eA_H4%%!`c7%{H /儎{"z9TY;)L1N@  303p33 y -t|. - - - E@3P3y - - -3@ ?   Q  ""+Q11,+Q! )"#  +.1(). )O?Oo23++/+?+O+_+o+++++p@33   >! 2=+Nz4Ak*&J !T@' W& &  @@2?@&+4#K5#G5#?5#9=4#@$(+4###@#`###@###@  2? &+4 4 "#'58q++N+++]M]N]qr+++++q++M?<5$9:4$014$,.4$*5$'(4$4$@4$$$/$p$$*!A?7:4/14*5@$4/#N+N]q+++++})$(8'>$k5$}PIasj4%d:Oj4%BBk-+@\@/$*+)  + $"$#?2&-,+ -/@?////@04)"@4")/--))*  ) ? @/)24  0   `   /0/./!d++qN]qr++M<qq]<q++NEeD]+?5#535'4632#"&547654'&#"3 V?5Ӵ{wJ=4= 'Ew^%$$0LbE/\8-B6!  -05wbF8L,߹ 9.@/K54FP..& ", ",$@"'$"#" $ ##$!@c#($,##",f"!! -  *@!A?@EG4@=5@C5@9:4@014@'(4@+-4@"$4@4@4 @.../.p..@>5.9:4.014.'(4.4.,.4.@4.*('@!A?'/''''7:4'/14'"$4'@ !4'-N+N++++]q+LQCdk5$$!et;!7E d"$$ kj4%DL.@C 9   &"""#7U d s w    (CTX@!*))0/%-.  "%$$ -?<??999/<@s$.$.0# -  -)$$#"  $###*$.##F^ 0. - r[(@$$# -0000D - p) - -r@Pw***)@!4/)))))/0!N++N]+;'>LA:$%%3d"$$>;k5$$ kj4%&L#-x@?Ur##KGG"ac"0/gww"##// մ""մ"# @9"#-#"##"###*!""""P""""*"#&%.@#$-. !!"" !@ ***@ $%%- P  }.=+]<]<<<]<?<<<?<<9/<<99qr]999].+]}+++10Cy@ ',%&(%,*/'*/+-/)&/<+++++++]]]C\X(@ 9+ 9>+++Y]]3!526654&!2!326654&# D]J^CD]vlE|F@)6UKY9Ojn9"%%#8npn9"%D{b>5Y%j3kN_#@m$ Y # -,*Wf gv v -r#%!& !H +2?@ 4%%%22?(+4@ 4$8+N+]++M]N]]q++Mr??q<999]q9q910]q]rq%#"547632#"&'&'&#"326@Bof{ؑE8;M 0"4TI7K1X|yƿZ9DNd?3M;+.RfkP@(7    0/@ @Vo+]]<<<??10]]&h1D&0WK4]Nk.DAZeF52QD@B37@ I -KF@ 3A+]?9910]56654'&#"#"&54632fti +;WdGVz,2S \>Bdtj!k9-@90W)w! +0+-+)/" +$,6*6+g))*4*49ZI@Z6661Z  x@FZ)+&  vv) +) #51#5 O_oW&&&@;@ 4;1.:9X+NM]N+M]]??9]q999]]]CTX@  %)&+j iz y)+  ]qY10]q]#&&#"#"&'&#"#332654&&'.546323267 )fw@/SR@rV0:%%,p3hWB>/ k>-,($(( $9,(%(%$-.!=++??<<<9/<<N.BLvc7$$"cb7%L!q! 9!@w 9 :"" "":"# L#!!! !>"! ( _  }P##(Po}"=v+Nq]rLGz+:%% #O`iuR%%Zl$6"%Z4 "I @ 0   o+N]M?102#"&546FabEEaa4bEEaaEEbfYkR@"6    @OV 0R+<<<]]??10]]567676'&'5h1C'0WK4]Of.EAZ:(GeF52Q QWk$ -4 -4 -4 @Y -4  6Mkkyy  -&CA -/&hwv v7$Z@Z!jj _/p&&%n2+NCX@  - - -MM] -MMYN]]M??9910KSy2Cy@$ &%  &  -% -% % %+++++*++]q]q++++#&&#"3267#"$54$323267W',1?\ĜvrY\ /k*ĒvՙpuwkF\>$/30L.@" -'"*#{##### pp(((#" !!Z"!#3 "" ""* ."$ "# j$ ( _}00@0P0p000>))P**}/=v+N]54&#"'6632!"'&5463232654&/rX@yZb%HኍU[u{O9B+!UJj#!9u3tv0C -&8+%8.2*˰lQd]Dqݹd;1 #bG0 8uch5"_oA 5#5@  @Po+N]]5@ 45(45S!n++NMCX   M] MYN+0P},=+N]q -&0'@''=X+N]A+'Pa=,'Rs6L }>,8+B D* xT,W,@4  ///???OOOXXVmf -d hkkdfvz}|sy x'.+, - ,& - @.P.`.  -  -''+('     4& %&@v s@i, +,,F   ^ ^F ,   +'+  -,'& - , .,5.784. !4.@4.@ 4.`...'u -@`p- @2?  0 @ P  -.V!U,++N]q+M]NEeD]r+++++?<< -  8@ 4p888@ 48(/.@4p.....78T!=v,++N]r+233_33}E`E@EPEEEE >P}D=v+N]qr@ +N/M10!5!yGoEL -@  - -@ - @  "  @ -   +]NM??<]]C\X@@?@?@?@ ?++++Y99.+}9910]!"#!kqS:&&b(9_+S3h - @? 3 -  \@   -@   `@/?@4+N+]]M<]<??<<9999.+}10]]33#!!7!3z||ai0L!#@:$4#3#89i     ! !@@6 -( !  #-I4#.@ @-I4`  "#l!m,++N]+MNEeD+?7#"&546632654'&'&#"32?>W0oow~j) -*/(2'B+I'&ڎ {xpUW)+;iDLh'@ fv -@4*$?" & && - " )ɵ -@ @4(+N+M]NM??9/99910Cy@.% -$&%&% -"bb "b# &bb! b++++++++*+]+]]67632#"&54$3265'&#"µ#,ABns}w5.!-.HC+I(h.ϙ ݿzn@4%kiDrk&2IP+44/@4414/4+@4)444 @ 44K@4-'<,.-  -<4@<K***ͷD888ʹ@00F 4@F ͷ!@  JK!z++N]Mrr]]rrNEeD?<&6d `##(NJJ.i@F$@&#"$& , r*@2?O0K50;=40@ 4P00p000((@@ -2?@ 4/8+N+]q+M]N]r+++]q+8#/%L*B9'>$[b@$}67mE\%%%.Gh&CgW;2(nJ@ - ?%?@@ 4 @@4Rc+N+q+q/M999910!!!!(FFł.PL;a="(4=@4 - / ;II n v = ;==..;> S/T;jg.;;;../-  ""- &\"7;87 \# %"#66/56//.;.(;;-  ; F#?;@8F#?;/. =;/. 76&%@==-><=T!=++NqC'\2DKT-;$ C9-E$ i+WGQE~- %%*t*j4%%%"f|h4'%%!gZU3& %%)vOGy.@/0,.)!#),*"!&Hf &##y)D.@  - - -@"%4?@2.7:4./14.*5.@$4..../NU+N]q++++M]<]]q+<]<]??<?<999999910]!327!327673#"&'#"&'#"&547665+)ZK'+kHgKN(<1 0B52: JO5y5Q5$TLQSJ#=G">F=8,^}U@  -?/  l?/ ? l@ ?  @ ,?  @  Ж+N]M]<]/]]<]]999910!3!!!!'!! YRQk0=J:@{DCDD2( DDEyD8ev??:///0'I( /-/.///+)11>1)+ ;>I+ +)18 I>#F08#F -@  0_o!@ _o,    &4@ 4?4O44@ /;?;O;;;@   BBBVKo+]]]]]+]]<]<???9/<9999.+}ć10]]]]]]]]]!327#"&'#"&5467&&54632654&'%6654'&#"3267&FPtf@-+J<)R]G[Ne}wᯍqړ:8riH;'9/C P!/mM&_8+' -?\$aD3C\TK΋QA|:Ս^qCv*;c'Y?pM3J?1p"&8E^f!!)L@-!@7? - "" "" "# "#> -@F#? -0 -@ -p - -_ - - - !@4!p!!0!@!_!!!!=v+N]qr+]qr+7'"#"&54632AA'+?>80/?:,@p/@ 4/./l!m++]+]]<<]]]?  ?1/ ?1/ &A_9+&++@@98'&@Aճ!m*++?<</ B?%3NQ;A'QhU$?T(^!qK|Fp@ ?JE+N?M10!5!!y(m Y @  - - - ?  @o@ Rc+Nq]M]<<]/]]10!3!!#!( $l*@  @ #%4 4  4 @K4:Jhu   -KF D [V #%4u //  V    CTX@(  -}   u   -F - F -??9]9]99@9 -?  d t ^  F &@ - -&@( F -@2?@ 4  -[u )+@9@4?o% u@ -2?K!U++Nq+M]q++<NEeD+q+?@ !&"$&(+t-|./v/13r4p6N67<8:Z;=>?.AACErG@JKMxPbPR$T VWY\t^p^_p`Bacd`fg4gij*l>mnNpdqNs twLxyz2z}*P</VS8R@(R,v0 L & )! AM;c C t. -*&( @,L x  8 R@ (R  , v 0 L & - -.  2  (F0V2&.24Fz.4 -*& -2*<$ f$,r**(- --* - -.z. - -.  ( 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Times New RomanBoldMonotype:Times New Roman Bold (Microsoft)Version 6.87TimesNewRomanPS-BoldMTTimes New Roman is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Stanley Morison, Victor Lardent 1932You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic  as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software ), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Times New RomanBoldMonotype:Times New Roman Bold (Microsoft)Version 6.87TimesNewRomanPS-BoldMTTimes New Roman is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Stanley Morison, Victor Lardent 1932You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.NegretaTimes New Roman Negretatu nTimes New Roman tu nfedTimes New Roman fedFettTimes New Roman FettTimes New Roman  2014 The Monotype Corporation. All Rights Reserved. - -Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.NegritaTimes New Roman NegritaLihavoituTimes New Roman LihavoituGrasTimes New Roman GrasFlkvrTimes New Roman FlkvrGrassettoTimes New Roman GrassettoVetTimes New Roman VetHalvfetTimes New Roman HalvfetPogrubionaTimes New Roman PogrubionaNegritoTimes New Roman Negrito>;C68@=K9Times New Roman >;C68@=K9Tu nTimes New Roman Tu nKal1nTimes New Roman Kal1nKrepkoTimes New Roman Krepko#mTimes New Roman #mLodiaTimes New Roman Lodia!A T<  2  2 ( A?__@x3@r3@n3@j3@T3@J32@ - 2 2@Z3@A V3S3P3@M3@G3DE2@B3@>3:3A$ @p//@3A/`  ?O -lEE2@+.2@()22'2BB2682*-2A -((.22@2@APo-12 -2A  @2@2߲042߳2PA# 2Ay)z2~ٲ2ٲ(*2A -|2sq4lk2 @ 2@2kkn/n 2A @Ҳ 2A -@ 2@3@ 2A &82A&0 00Po0/py2y$(2}|2~~ 2@|2| 2?O@س2o@2@Բ 2{z2z2@ 2AToTTTTT/T_T@P2Z@I3HHH"2G"22-2/QKONd@Q2N8:20NN#2N2F 2C -2D+2+2*2A:37 707322PAd2@2`222202P22666p661?11111`10`00P//@/`/////--0----o,, @:@5%,2@j%,2@.%,2@(%,27` p 0 @ P  :3@:3MMM7A @>>>MMM---@M:27_o/?O_o/?O` p 0 @ P   P`p/?@AC`p@P#0#@#0#p@"0$@$$ $$$$$$$A:#0#`p@P#0ײ#7A_/?o@',2&3@"3@3@3@2_A?D3@=3@:3A9_O/??pO_/?z/z@ i(((A# # # # # W# @ # # # # A -J$ $ $ j@$ $ $ $ $ " !@" " " " " " \" Q" L" A -(  ^ @ Y : A -4 4 4 54 4 4 [ [  -*> *>!M%MAMRMrMA  * **^*9*#fff4f4ffA (&M?MA >%@*r*(*$*$*f.ff(lA (&sMqM$pM/oM5k>i>A gf*af*_fA ](\5GM9F>A E>%DCB@*0>*&=f%>*)*  f -&Mr>V@(MbM@Mr>@ *f"*@*.&y(Mf)fbf&(@ fL*+&f)@@*y&uMtMs*p(^j(@i*Rh* gf)efga*`5^*S5KfVI>HfRF&?fV@ ;f42*.5-CU7/r@.~bTB/'%!  -@+JKKSB7+KR8+KP[XYKcKb S# -QZ#BKKTB8+TXCX,FYYv??>9FD>9FD>9FD>9FD>9F`D>9F`DED+++++++++++++++++++++++++KSXY2KSXYK)S \XljEDkjEDYXhlERXlhDYYK;S \X>kEDMkEDYX\>ERX>\DYYK;S \X>ED>>EDYXOERXODYYKZS \XC>ED>>EDYXCERXCDYYKS \X*lED@lEDYXl*ERX*lDYYKS \X&&EDf&EDYX2&ERX&2DYYKQS \X&&ED(&EDYX&ERX&DYYKS \X&&ED5&EDYX(&ERX&(DYY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++eB+++++++++++++++++++++++++++++++++++++++++++++++++++=vnXEe#E`#Ee`#E`vhb nvEe#E &`bch &aev#eDn#D =XEe#E &`bch &aeX#eD=#DXETXX@eD=@=E#aDYN8qEe#E`#Ee`#E`vhb 8Ee#E &`bch &ae#eD8#D NqEe#E &`bch &aeq#eDN#DqETXq@eDN@NE#aDYKRBKPXBYC\XBY -CX`!YBp>CX;!~ +Y #B #BCX-A-A +Y#B#BCX~;! +Y#B#BtEiDEiDssssttuuuu+++ss++++++EiDssst+EDssssstttEDsttttttuuuEDsuEDssttEDsssssttttuuuuuuuuuuu++tttttts+CXMMEiDM:2+Ys++uuu+++++ss+C\X3@ 3MMMA @>>>MMM---7+tttttts++Ysststststststu+sus+++s++++u+++s+++++t+s+sst+ss++++++s+s+++t+++sssss+ss+++s++++sts+s++++u++++++++u+++++s++++stu++sss+++u++s++++++++++stust+stu+++++++++++++++++++stu+++++EiD++ -endstream endobj 21 0 obj 51684 endobj 18 0 obj <> endobj 22 0 obj <>stream - POS/2]^`cmap2-<glyf$VL -headrm]$6hhea~ ]\$hmtx3[]loca ^maxp=[_ namev_"Npost* prepO6433f *xC TMC Q3>@&  0 (),-./0123456789:ABCDEFGHILMNOPRSTUVWXabcdefghijklmnopqrstuvwxyz  (),-./0123456789:ABCDEFGHILMNOPRSTUVWXabcdefghijklmnopqrstuvwxyz )&ii( 1IT$UI+v=7NUUeY ;Ra|<AA* ci"+&Y+H!kk ]CIVnwP{(ai5M >[[[? -2 &1=NVbHSw &(~~.A]kuJb d#%*t 0Pjo&NLz8h "OpN5Bka&Fi+8;Z^hs";DOor~"6q&.1OZ22GS<dp*hYz!'+9FKMW\e"+ASae#+1IZ[nqt~uzLmm/j6Pp*  +S?hn@t5=`n!&B<Vkxks:}7S< Ind^9 |+YUa( ]&l7>z&Bi7-  thGhG\H -(2APZd}yo ,\<Gd%2v1x - cB,4A8HXlYCp(7BPZdsx\,cAKU_s Ad*8t,@ - ,;DVcWd6P9ND$B"`9,N8iT=qAPO5R,ewl\@vDr@BUT@?>=<;:987543210/.-,+*)('&%$#"!  - ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y QX# D#Y!!-, EhD ` EFvhE`D-, -C#Ce --, - C#C -,#p>#pE: -,E#DE#D-, E%EadPQXED!!Y-,Cc#b#B+-, EC`D-,CCe --, i@a ,b`+ d#da\XaY-,E+#Dz-,E+#D-,CXE+#DzEi #D QX+#Dz!zYY-,-,%F`F@aH-,KS \XYXY-, %E#DE#DEe#E %`j #B#hj`a Ry!@E TX#!?#YaDRy@ E TX#!?#YaD-,C#C -,C#C -, C#C -, C#Ce -,C#Ce -,C#Ce -,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KdQXEi C`:!!!Y-,%# `#-,%# a#-,%-, ` <<-, a <<-,++**-,CC -,>**-,5-,v6#p 6E PXaY:/-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,&&&&Eh:-,&&&&Ehe:-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CXY-,CXY-,KTC\ZX8!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,KS#KQZX:+!!Y-,KS#KQZX;+!!Y-,KS#KQZC\ZX8!!Y-, KT&KTZ -C\ZX8!!Y-,F#F`F# F`ab# #pE` PXaFY`h:-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYY-,CTXKS#KQZX8!!Y!!!!Y-B?@ -& +< -@ 4 -% @ a@  0$@  0  $a@  ^c+N]M]q]qNEeD?<<@.8H49 94DI ID VV -YVVYtt@ !p)&)@ p?A+NqM<<NqM?@( Sfu/Xhp -    ? O  w@) - -(  0 p  _&)@ ?+Nq @H YVVY    ut - t@9`p!XA+NMNqM??10q]]qCX@ iffi]Y]]4632#"$&%32654&#"R4 nnnn"ÄTa@-YY -YVVY p:4 :4JD JD t t@  -) &)@!X<+NMNq@Zh44DDt@   -&@ $4@"$4p - & ) @ $4   ?<+Nqr+o244#%4@?4@P`p 0n1+N]qr#г>#9"9#ɲ9"@9 9 - 9 - 9"@ 9 9 - 9 -9+++++++++++++YCTX@: -: 5"5#K -I C"F# -" -]Y10]q]%32654&'&'&'&54663 &&#"# J =L4`}}I/,8uyQ4I.;Vypf qc5"94%/fm~k$@8  GG W V % @"@P`p 0 01u+N]54&&'&#``-7fMb(|7H_<&εcK*5VŪf!@9IWj j # - - -6FF 66Guy - x xv   Su    %` !% @'   'p# #0##!  0"1c+N]543ESD:fBKQu/S$0 04&@l4uv&* 6; FL ncghw''  ',0w'  .  + %.@4?.O..@4p(@ 40(@((@  ?"O""@4"@ w+O2w%1+NMNqM?+]?]+9/]q+]+9]9]9]9]10q]q]++&&54632#"'&54632654&#"32654&#"Hmcj`zȅv_OP`_NQ`wYWrtYge.`֤f*1{i|wQT^_TO_`=t}vg}&D - @9 9  + S k  %( H [    -  @    -@  ( X - -@?LH+Nq]M]<<??<]<99999.+}CTX@ - = M ]Y10]]]+!!533#~|춶'^ ;8@I -l+NMNM?@F 9  - HGF -O  - -  @4@4??@ P`43 4")4+-44@4_t t@$ !/!O/_o!@ 4iA+N+MN]]M?C\X@@(?@?@?@?++++Y?C\X(????++++Y]q+++++C\X99 ->A!?++++Y+9]C\X@@?@?@?@?++++Y/<++r++<310]q]+# '&532!326&&#"6i@aBZ'xV\<<R/+}HlzCCsU?>@QXYYhii}y 88JJFY i :77ww 443 4 4  -t@ @4@43t@ @4!/ @4 !O!XA+NMN]M++?]++?++++10]qq]&&#"3267#"321cOi}kPf+2ST[o/&%@) # -):JY  - @`tt@ / -//_@(&U?` 0x+N]qrK7SK;QZX8Y';)@] -?  4444#DEED# /)S `)))  ))))/)P)))))@4?)P))))!t -!t@'&' -&@Z5`oF@&@Z5o`F%&&')' ?'@6 -?'@Z5'@A5'@<5'@$'4'@:=4/''''''' '0'''(<+N]qr+++++++*@#'#'* F !# ") U e " A#@$D&g"d&"$ 7&EF J OF!B""$'&7 5!5"5#5$ - ! ' """#$"@,s xyv)u***"# **,!@!#4@43!P%%%@4%,@ -?P,0,/,,!03! ? -?@ 4+x+N+++MqN]qr++qMqr++CTX@5&"6!F!TYdi -!"( (_F( PF?]?]999]q"˳(*4!˳(*4"$4!$4"4!@4k 6"F" """!" 43-? ->"%4@40@P`P`4@M_F( @43@-?@ ->@574@+.4@%)4@4_oU@"$4PF?]q+]+++++++?]q+]qr+++++9]q++++++Y10q]qqqq]]C\X$@ ?( ?! 9  9! 9" 9++++++Yq]%327654'&'$'&54632&&#"#"&0ncm7%I[~(_Xo0 &YX/+RU(/ K>V1>B#fJKҰY@+933BB $Xht@ - - - -& @ $4   @"$4p&@ $4?<+Nqr+#2q@hJHI% 6FW&fg&&  ')Yw 4$21, $@+.4$@"(4$@4o$$$F@04=,3@4U!@?!@?!@4!t -,?,?,4,t@@ 1&) ( Y    @4 O44`03)!_O_o3iA+N]qrMq]N]+]qrM<?+++?#/N@bw p1 1 ##033@CC[YY%V)V+Y/k; 3;(3,K DK(D,  -  * '- $43> >(*4#%4144@ 4`_t't --t@ *) &)@ 11@ -3$!0X<+NMNqp`gheF'8!1#^ Gj<@26*  Y  _  t@ -t@ - 3?OP(/_@ &_ 4xi+N+q=5&PS$9QKI Z& @(/4(/4(/4(/4س/4@ :4  -   -"- @ 4 -  %* 4: CTX - @ 4  -??<9+99@ - -  - 9 @(4  0 @   -? -O - -0@ 9 ?O0@ 5 @ Ġ+N]+M]]NEeD]+M?32#"$M rQWwrR6KrxXIHf my}g~!hnpj|iWJXd`,[ls 8& @1  - -   - ++# 99HH @w,G4 -  -   - #('- ( -' 17> FGGHI wxwx x -w  -  -  -  - -CTX  !4@ !4 @ !4  -?@7<4 4<JD DJp4YY -W VYYV -  t t@ !)&)@ X<+NqM<<NM?NCzD9asRT999Y,9VVVJ9bkCsSs&9s3sVss9usAsU~Vs0sITs 9s[sWs sWsM9 sA[sVs9d2"l ~n^ -V T \ zPnNX !"#H#$&'N(n)V+ -,-Z01356789:;=>P?AC -D DFEEpFGtH:IL -D</VKS -$>,>jd0  &  -  1 E, q -,6LRdl    - $ >, > j  b 0  & -$ -2 L ^ |  4 Hhv  -dl -$ $*(*0- -D-N -$ -2hv -$ -2 |  2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.ArialBoldMonotype:Arial Bold (Microsoft)Version 6.87Arial-BoldMTArial is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic  as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software ), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.ArialBoldMonotype:Arial Bold (Microsoft)Version 6.87Arial-BoldMTArial is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.NegretaArial Negretatu nArial tu nfedArial fedFettArial FettArial  2014 The Monotype Corporation. All Rights Reserved. - -Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Arial is a trademark of The Monotype Corporation.NegritaArial NegritaLihavoituArial LihavoituGrasArial GrasFlkvrArial FlkvrGrassettoArial GrassettoVetArial VetHalvfetArial HalvfetPogrubionyArial PogrubionyNegritoArial Negrito>;C68@=K9Arial >;C68@=K9Tu nArial Tu nKal1nArial Kal1nKrepkoArial Krepko#mArial #mLodiaArial Lodia'A T5<A  @ 2@2@+2:3@-2_3U3@@D2@3;2@/12@3@2A//OF@3A@  2@3AoA -2@2@APMMoK-12K -2A  @2@2{042{2PAxen#~ncnbd @2A??)A2Du2u(*2A -C2 42 @@ 2@2 -/ -T 2A TTnn@n 2AEkFF&@ 2@>3@> 2A >&82A&(0( 00Po0/zpwwz2$(22 2@2 2?sOs@t2o*@,2@p 222A     г 2@ҳ 2A_02?d3!!@ 2ò+/2ò%2ò2ò2A%$"t5;5;8P/&&$5tA -X7 @7@%@-@0%0-0 % - 7 A7 0@7Atttt`tpttttt?O~z{|}tuwp~ppppzp{p|p}ptpupw`~````z`{`|`}`t`u`wP~PPPPzP{P|P}PtPuPw@~@@@@z@{@|@}@t@u@w0~0000z0{0|0}0t0u0w ~    z { | } t u w~z{|}tuw~z{|}tuwA~z{|}tuw0t@t~z{|}tuw~z{|}tuw~z{|}tuw~z{|}tuw ~    z { | } t u wX)~}|{z7w&u t7A5O5_5o55555555@"OO A _5555/5?5?4O45544@ *****A G 7X@ &>&>7&'>&6&6)@+&6&6&6&6&67&62&6-&6%&6&67&*X@"&>&>&>'&>!&> &>7@  '('0'O'bA ' 4]'.['A UTSRVQ)+'&A *'%)X%$#;"9A '-X@  %V@ --AA -XXX%X%.-)X @0t-sJaR]%\YXP%I%G%@ Fy@'9 8X7-%2X%,4*%U7@*[B;#"  -@+JKKSBKcKb S# -QZ#BKKTB8+KR7+KP[XY8+TXCXYYv??>9FD>9FD>9FD>9FD>9F`D>9F`D++++++++++++++++++++++KSXY2KSXYKS \X ED EDYXpERXpDYYKS \X ED'EDYXB ERX BDYYK%S \X&ED!EDYX - &ERX& - DYYKS \X ED EDYX%ERX%DYYKS \XX&ED&&EDYX# XERXX# DYYK)S \XED-EDYX ERX DYYK/S \XED%EDYX5ERX5DYYKS \XEDEDYX(ERX(DYY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++eB+1u~Ee#E`#Ee`#E`vhb ~uEe#E &`bch &aeu#eD~#D 1Ee#E &`bch &ae#eD1#DETX@eD1@1E#aDY?CX;!~ +Y #B #BCX-A-A +Y#B#BCX~;! +Y#B#B++++++++CXK5QK!SZX&&E@aDYY+++++++++++++++++++sssssE@aDEiDEiDssstssststst++++++++++++sssssssssssssssssssssstttttttttttttttttttttuuustuuuu+sK*SK6QZXE@`DYK.SK6QZXE@`D E`DY+EiDtsss+EiD++C\X@ -t2owww/12w"%2@t/52@t(*2@t!272%2@-2%-7%-72/t+s++++++++t+stY++C\X22++Y+s+++++++++++++++++++++++++++++st++++++++ss++++++s+s+++t+++sssss+ss+++s++++++sts+s++++u++++++++u+++++s++++stu++sss+++s+sstu++stu++stu++++++++++++tu+++EiD+ -endstream endobj 23 0 obj 37932 endobj 17 0 obj <> endobj 24 0 obj <>stream - POS/2WXv`cmap<cvt !7fpgmsJ jglyf?mt\headי,6hheaMd$hmtxIloca9*lmaxp\T namew2^t/post$d prep?h53%3f.xC TMC @ F3!@L  n "#%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_`abcdefghijklmnopqrstuvwxyz~D       0"d"e "#%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_`abcdefghijklmnopqrstuvwxyz~D       0"d"e?F ;9!qs21ZE7??:LLJk#j%$1JAPGy#D%F\r(K$Ep9K -ClS/CH,+%(%$H'j$b|!`4k;KkMy le.C &=Nae{1@'BN++I_ 5Kuz11)UKY0?*X0Y"tt2Md**~W8QZovw ~z&BKOQSd 18NRg!q6:#Whl~&-0;DDDGXu )js~#5ATYrIaanK',47bfjklppr|!0ijm|""(6?CFgc22H(Hb*Y[Vy%-.|#*,1?GIIMQQUUWZZabhh%'/9CCGORRgooprv~%-aq,/<VgEh4UjPb|%/sxpU%Tlf ikFoV":fT(oC:}: iX4iZx>*#zJ$^9qp@L  7! -Y&PU5z0|nf'+EM2A,R0]:X20|d(Mej/ "_ -CKw (_E`{d]O ^F2<Z,A IqH@@}:>jPH)jiLiCR_\gS*v6YV+4HH%>S?("bJmH3NFpyQ -hlO%f0i)/\p@BUT@?>=<;:9876543210/.-,+*)('&%$#"!  - ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y QX# D#Y!!-, EhD ` EFvhE`D-, -C#Ce --, - C#C -,#p>#pE: -,E#DE#D-, E%EadPQXED!!Y-,Cc#b#B+-, EC`D-,CCe --, i@a ,b`+ d#da\XaY-,E+#Dz-,E+#D-,CXE+#DzEi #D QX+#Dz!zYY-,%F`F@aH-,KS \XYXY-, %E#DE#DEe#E %`j #B#hj`a Ry!@E TX#!?#YaDRy@ E TX#!?#YaD-,C#C -,C#C -, C#C -, C#Ce -,C#Ce -,C#Ce -,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KdQXEi C`:!!Y-,%# `#-,%# a#-,%-, ` <<-, a <<-,++**-,CC -,>**-,5-,v#p E PXaY:/-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,&&&&Eh:-,&&&&Ehe:-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,KS#KQZ%%%I#EiRZX%%%F#Ei`HY!!!-,CXY-,CXY-,KTC\ZX8!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,KS#KQZX:+!!Y-,KS#KQZX;+!!Y-,KS#KQZC\ZX8!!Y-, KT&KTZ -C\ZX8!!Y-,F#F`F# F`ab# #XXpE` PXaFY`h:-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYY-,CTXKS#KQZX8!!Y!!!!Y-M -) k^+<#9]SQ9(nO'/%%0\Q%%.!,_ $SVh2L - 9 @< 9A E -F K" ))8)@4`444 -4A #z.$$..#%."% I)((004@+/4C )(h @ P   3  @ P-----3_@ -@4444>@3+N]M]q]]q]]q<?+r?]9/10Cy@6./& -"!#!$!%!%&& - b/-b b! 'b - .0b b++<++++++*]q]rq++6632!"&5463232654'&'&&##5>54&#"h:WB}pc/!x%*f#+N OH`hJjOZ1{D',? lOK8(A -^Ogh@@`@vAiA "iA#iA@   I@@50$+N]+54'&&#"J!<\`8 -%%Bǡr8%%1zܔ* "L0@ ()*0==/Yohm/y/  -0F0660G0'&00+)&0;:9550?2O2hzvyt0000222220%HIF/ZYV/jx000 !" !".(!"!#!#!'!#"@>0/00/// 00'(0[/." !!!!!!!@22@  U1a+N+Cn+N]qrr+M++]qr+<+<<<<]<?]q?r]q+9]qr+++/CTX ]Y99910Cy@G5;#7868  -!" "5 9  "#;984 54 ":<+++<<++<+<++***rqqqr]CX?]Y]+rC\X1@9.9.97 9 9 @ 9 9 9@ 9 -( 97( 9 -( -97( -9 -( 97( 9+++++++++++++++Y]Y%#"&54766754&#"#"&5463232767#"&'32G$6=_{)WS?%&/&%/zN; - Y.#  ,hh@ 9=4@=4@=4)<I@ [Z[Zktt      4G    h@ @ ?  3@ 3 @ O_o@@ @ `   @@_o+N]MblWF%BuqԐgg81-Jh$a  @ &@&@&`&&&&@_o%+N]MN]qM??10Cy@L$#$"$%&% &!bbb b$ b bb -b++++++++*+++*+**47632#"'&7326764'&'&#"JtZ`|bmE9q6t.0$9):D5H4ORA豕ar9s0!=SXh(@*u v -w %%}zz<(#( _C &&&  @#@ *@*@*`****>@ 0@)+N]MN]qM<??<9/]r99CTX ]Y10Cy@,% % &% #bb!#b$ -&b b" b++++++++*]q]632#"'&4$6332654&#"k$g|̋akGF3IW}&Wh% Oljcప\HXDS`B/ L'@K@O5'-8x"" -!"!!" !#!#""""@' -  @ S 0@UU U)@?5@) ))))@!!0""" U"U"@ - U"(a+N+++]q'#D.X*7s-)FY>)(bc3_ch!iH&e< "ICTX$@ U  U !U!U! U U ִU ζU U UUֵU @O!o!!!"o`@UU"/?++]]]/++++/+++++++10+CTX@ U!UKKUAAU@77U@` !" @U $# U U U UU U$#9/++++++9/+/??]qr+++10++@$`$p$$$$ $P$@$P$$224$8:4$-04$#%4$@.4)J" )J#!'A !D  9"  -  9C5@?5k  $@+9@6:4P`p#+]qr++<<++r?d=QbN74\M&/&vJbC.y=CTX@ U  UU U U U U ִU ޵U @ @ U/?+2/++++++++10+CTX@'UU UUU U U U 9/++++++/??10++?F4@:9;4 d6P@P`p )J")'#' AD -$ ?F4 @5;4 P ` p  +]qr++<<?+F" - #' -C,'6E)^IL'$$$#Pc=$pd14CTX@'3@U3@ UUU' U'!U@2U1'!+yl%/*wc% `p ?]]]]/?]]]]9?/++/+++10++CTX@2!'*.*1`pKk{%*Ddt% !@ U32 U' U''329/++9/+?]]?]]]?99910@) ,,.@ 9,( 9Y Z&$ - -( -)`3p333 @ ]6 $%#$,#$, ?,],n-},-.  -  -,"#), - #$ + (,J,O3_3x)x,#3 )1/+.@* +@"$# '$# ./*1%*~F@/% !!!!@ p`p6@'.,'`'p'' '0'' 2 K+N]qrMr<]q]CX!]Y9/C\X]Y?<?<<99CX@ -$##$  .+}Y]r]CTX. 4+Y10Cy@() !) (++++]CX@ (]Yrq]CX@ "#- ]Y]+qr++CX@ /#/$,$,]YC\X@( 9 (9@ -9@ -9 -9@ -9.@ -9,@ -9,@ 9 ? ?99$9#9 9,99@9@9@9, 9$@9,9 9.@ 9#@ 9  9, 9,9,9+++++++++++++++++++++++++++++++Y]YY#&&#"#"'&#"#332654&$'&546323267!&w\FV _˽uTl! !!bEWa--{6M3 ȓjJ-8().Gc} -GQ9E^:9WqJ'9"CTX@);@U2 -*U -U - ) U U U U @ U (+@ .%6Y'@ @ U?+?///9/+++++/++10+CTX2 U2 -@ U - -;:) UU U @U ;:('.% 6Y????999/++++9/++10@~ -;C ]69I[,;,?;K,[,jj,syy, 0;X3Y4l4@;/() )")'#'!O'D+(.66Y.% 21 - -` - - - - g@ P!p!!!!!!!!`:K+]qr<<]r?Q\@X0/$9ryal-^3%% 1dbY0o#:XNfqNE CTX@ U U U  U U@ U U% %??/+++/++++10CTX@ %% @ U U U  U @ U 9/9/+++++??10@E   -H EW @25C ]6@I%% @+ ?O@@P`p @ ?@  CCK+Nr+M]]qr+K(SKPQZ IIRZX 888YCX2222Y??10Cy@6%&%& -%&           ++++++++++++++rqr++q]CX@uuz -zzxuu]Y]]C\X@ 99 9+++YYY2#"'&5466"32654'&~kvzg}S5kBa~iG{~wA?|ޠ`DJ+ԱCTX@& U& U U@U U UUU@#%)Y ???99?/++++++/++10@*U* U*UV-` ]6+ 'P-@--(-00!?*8+O@@!O*H+XPYP!Z*_+obb!o*|qq!++!*+++++++* -s%s(-S")'")'##))Y #%g@/`U&1PUC,C+N+qrM+]r<<9/? &DD H /-! - _*_+"@#$%+P0*) -R--*+@ ()$``4::4??4$14@!4_p,+N]r+++++M<<<<<<]r?S)(BXqiX:43J&.@L",$$(DbZH#U'MATUD)7M@9)(%GVW<,%, - GF10 -Y$!0 p  5@7).+$807p7775@MWA$LLMPMMMMMM4M`XYZ!d++N+]qr>?0000!=4=5H H*T V WV)V+356TTTY2\3\4\5\6Z7 ) )# :;)0:rr$/0/(*+::N8oK@ 51oK@4*++<  + *& + *#(1#( @"4&&#@/ +  #@.....@G5@.... .0...F9F+N]]+qrMr]qrr9/+??<99.+}]q10Cy@6$0(& , 3)&3$&30 3 -- 3 ,+'*3)*%#3/3++<<+<<++++++]r]CX@ c f gc+]Y]qr+q]C\X@ 909309+++Y#.#"#"'&&#"#332654&'&$&&546323267%]\h+>龋K;4%%Xl}7:'Lly8! -k+^Q>3K}fmQ ?/ђ`Z2f,tT5/ B%@ g6@ @ @@ 4%+]??10]+2#"&5462#"&546!.AA..AA,/AB..AAA..AA..AB..AA..B=F;IY@P&6-[v*vS*.R ?7O[o7u&p[5>EKOO4K[[[[ 356[J6?6!JC -  %%޴U% ?%@  ?%%%%X+!!@ U!!!! ?! ?!@JJ@ ?J@ ?J,UJP@o@U5CC1@ J -/P M<1@ -QQ,,M0009M0@0o0000U0 U059.TT޴ UTʴUT޴UT@ - UT%((@4(O(p((((U(U(@U(u [0[@[[[[@ 4[FFUF1 p@U U U@??10PP4 4UUiZ[x! -++++++]qrr+++]q+r+q+++]q+r++++q++]r?r?]q?r+]]r+++]++]CX!!]Y+r]+++CX%%]Yr<<9999999910Cy@zKW:E$5&%213141A&O&.%*&V%T;K5M B? =?P-MR+T DFU'WVW:;L1J KJ56@C ><N/QS)Q EC++++<+<<+<<+<+++++++++++++*+r]q]qrC\X@ -. ?59.9+++Y&&5463232###"'#"'&5476767&&546"32654'&32654'&'&5TZ͠`++w8ĥDG,!0p=]ojK 5_4+9JdD4PLbE3/0:d34N)Y@  -Hp&9  pRqcW26%B c1#^vzWBrzZB3X%0$>H4 CTX  ??/9/10CTX@1 -  "!  U*UU U ?+?+?+?+?99/10@ S -X[ز 5"@a5# " -! $  : 9 -:95:JI D -EEIi "  -" -- "2`4"+14")4"GG4"''4"##4"4"@@4"|rrp| " :4 -49! -7H  -@,  0 - -$   @_ - -$ - - - - -} g@@/} u 4 4 25 5  """4"4!+++qr]++++]]r?A(u00+ $T0'32(e#.t(c#(AZ' />}%@cq(%kPJk$@B //// }{x HY/$K (ߵ+A  /@/ 2?@&& <  UI%dc+N+]rMN]rqMq?q]?10Cy@  %& &% -  -- - -++++++++q]rq]#&&#"3267# '&54$3232767>桇}v현yf?* k3϶߸qTH0byL!@CYi55!UU W!kvy ### @ !  ! !@ !!>G@ -@#@#`##!!@ @"+N]M]<]q]?<?9/99.+}9CTX@ rrr  ]Y10q]]C\X@ kodpp]Y]!#"&5463232654&'&'yNhY WQsyzo.#'/KMumL'k'7S2+!4{:-o +@@ @ @:5 @?5_   jz+qr++?10%2#"&546/@A..AAA..AA./@$ұCTX@U  - U U U U @ U  @@ U% !Y???+9/+++++/+10CTX@& !Y% &% UU U U &%9/++++9/???910@y&&C ]6 &uvG:' AD !!Y% 1` $  P p    0  <5 `%K+N+]qr@2 -D01jJ9F:=#/bzEV\@W $$'&ND^/4O^.$$ -8V=H#p|h&3z@Y 33*'o3z" %&3% &' -  -  ' % %K ;:KKI(_['\3jjig&j'h3{|'v,|3&'3 '2) ':982D ' ' - A  @ @0f@5@5@5`5555#>*@ -0@4+N]M]q??9910Cy@2+/"%!#bb,*b.0b" b b+-b/-b+++++++++q]q]r&&54632#"'&546%6654&#"32654'&]̩l9LڱlVy1x@vff516SPml&GVrLkNfqyasZl}OiwvO4h/F`zWH9jLL >@+>* B@ `    @ @ @G5@G5   @ @P +]N]M?<++?<.+}ıCTX@ tt]Y10qr]r++!#!"':iW)#3Qh' @3{'"'hy}z w x yw  - );'!'%c@'PC@ /%o%%% > e@)@))@)`))))@!@ - - -(+N]M]q]?<?9/]r999910Cy@*$ &%&#& !bb$!b bb" %b++++++++++q]]5667#"&547632#654&&#"326l)f{Ƨwơ3ByMYYA_.~%u$eݷyjNaxwV, h - @( E @@*     @    @   If@ @?`@+Nq<]q]R@ g6'@  @ 0`po+]?PVnS@'YY ` @ :*@ _+N]M]?9910]q56654'&#"#"&54632ngq  %1:K6Bg,"P  :31Fs_g>L@:ZZZZkkkk/!?!O!!" !##!@ +@?P(@ U U U "+@?_(@ U U d]+++]CX 5 4++Y+<+++<]CX@ @ 5@ 4++Y+?3xL@o!@U!@ U!@(5!ad6!"!"!# !#UU U" p0P`_U UU@Ua p!!!0!P!`!!!a+N]qr++++]qqrC&(.M.F#  *qD  .;{!/ -$$3gY8$$ !QBG#p#yL!@Y  vv(!" !#!( (?5@# #p####!U U U" U U U"ac+N+++XB\eU%6#rl~!,%$wf?MwoxOT%\s|'O_L'@;:5P0@ \ \X^+<<<]]qr<<<?]q+<<]<<10!!!!%77sRR #c@!%g6"   @N@@ @   6:!!!!$jz+NM]]??/999910q+2#"&54656654'&#"#"&54632.AA..AA^gq  %1:K6Bg@..AA..@,"P  :31Fs_gL -CTX /?9?/10@ ! 9!5!354!,/4!@ #4!!!idty -!ZWP!ei[Y[ -^Y@!PTWS !48FI%)(((! !0!`!!CTX@! -*  ?*^8.Y@/:E L% !1e~Z#%% .$2jt-5 %"+L,x.@:5/.utt|(p.y$($'.(&9%9';(0.Z'i'p.. )K($$'($@#(!"!#!# ,*(?#O###*(0@pI.@>?5.@......,U U U" U U U-.w!ac++N+++6F -F -Y2F#Y@:F** '8>68P..@..@ B88BTZ+NM]q??<<<<9999.+}10Cy@pA4%0&%%@&8&,%<%&!& %%316A$>9+6;)>"  5/2?&27-:=(:  ++++++++++++++++++*+++++++++]]#!2#"&&5466"327654'&2#"&&5466"327654'&p$YUvOOPF3O$0"21 GMtIOOG0#-."0.$00!k]WiiW8xI74MM3nZgZkiV56FóG37IK3'@ -gGH+N/M10!5!#IL.մ0@?5@0^^P0,{y&y''0( 0P0(! $('$(%.00F@0QXZX(P0sss(s*p0(*0*00 (!"& (. !#$&"'&''&@"'(''(&/(0('&UU@ U"@ U U '@ 5 '0'@'P'p''''/k+]+++<+++<?2A) *L@">>>,.-0/3*,+>A 1Q8F# @ G 10E&>)Ʒ?K @&&`55;op-@D<_o -JK!TZ++N]M]]rNEeDM<<?<?<99.+}9999910]++q]]rq!3267#"&'#"&5467&&547632654'&'%6654&#"&&'326WSnYGE`%%mRd|q®/"~b}w)|{YBWY"̈́f=xyu?ui%?ŠhSKIYjnUzyh=ZFgj_Ґ.$ ;\H^y:1y{Eak2*L#@;E__dp %0%@%!"!#0@P -( UU@! U" 0@U@U U%$%1!++N]+++]q>@,..P 0 @ p  /?O . 5!͉++NqMN]]rM]?*2,HhL{Y%%'&4Kg!%%1 zlg"%%@dal[(#%%?Fbj @d67' '''@  0 @  +]q?10Cy@*  -  ++++++++q+2#"&546"32654&]]\jT]\\]#LEwCTXG@ U%U%4@U4 U4 U4@U" U" U"@ U" U"A,/.  ?<@ =$$.=. -?//?9//+++++/++++10+@qpGGGGG@6PGG !""!"4.!"E>!" -!#!#%-!#5=!###$$>== -.--"@"" "0"p""""" @G`GG GGE%"5P4`44Fa+MrekO@   @:**!=++NM]NEeD?M99910]567654'&#"#"&547632g%  (>*:CkY;e/=5&5 <-2&qTva@'[7CTX@ @ 4//+99'@ '@ BB A D@ D@.@?o@P``@p S@_o\X^+]]q<]]]]]q<<</]q.+}ć.+}Y10r]'4bWnjZ?h@]  ' -VD   -X -)@> 6X^+N -%p_Sb&B8>Bu%a`SS&44Jj[zL?,CTX:7(%@&!.&8&????9/10@y  &:xw!@9/9A@+@AA@#4vxz"p+z-"#!"#-/#%&8? 9A A/ " $+(.//=00 ;!6'0+G A A0AA-t-|/+/C+Y Y! ##>?AKC'.$.e!!.CTX@"A@)&.!.%:7(%&8&?<?<9]99@K. /-! /""?-? '-('9?:9&"%&8/78-""--/?@> / /.!.!"988''&h??+ 0\`p -@D S d  2"""ö@A!k++]]]q]?<<]Y]CX@ i!d+o/`A]Y]+r++C\X@f'i8* ?# 9@ 9# 9. 9#H9&099"(99 99@ 9-9" 989'9ز9 ز9+ز9>ر9+++++++++++++++++++++]Y]]Y!5676654'&'!567667&&'5!6654'&&'5!D#yuZ: 0-6L3%>pH@mcsP;0* .H9$6ZRN_%% %G\:' *%%X[c%%.%G16(%%Nij`k@@  && @5:5@#75 pP` 1!Z++Nq;+1HrUiCgSkw@ p11*)+]ekW@! -@ *:*!=++NM]NEeD?M9910]327632#"&5476f%  -(>+9DjX;k+>5'5  <-3&rTva@\;k". 0@8054/0?0O0_0|  & ! -!&, -FR@#@) h&,&m,0m&@ ,0,, /07!Z++]qq9/?R0%l$1SJqxXkIhA/.AA./AFF8޹:5:@5p::: $ - -EO@,  -$$8  -g@" @U 6 U / ? _  O  (@ :`:p:::0P**88g@ 9+]<<9/]]qr++<<<9/??<q<?<910r]++33273327673#"'&'#"'&'#"&54767654'Ĥ F)vv" * lQN*WM5'#" 8&%2 5(2rdGyo:+YfX0O=+0>:3.wPgLF]L -$wxCTX -  ' -@ 4//+/9'@ 'BB -A'D@ D@0 -4_?oo/O_S@* 4p@` 0P\ X+]]]]q<<]]]]qq<<<</<<.+}ć.+}Y10q5!!1J48S:fI]#k   #%4 -04*54@*54*548*54    -g6 TT5 -5@ -mm!jz++]9/9/?)=$0%. ;,I%"0))`>;6K{--!JnEDb%4662-D#2O&-%:B',*I1+9Cv+(7.032'0R.7  !/-*pdhHWz@"Yd6+%$ Y2$8H0YzIvQIYY &Q -)u&% N)GJ@ICID'(,/A/C/D/NHUWNxzw%xIvQIBCH=C7WGNXUO&OQ&O@Q%F(I Q%I+8UUUACC8N&NN&CNA&(FU"UCNA&1 +  @h/?_;h+78.8 86(>So""XF.846K@F F0FFFFXjz+]]//]999.+}ć.+}9999910]]]]q]]]+&&54632#"&547654&#"#"&5463232654'&'&'&5467654&'&yC9xn"",:3Ie-jJ4jsF5xl/,'8Cm0~D3l%4F4XRKJz?uV'.&)6fI@*FMsRZ[EMpAzX%3/(Ah=>1K_kQ[\%[F;Qn50]Ak?tFI)@ %$@ 4$$""' , %/$@ !4$$$$$@ 4$$  U$@$U& U p U$U@ UP/]]q+++<<3/]q+++<<3/3/993/+]+<??3/3/+N 2@$'4C%+2/]q992/]+??2/] #$"$"  -$" (# -( -((( -  -<@22 <_1dc+N]rMNqrM????999999.+}9999<<<<<<<<10Cy@.), &+,*, -) ---,(-++++*+*<99]7#"&''7&!2&#"32>54'&{:h^gT;_t]6K;OJIS6>YmiuT֢,qԣKD/A&BXR&8?{iM%k^@\    -  -     - -  -'@  '@  '@'@-  - -  -? `p @ - ?\ X+q<<<]<<<?<<,A$!  -!XRUcHUZP]aJ]814B(4:/=@*=" ++++++++++++++++++++++++++++++*++++++**+++++++]]#!2#"&&5466"327654'&2#"&5466"327654'&%2#"&&5466"3276654'&4YMMtJONG!/!1.!10#uHONGqPB#&. 01!12 jDMHIIML?2-.!2"'/#k^ZhXkhV5:MI24NI4kYdmZèiV5}G12KN35Wey[YfuS5/IķG2F3EkBL&@4@ 91@ 93@ 9(@ 9-@ 9.@ 9/@9/@9/@9.NId6" -( .45./(.  /5/6{v#(#oo_``PP_{'/,/\'\/r'/..('(('(./'-(,'C/B 7645C/000!5,-J !! !!!A@ -..6555A@;FF 544 441B +766l<,,l--lGGG$$$$$ @0CCLL11=/<<<< F#@ FP  IMdc+]]]547632#"&54632327654&'52654&#"#<3]]6(aWi+$'+<'3jmiWQf$ 9_hgjJ6*(ơ`B*-+$ 5F -9}x, h+ -)@ d6" -0 -v --d* * "F++@#D T d t  ""DFX)))@#""+h.&/ ),X+NM9/<?q9/]]910q]]+67632#"'&5463232654&'&##52654&#"7$-@U\jiHIT%!j&8P5*J"/\7DWa;g0O5-R^=1>X5n9@ !++NMNEeD/M]<10]#5"inYh:I@[&**"56&6 -5"#56"#56"#56"#456"#456"#46B "B -#'@62!<;"5#/!6 -X@ ++ ()/X V776D@E  +,6!! %222>0@P<@P;j^+]<<]N]qMq]<??<<<vG sb yJE=S;;apuGBLt! n&t$@ O7_7o777~H+6)++]]5CS/@=.////zu'!* *@$ @ 1?:P-----*@'':*01t!TZ++NM]]]r??99999910q]56654'&#"#"&5463256654'&#"#"&54632se? - -*+0FuUd9`r9 I@,T'd6 @@@  @_oTTZ+N]M]NEeD/]M/]10+2#"&546!2#"&546-??--@@.?@,-@?9@--??--@@--??--@޸,~h_<qRt^Q !EWt^y9S"I ,JXL D99< F9= dEDO9V#s9=*VJbSs! |LT.HQ H9n>3 #9c)%V"%9s"H9K*)"3b#%dT{%fdKHCC\dDqQJt1WEI%AEILnv#f, C9v Pj "%)+p-L/2 69<>v@EHdK^KPSUWXX[([]2`bbvclcdrflgii@j\jkllmotyzt~Jf&^hj(0T :l>N.,`ǘxj̐$8y</V4:8XF"v0 N & , IU;f C  w    8 XF   " v 0 N & - w   w  w w)7 w w$G*U-c - w w - w  w 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Times New RomanRegularMonotype:Times New Roman Regular (Microsoft)Version 6.87TimesNewRomanPSMTTimes New Roman is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Stanley Morison, Victor Lardent 1932You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic  as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software ), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Times New RomanRegularMonotype:Times New Roman Regular (Microsoft)Version 6.87TimesNewRomanPSMTTimes New Roman is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Stanley Morison, Victor Lardent 1932You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.Normaloby ejnnormalStandard 2014 The Monotype Corporation. All Rights Reserved. - -Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.NormaaliNormlNormaleStandaardNormalny1KG=K9NormlneNavadnothngArrunta!dA -T<*?A`?pEE2@+.2@()22'߲2޲BB2޲682޳*-2A -(߳(.2A ~@ڳ$&2dɲ 2A -d2Aso/O/oTkj"vutusA 0 0@ll2ml2}!#2}2A -}}}}|!#2|2A-||||0s@sss ssssssssswj)j(@g9@2?f@f2f@f -2@f 2@f 2?e@e 2@e2@e 2kAc{cc$c4cDcc$/Nm@0D2P-<@)_<7` p  0 @ P o/?O_:3@G:3  0@P`p ` p  0 @ P Abbbpbb_ ^ _0_@^^__^_ 0P`p 0'0J   ' P 0P` 0@@a'))))@L<F%@<%@ -:#r9<8I1$0%*$&#VU75u@,tbVQ;3-   -@+JKKSBKKTB7+KR8+KP[XY8+TXCX/|YYKcKb S# -QZ#Bv??>9FD>9FD>9FD>9FD>9F`D>9F`D++++++++++++++++++++++++KSXY2KSXYKGS \XqoEDpoEDYXzqERXqzDYYKGS \X"pED<pEDYX"ERX"DYYKLS \XI"ED""EDYXIERXIDYYKgS \X$qEDPqEDYX$ERX$DYYKS \X"ED""EDYX ERX DYYKS \X%%ED,%EDYX7%ERX%7DYYKS \X%%ED#%EDYXY%ERX%YDYYKS \X%%ED(%EDYX%ERX%DYY+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++eB+++++++++++++++++++++++++++++++++++++++++++adcEe#E`#Ee`#E`vhb dEe#E &`bch &ae#eDd#D acEe#E &`bch &aec#eDa#DcETXc@eDa@aE#aDYCKEe#E`#Ee`#E`vhb CEe#E &`bch &ae#eDC#D KEe#E &`bch &aeK#eD#DKETXK@eD@E#aDYKRBKPXBYC\XBY -CX`!YBp>CX;!~ +Y #B #BCX-A-A +Y#B#BCX~;! +Y#B#B+EiDEiDEiDEiDssstsssstuu+ssttuEiDsst+K!SKFQZX<> endobj 26 0 obj <>stream - POS/22]`cmapn)<lcvt nZfpgmɼ glyfY\O@&  `T@ ,-./0123456789ACGMORS_abcdegilmnoprtuxy  ,-./0123456789ACGMORS_abcdegilmnoprtuxy  &iiiD|ZRRD/W~ "APoLu\7LnpX cc-\ @Wr]g!wM+Le|C]h5G!\M-x ,I?)9Io#o 2@z1UW~~FB/OV)or,11di+ &  sC_a^m8Q[h|ATkhqBBSsX2Q|  !U{{~!""#rw"+5<Yoq22 *<Qaajx *>LQ_jqx !".5BOO^eq *G]ety -"&+G_u\ -m6>PQ]`E3-_dM?}$x;;N&;MKSj1<ex ~ 90+ -P >X!q}E -+NT2N7kwdg3|)n*i9$]u -MRhm}qyXgV%|2!r\/AMrLjUxiWnTgeRZgn-|{pLFF-S%>S?("bJmH3NFpyQ -hlOa+{eRtei\@uq@FXWVUTA@?>=<;:987543210/.-,+*)('&%$#"!  - ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y QX# D#Y!!-, EhD ` EFvhE`D-, -C#Ce --, - C#C -,#p>#pE: -,E#DE#D-, E%EadPQXED!!Y-,Cc#b#B+-, EC`D-,CCe --, i@a ,b`+ d#da\XaY-,E+#Dz-,E+#D-,CXE+#DzEi #D QX+#Dz!zYY-,-,%F`F@aH-,KS \XYXY-, %E#DE#DEe#E %`j #B#hj`a Ry!@E TX#!?#YaDRy@ E TX#!?#YaD-,C#C -,C#C -, C#C -, C#Ce -,C#Ce -,C#Ce -,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KdQXEi C`:!!!Y-,%# `#-,%# a#-,%-, ` <<-, a <<-,++**-,CC -,>**-,5-,v##p #E PXaY:/-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,&&&&Eh:-,&&&&Ehe:-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CXY-,CXY-,KTC\ZX8!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,C\X %% d#dadQX%% F`H F`HY -!!!!Y-,KS#KQZX:+!!Y-,KS#KQZX;+!!Y-,KS#KQZC\ZX8!!Y-, KT&KTZ -C\ZX8!!Y-,KRX%%I%%Ia TX! CUX%%88Y@TX CTX%8Y CTX%%88%8YYYY!!!!-,F#F`F# F`ab# #ŠpE` PXaFY`h:-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BY(QX@cTXC`BYYYYYYY-,CTXKS#KQZX8!!Y!!!!Y-,W+X KS&KQZX -8 -!!Y!!!!Y-, CT#_#x!CV#y!C# \X!!!GY #cVXcVX!!!,Y!Yb \X!!!Y#b \X!!! Ya#!-, CT#{#x!Cr#y!C \X!!!cY #cVXcVX&[&&&!!!!6#Y!Y&#b \X\Z#!#!Yb \X!!#!Y&a#!-B@ -1 .+<@@" 4y  -  A @V @V @@V$@U@ U (U U @ U  U " U @ U U @ U -U @ U @364   N@464p3 @V @V @V%UU@U U - U U@U U U@364 N]q++++++++++<+++<<]q+]q++++++++++++++++<<?@U]] U eko e  U@R U U'1:1AMAQ\Ramaxx P`p -U@U A @V @V @V@ ܴ U U U @ '*4  %&4#40 @V3 @V @V @@V$@$*4?O @V @@+V U U U U U U47+N++++++++]+M++++Nq++q++++M+++?]++?9/]eclM,D'> ޶ U U@e U U - GHVYgi4::5EKKE\\ R]]Rmm dmmdw  [TT -[ lee -l - A @V @V @@V$@ U@ U@U U U U UU U@$%40  @V1@ #40 @V @V @@AV$ U U U U U U U U@$%4? @V @V @V147++++]++++++++++++q+]+]]+++++++++++++??10q]qC\X@ SS bb ]Y++++7632#"32654&#"D{'v "P@! 6Zfm  U U U$ U U U U4"'4'4'4'4س&444@I4%JJ S \mr xy -   ! -   @V@ U!"A @V @V @V&U U@ U U] $p$$$" @V @V - @@V   UU U@ U U U@ - U]#;+N+++++++]*@` , %L E , &,#9 6J FVX h -.#,'>#>'L',,6!6)?,F F!E)T!T)ic!c)`,,'!#'(@ 0`p}@ -E" -3%3 -A @V - @V - @@$V -%@`,@ U,@ UU@UU U@ UU U UA - @V @@ Vt%" @V @V @@V$?O @V @@.V U U" U U U U+,t!4P++N++++++++]qM+++++++++++++++]q<+++<??]??<10]q]q32676'#"5463253#"&32654&#"f 2Ct}vnэze۠Ꙧ}|zxXQ%2dZ7<ݘjx*&@ 4 4@4+$   - 3A @V @V @@V%@364@U(UU@ U U@ UU@ U U@ UN@464p  @V  @V @V % @364   U @U  U - U @U  U  U NGP++++++++]q++++]q+]q+++++++++++<+++???<99910Cy@    ++**]+++!5#"&&'&53326653?|^O nQQ;HmO5s1GQS97p - @V - A @V @V @V @V A @V @V @V @V A @V @V @V6 U784454014"%4@%4Op -%784@354 U@U U - U UU U U@ - UNGP++++++++++]qr++<<??10]qr++++++++++++++++++33FJ>(7@, * *) **9 67:*I*] ]*j i*`0 ) ( U'@ U((((D@ U U U5@O U+,*499,IH,VY+fi+v +74/$42!_)o))/? @V UU@U UU& @V @V, @@V, - -BU@ UE' -2 )aaA @V @V @@ V U%!$U$@ U$ U$ U$ U$@ U$U$ U$[@'@&& &0&&9U&ִU& @V&19@ #409999U @@ V%"/ @V/ @V/ @@V/$? @V @V @@.VU U U U U U U18++++++++++]q+++++]q++++]++++++++<++++??+?++9/++++++++]qq999910]++++q]++q%#"&546676767654'&#"'>32#&326765|G_fvcj U@_ U 2 cpt  *(* G VWVhk{޲(9@ (9  &J&  @V @V - @@ -V&  @@ V Uc\+N++]M+++N]M??910++]]q]++r#"$54$32&&#"326=כC,;3“\m憣1nU-銼!Q& @V @V @V @V @V @V @V @V @V @V @V @V @V @V  @VCTX@ -  @ @ U/+???910@s9(V -@ @ (04 (04  ' ' ' 6 6 5 ((HYYYiiiyv yzz  -  - BUCTX@ D  ???9]99@7  -% - -  % - - /?@@T@ ?@_B"E -T@ @@ 0 O P  B/? |f+q]q]q]q??<<<.+}ć.+}9<<KSKQZC@PZX 88YY+10C\X޶79 -"799"9++++Y]q++q]+]Y+++++++++++++++'326767673673#";,@t -=K?  ) #22Bp ::JJY[ \\jk imk  #++5:FJZ   A @V @V @@V$ - -@ -` - - @ U @ U -@ U - U - U - U -U -@ U -t33 @V @V @@V%?O@U U U U UU@U U UG7+N+++++++++]qr@;/#4CSft      - (" " @V @V @V%@364 U@U U UU@U U UNG+++++++++]q+<+++]r???999999ɇ}10]r]336632&#">i?[^>BB;^&qH:'G?`rF@| - % 4 D 55WT -RSgde c`+<<Kp.$ .:5 KE FIW -V g    - A - @V @V3 @V%A @V @V @@$V%@`@ U@ UU@UU U@ UU U U @Vt @V @V @V$ @V @@;V?O U U U U U U4P+N++++++]q++M++++++++++++++]q<++++<++??/ @V - @V  @V @V @V @VCTX@4 @Pp  U U U U/++++??]2]210@G CCSS``    -jiju p -  "_o@&0@P`p    A - @V @@V$ U"A - @V @@V$ +@+@V@ @V@ @V6 @@ V@ U@UH U UI @V @V @@!V$? U -U U @V @V14++++++]q+++++++++++]rKS#KQZX8Y++r+++r??9/9/]]10]q]qY++++++#"4632&&#"326<r鉭Zj -kl‚&>#=A @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V @V U U @M 4%    #  # # -%%%%%UU@ U U@ U U UU U U] @V @V @@ V%U@ U U@ U U -U@ U U U]3# @V# @V# @@V#%?O@U U U U UU@U - U U$%x!GP++N+++++++++]qrpXdL:&N_bX'l_:xxPo[@5 z+N]/M105!sʑc3@K   @OO@XX WU_Z_VW A @V @V @V&  @VU U U U U@ U @V @V - @@ -V&  @V @@V U Uc\+N++++]M+++N]+++++++]M+++??10]q]]]q!2#"$7324&#"c6FymZ4 @{ $5E?"3Bp:<<LL]] X]^jl hnn  //0?@LPf  - A @V @V @@"V$  @ ` @ U U  U U U U U @ U t @V @V3 @V @@V U U3 @V @@V%?OU@U U U U UU@U U UG7+N++++++++++]qrc`Ҋ~K|]Ya p@    @0 s@!#4O_os O__?_o+N]q?rs^sg0pMQOa7U*#CTX %U U@( U U U,+ (OP@ U "??+]29/]299/++/+++10CTX %U@* U U,+ (OP "??]29/]299/+/++10@G:L@#[W#flmg#z} =:)d(O_"Ph A' @V @V @V9 @V @V @V 8@@!#40,8% @V% @V% @V%s@!#4 @+Nj+]++++]q+++++++?]?9/]10C@PX'#!  8888Y]q]YY732>54'#"5432#"&4&#"326p|aS}P66mƏ{z˥tx|}SznLp Vk4Ĝ -  @V  @V @V @V @V - @V @V @V  @V - @V @V @V @V @V @V @V @V @V  @V - @@7VX h LL   -    @ - -f -@4 -U - U - U -7@ @"#4!5@ 4  U U+++]+++++++<<??<<9999.+}10C\X ޲9 @ 39"-9<++++Y]]C\X@ @ 9 P9 @&9 "9 @-9+++++Y++++++++++++++++++++!!533#ƴ5_Jki@ ?CA+N/M105!i%@< -<_o+]]?10353޸pĀ_<'*qQ^gQ >NCz*V9ssK9$sDsBssJs<sSsV9sUsf!ssFA9V\Ps9cssUsMsa9msUss9lD  Rz`l!#8#%'(h+l-x.04V458;D>?"@CE,GfHILNOO<*</Y: -$D2 -vd0  & " 1 E/ t  #/? O  - $ D2  - v  bm 0  & -        )  $9*G-U -   -    2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.ArialRegularMonotype:Arial Regular (Microsoft)Version 6.87ArialMTArial is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic  as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software ), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2014 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.ArialRegularMonotype:Arial Regular (Microsoft)Version 6.87ArialMTArial is a trademark of The Monotype Corporation.Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982You may use this font as permitted by the EULA for the product in which this font is included to display and print content. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. - -The following license, based on the MIT license (http://en.wikipedia.org/wiki/MIT_License), applies to the OpenType Layout logic for Biblical Hebrew Layout Logic as jointly developed by Ralph Hancock and John Hudson. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the OpenType Layout logic for Biblical Hebrew and associated documentation files (the Layout Logic Software), to deal in the Layout Logic Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Layout Logic Software, and to permit persons to whom the Layout Logic Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Layout Logic Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.Normaloby ejnnormalStandard 2014 The Monotype Corporation. All Rights Reserved. - -Hebrew OpenType Layout logic copyright 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details.Arial is a trademark of The Monotype Corporation.NormaaliNormlNormaleStandaardNormalny1KG=K9NormlneNavadnothngArrunta'A T,,,"+*<*(&м)))+';@#2A- /   o   _ o A'/O__o@3@3@jl2@a3@\]2@WY2@MQ2@DI2@:3@142@.B2@',2@%2 - 2Ap@$&2d 2A -d2AJ?/?_?Ӳ792Ӳ+/2Ӳ%2Ӳ2Ӳ2Ҳ)&;@">3"%12A!?!!!!!@! "2@!2@"*?2@!.:2oAJ/`?_"""/"?"_"""!!o!!!!/!?!O!""!!@+HO7 A &A9&%8s542V&, /& 8ʸ&~&}Gke&^s@R&ZHDb@s?^<&50+*V)#U7h@,XO62,!  -@+JKKSBKcKb S# -QZ#BKKTB8+KR7+KP[XY8+TXCX(YYv??>9FD>9FD>9FD>9FD>9F`D>9F`D+++++++++++++++++++++++KSXY2KSXYKS \XEDEDYX>ERX>DYYKVS \X ED&EDYX ERX DYYKS \X%ED$EDYX %ERX% DYYKS \Xs$ED$$EDYX sERXs DYYKS \X%ED%%EDYXERXDYYK>S \XEDEDYXERXDYYKVS \XED/EDYXERXDYYKS \XEDEDYX ERX DYY+++++++++++++++++++++++++++++++++++++++++eB++;Yc\Ee#E`#Ee`#E`vhb cYEe#E &`bch &aeY#eDc#D ;\Ee#E &`bch &ae\#eD;#D\ETX\@eD;@;E#aDYGP47Ee#E`#Ee`#E`vhb 4PEe#E &`bch &aeP#eD4#D G7Ee#E &`bch &ae7#eDG#D7ETX7@eDG@GE#aDYKSBKPXBYC\XBY -CX`!YBp>CX;!~ +Y #B #BCX-A-A +Y#B#BCX~;! +Y#B#B+tusuEiDEiDEiDsssstustu++++tu+++++sssssssssssssssssssssssss+++E@aDstK*SK?QZXE@`DYK:SK?QZX E`DYK.SK:QZXE@`DYK.SK>/Dest[null/XYZ 255 594 0]/Rect[276.98999023 797.05102539 312.55999756 806.25]/Subtype/Link/Type/Annot>> endobj 7 0 obj <>/Dest[null/XYZ 292 420 0]/Rect[435.93899536 797.05102539 539.09997559 806.25]/Subtype/Link/Type/Annot>> endobj 8 0 obj <>/Dest[null/XYZ 70 44 0]/Rect[70.90000153 35.4499855 104.70500183 44.64898682]/Subtype/Link/Type/Annot>> endobj 9 0 obj <>/Dest[null/XYZ 115 44 0]/Rect[115.82299805 35.4499855 288.85198975 44.64898682]/Subtype/Link/Type/Annot>> endobj 10 0 obj <>/Dest[null/XYZ 467 44 0]/Rect[467.97299194 35.4499855 538.70001221 44.64898682]/Subtype/Link/Type/Annot>> endobj 4 0 obj <> endobj xref -0 28 -0000000000 65535 f -0000000016 00000 n -0000000076 00000 n -0000003861 00000 n -0000254518 00000 n -0000003943 00000 n -0000253773 00000 n -0000253921 00000 n -0000254069 00000 n -0000254217 00000 n -0000254367 00000 n -0000004209 00000 n -0000052955 00000 n -0000053428 00000 n -0000054257 00000 n -0000054841 00000 n -0000217405 00000 n -0000145655 00000 n -0000107442 00000 n -0000055467 00000 n -0000055668 00000 n -0000107420 00000 n -0000107633 00000 n -0000145633 00000 n -0000145847 00000 n -0000217383 00000 n -0000217587 00000 n -0000253751 00000 n -trailer -<]>> -startxref -254796 -%%EOF diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/52 Fludioxonil_RAR_07_Volume_3CA_B-5_2018-02-21_Page174.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/52 Fludioxonil_RAR_07_Volume_3CA_B-5_2018-02-21_Page174.pdf deleted file mode 100644 index 53c704e5..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/52 Fludioxonil_RAR_07_Volume_3CA_B-5_2018-02-21_Page174.pdf +++ /dev/null @@ -1,371 +0,0 @@ -%PDF-1.7 % -1 0 obj <>/Metadata 2 0 R/Pages 3 0 R/StructTreeRoot 6 0 R/Type/Catalog>> endobj 5 0 obj <>/Font<>>>/Fields[]>> endobj 2 0 obj <>stream - - - - - 2023-04-26T16:31:42+02:00 - 2023-04-26T16:31:42+02:00 - 2023-04-26T16:31:42+02:00 - application/pdf - uuid:10ba63c8-1472-4359-80e9-b63279f025ab - uuid:57bb63a2-79de-493b-a59c-6ec999a87b85 - Foxit PhantomPDF Printer version 8.0.2.0718 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 6 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 149 0 obj <> endobj 10 0 obj <>/MediaBox[0 0 841.92 595.32]/Parent 3 0 R/Resources<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/Page>> endobj 151 0 obj <>stream -x՝mFr `岛ͷ0`I޵ra}F#iJ'.gtlΜ~\~xx9&_}uyM~|_/_a~w<'\^I6e**IQdiY'/=|%o~\m/lfm?mڡVR_6CT&Ǣ?J,nf@9;UsyedtSe1RU=V_O?;\:w!Ӷb2ͫ$RjĚYQqxƀMuCI~:AUE|;'$~w&/o^CZ jޝIkl?? vfLƜeAΫA~¸GZT 3Кш5tZwIqk?y6]7;BпDf:􌆗zlzpwҎ+=T Yc>JΠގrl}|3''7V7"rǐZ0cź_l/oo7.v=pؕ -k -|U? -Y-%pu"hg_}q+ {s;,sdPD>×eiו] \iy -ڣ^/llr,n4N4^U^ RHQjbGa4USc<1fQ+/tXّDY42̈әJiU{ jAdT8}v,!W3H@%[h pxe8zD2W;׫g{Ock1]O|MvNi|ycnӣܛұYnz9<D4Yyw:}:'}ΝQBev)Uvv>J[`OˆI}p>m70ٵ۰So^GkHT"hyp>B00"?†*orql 2xݣ\9|MNkuL&joN>?Q;EOPB\ޑ sna ~,jmyۍ=$ Է( ?8SdݝʐjtD'na#j}'FOV׶8o{~s)`ǒyL~_hX.񲁀]zUsh/z4#~MX1bA!{q͈$ i@0jG2+\ ϳbq#!UW<(Tׁ3b^90@}R>2zF>jCi)5i6g"[u"=Q'UBUPUWjIje7n0MĠڑ0z4c Z]e<]X*fϨ,s~\Tc[5igD4J,kv[PfՖCЀz0cp1@cct0f7u81vÁ:c!qaQg13&ujYGW ?L/[M^;j3+ԆBL8^6FT WSe Ui]s'nE5M 0ʼ'UN":6!B6+F.P'"x;:VMpohq +M4դ/'k.5LRs0.޼ky19wIVޓr -;<[G@I'I&I2W^ؼ%UNR/{|$:r`nt*Ѯ-Zs`SpK}fruyCD;}@v4> 'n>\w;DBw;ĸv`(OwEnkP'nv""1_XbZԍ;Uvi KwX@ݹz݀q<6 l9&|\ -T]ۺp) н@\};Mt猡 O=dfR^dghdP.Ps6߭w5w 8#>C?Cビh69 v!R]gHQ -Jۂ7Wb!9̏#,6֛u {u{2r4\^$ZVOEŇ40d!g+dgmSA@1)8"8Ek\ȄEAj<O d+7EZ#Q[ -@ѕ :s>]WX-gI"Ѝ90]"yno,+T_Jc<7B7(GT}s׸*Uc*as蓚%%ƹGɽ4wyj͕inn1~`ەNpu s\vbVs fz愷b[ c@i U v}t -u 1IGG I;n@pb]Hx vvf&] nfȺJ>Nw}'AH  q8Ľۉ/15gB&_kxib@\Xx?ڦ ʲɦw 6bގ锰&t1SV]7&0}+Zr:GQpN:gJiRp.2M$ J;Z$kƏ3ϏE~w X8݇*v9H*;BH.o28: y$v2p$P4#.Y#782###\J#Xv)A$յ Sj~\oi6F@ Kdb] iqGk2]x ?;T۪y*6^{SW֒; +Ҷ@8j/̉wXaχ"BMvFKh6\Y3cshTT|Ū|:0 ,՘t/E4}wB|<գw;4ab®7wnꉘLJۂ#cgJ.!:W[Q݀_ꬻu+u+0$!l= . >c<8f8 ]’k]Փ[qa%z|L",?%9+HeZ9,NI!Wf4J,8 ,P*w)cX' ^Qpy[j eZ+)2 pé4^8 S$xjn`U>pm3-f{wile`=-˵ dV#d )edͣ-v$ͧl eZF׫iTiwuy~MLsYCu::;|:M3n`@>l- -pؽyREQ ]00DYKJ!$P8zh~"w2蘩 +ñe2Wτ6MJcbNhEKTSN^,#!' 9uָ-)W9dйo,\ L -.{[bD+ ^L}rA—d@g9Z^&J5(.oZ4>WiA~z!]L]›.=ȗ`M;P2p"仼B1ai &^Y;T䴖jH0ssm1x1}3iޱb #063nbɏCXdӷ#n'"/;t7ƻ-s4GrƉ0#7O)f<ǟ_Gh-8:D6;x<pxahF/4OPx5~8@1Q-w?v{f&;$^t tI4zH.;DGϮL|GY#$N9).VkuJcN{zd*"w94ᗫ&*|(׮uH+rŜ*q'1N/Nl3O'_8|wE\~um5o&sxi:Q𢸳6Y.tSxSx,^5<(5n -B~ -&7i" -߇CGsRxo:5Ǥ7DYKz?N Ts pH2^|'Cd|"C!pm G3>a4L4|p7рux  `LC0%?G-s^߳xDd笚)NB2*ZO7xSgp|_dUx=+0\'zShuU4iS&/_h9  hy;d'% :iB}ZcO0eOtW+;HFϫ9 C]4 CsBxpʗS*s-[E%j{T 3 ~z U G=I|Ϫ)b}X4}3b) rRT,? -{ܻYh\Em>/]N&H,6lc]X@G]ej#Egber, u YejtDnMs֣rӾ#<:=;8tw>o|RBah -P[H5P>=t*BŇLG%JXԗ{SEJQ;4*ݞfFֵzbj>w9m读!@ -xMnCͨ~$޴7BT~[WN_2QD2x_^4h[ߺ8oqt,vMͤEoS)]5, -ͤ^dQszJ h_zO\i)B׫^ӫEB/0 -endstream endobj 152 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 159 0 obj [161 0 R] endobj 160 0 obj <>stream -x]j0 ~ -Cq]C`kn,8(!o? L`-}11.ae0I8oޕ&*-p- ƠK . xT ^~gj[p8ʠofF;uNt0-"K_E64j*gV!N 2OUP{,yJCT>? Io+ -endstream endobj 161 0 obj <> endobj 162 0 obj <> endobj 163 0 obj <> endobj 164 0 obj [0[778]3[250]11[333 333]16[333 250 278 500 500 500 500 500 500 500 500 500 500 333]36[722 667 722 722 667 611 778 778 389 500]47[667 944 722 778 611 778 722 556 667 722 722 1000 722 722]68[500 556 444 556 444 333 500 556 278]78[556 278 833 556 500 556 556 444 389 333 556 500 722 500 500]97[520]131[400]177[500]] endobj 165 0 obj <>stream -x xTE0ZUޗ>ݧtgHBHN6d EIHA6!"  4A?u\őq1 3u2|?Ͻ߽Uޥ޷Nu@!dE}̽˲QWAA#]>tˋ ya2{]_Er0 -Wܞ]OOPxBiae/PqYgѳ*!K5"_"\lAhܷqيs=[/ȟ;z&ԳbtV]0¦WX[Gt\/ WTG>AgCM÷HU jPHWc1hOol7B#ywޝwywޝww8|o;c=λt<λ;λ;λ;λcޛ+SA -'#K*((բ -Fеh'R$X ܭb ;xXi\:`o,1N,8]'dp8b:"q<D\/H:DS5 T \'VK#|--\uC_[27[#trԠ~$(%e3X/+ $Cb/@ˇamv&%42yH*uI7]HkFjN7m"yuQmʼnSguk;q9L}l*ni`<$"F}f:tq6 2Q_T*,2a&6JL0㵱sɟ3xߣ(t?A$s-`I2M"/Z֨a`AV1eD_8|=}me3_1Ko|Yә$Fi&aY0FCu:=!;aC6fO`'i/Gbh47 6G(02anC% ,g^g7o5jQ|D!bc|?i\< 'Byeka%CvJPȮN-2ՔgGS#Wb?&:X2)g啸N^ gnt ]G 0hx 2!fx|PS'ָ-(l5&<9e/*V(O=LLN\ꇱOM@ڲCdy-&'b8aqɉ u4&:0PX%Q:g[.[$}5Oed fK2yFeNq, e\bd`U( VaJQ-_ <'v'P^o膰<!C(~'A߁W#L!K  xpU(:3#ah. h@60 ~I%U ʤ%4(A=>5SjW jL&IfEmoCcկW#:lB<`r/ BxTn{a!,)"[냰$ -BhXC!2XK>Gy@wB -}_{ޗ8We) v9%BXBS8 As |'T arO!}Jd@nldG"2`&D^9p4rt:9?K -=1&Ֆ8 -vQ:h7x@*ANaqɩwn7GN!iːl ;٤2'b?I&x2QF7rs9|HÙrhDQC&'_ҿ??Ÿ T$wPwA~vP?5]!鉏9JAJ* }S=_a -B$ #R"_&'@- 7'6 "wm%DDF51=QX^LJD/KDkIJDE~L,ACbaD' + FῢN,|Dy[g N&zx/a(4'܄ȽHh 'dV.0Qu"J=+W}A>s8à3O,̇('"m djFL(Q֢r;) mOmIx~fQÅAQ<_F/Eym9=0y ~f yI΅ۢ1H.H]>r - m>O%%yE4"efsw+_}?RąN@E,E =)x"5 ܊efV 0xD#㖡(LsR=0BAE`OLz:/SLhu3hPD~CL-h?hƬYA 㷮Y=dO#/5ₖrE3_Tw1b:cO%1F*m|]u9t]ήUwMսz2}W/}W/}diӚ=*<;l=28d~icq׃U -XVpy ~2[CIlB[*pW_xժZ;3cr=j$_%fW+θX,VŚ;:x@zws2/f-+vY*6fP?&k 4fhzfh1>f +dFeG@_Չag+b1,V7 t#˰JX-/ L4N7IT^!7ɔ:CPA_}E?l)wsdeAҟ?Ԅ)n)SK Pg]Zޗ^"Bo؊Pb@נvޚ*DԎl h7*Ecu3OAR8,Ft'ډ/HCh$P.ǥ?ASQ{z?h+ځ SM,?V wF6n'Ҏh6zh"f-.}; -tr ݄#Ohe1lv_&Gl^Vbea8w8v:ӅIx^B i = ո?( -A6r9D!GeZ7[Ga_Էim:.OOo@@]KQ̾=kD~?bP F"0śx~S %UdM'_SFJf+kvW3ܳwʰS Bũ{S+@y -47|)g%Z(g7JC5&!H/}L@( *x2c/4tso?}?aNFr̨\LCȭd/<"N>$'?0xt}x4(d0tOMJ߄>d~ڿOq`=\lAj@!b΋jV37%*AoYEJ)"s[p(~v- cCa1GkBǘIk@>yqt9Z ҟvAKP5,5PNr v_I؆^USr/h .E8q5 qk~in/] \{`kG7&F8ÖNyԌݨd`&XYU6``>qχB*8H\rPld5{A˜>BH*FexCjc)[7Pv&]ЮhÀ| T&vCP ^1lx -L]={ v 6bcgr¸ ;ٯtޡl r5%%2ɨ$ ؗQ/aR)nDj@EO MOԵ סH (- 0ˢS3xJЏH`E?`y s}abnr7!w %6whsvíw#@1Oo!uFMF_GtIl/*3cj:e|낖ϻPC %xlؖ-XF*+6R`h /+PVϞ0nNY7d0*neGǔDI?j;iI=?'zׄAXM^yrx{$8]n\6Hd_WI9un#WclvaHT*6UUYɍD>5f)鎗^s\.i׺tlΗ^֗^jpZfѹt&^qKCު;zV`lœ6=9©^Ï·_/߱k\CuTq6-=ҙZHz1v)oab{O>aElը/XHjER5҃5 5 .X'B 7ümdkQiKdĊ?ҢYN \0l*+S S=c6M -V#{/ٮ~S`2:]h9T< -Zy/H6CuqsMqא&\Z OtP e 9WvHf6/<ͷ+JJtJMS,_p’An{O0*`*'7P6oifGRGq -ia]*2(ZB,dfYAc @׌@GNoE`p#֝;$G:=I*t(P[Rv;Ŀ%t .1'`9D2 `̡!f(IVFc$7r(CyUT̜,P-@YdL*JU'7uuFRNviAiPdf`c '+zq (Yz]#Ti@@P FU X;n#xg}c,}U*nR*Q /]uձ&%뮜~;,\q kDChQ&d{4u'~;Dxar;fL7ʸZ+EՕ7SY8ICq)Eʛq'"^C!{ycC=hdcEc]`/E@e؛KۜYDg? U׼C|wꗪʢ@aѸnjf=*iAGUӄcU|* 2g(tFg4lĤ\C!neV!&X/5CUB$$#igv2 ȨKZ_-jvSP+ ;N Qg17b לa\4u /S3kh"yJ6 ЦQVav!ۻh=_/R8T|B*t?{Ů^r#V]=ʹ?zoɆ]e=> J f M:~MǶ8ȩ\|Ht1J:#􎷑wn?ҾaWi&Y%(x;6)q{>7G8y8TP矇fBܳ< -2:rV>J]Tf8kKSSvox%;Zk߽:]yeܦ\7ro\O%zSW[z.|{l?˧[_Sar%Rf.xцm.郞#60XgomdnܖM@" xċD 'sᰝ1[M -AW< IKҝؼ)yLo*?*G&WqxBY@n&7<_-x/'s{i*BK9L %Q yacza5TdVTjx0P1ןKr WYy1XWʶP_Dھ)jM=7zr4őE55-Q9C!f xd6pK|aMsx\&Mڨk:A=I uNNvQ]55_F:19q=e*@oUuXZ& -ODoׄ i# 2^+Dj+(+)VF٨5h73m-m}Y~ڽ yxC]B[&_kRmtڥ?cPq9^bX+v‹4ieE;yeŐjfeQ7( -UEF VzBR.ĩR()Jn'J)w^XClJlNlElClK졘*vo[*Ȩ뉾> ʲ!Gz9Nbjg#~hnDh1`?F eXo8ԋM&34e2hYTSރ)\Dtm Z*j ZN4+";<8\=eB|ojjf:2W϶@twП~Ԧd՚&BD؈&0c5S 5k47k eռ¾\s;'l`djAAIKr} -(>֛J -2GJ=#/q/E}FPsZmy!Y ZFy -1XI?QD 1ʃiX@Y\}O1u* 3(qFyQgssgESKsã3^oXuy#w.Rs);`SWmv(>qP9^&5<b†+o =FUڻtj""Z6մcGOj-FrI'yǚJ685#(}Ѭb9~3U}ePLqWJs9<p|ڣڋQW -v-"l4 #{=~A#*[ . -?! Du|F^&WFFA߄T~▪"p,p)H6=2`>MG(psC^1K/y/"ҨS -†|gRzo7۬^ 92!y, .Ï5TcTa~m 9vh>U0褧TNΆQ; I2 kij%1kw2M`rOI{ME{HrR`KrWfDY^^;R[SR)U"jHS}ÿ9 wAݭDjmooe[׉z1k1M˘5zev=9A#F 5 dڈeó ,ۨJ%܂3gibo) /ԉLܖϬIpߙܩϤ1^LwGf0@|$t >s0|k)(M`{^XsipFh5%h8=) H9@2 -yacFֻ H|-/V@3Ԟ93&3L/Iޕf$* -a<$7Pz Sb[?9TS̃ ygs8"sY#,, B.v=Ec+QȘX ~xK{|5^fmtKޣS9E@ÜhT5W=lz<ĜA` yBt=0N/*k,n~ծHI3&䮬s0$DW਑(Bhӗ8,L3ZƤStu._\?JFw.1'ڙ_"X*F -fzX]8j}`vpP,|A#o+`AUUr>_U>/nTU  f -Qލ#OD뮖2oNEO j:ǟW\DLX,: -kTu} fM]@Q$[NzNRUb5;ȏcNҵh7.nO^u6eh{DDߝq]C<-_1V?K cO}*JDvQ c5)ϋ<݃g56Ew̤8dA ׼Й9K˘b^^@T"#oV -=>/p'7 ho@ -l j['',={)o<ߏwz|ܫBT-ZY^e4]j L d !s#,S#B l 6% eP K%NĒ^1}u5ښ)yqRG@ ATE=墧Ȍ^L -}d\OFU,##n]c Rq;33.Y}# -|n -(~7A[ zI1=Y9C -Ɣ |OӇSp(o,LB(VNmxs - fGK.r-^fZ28޲Qq|eMӂ5[m;vE^7n) }g9٘Ns FjFt -^c 曍Xtkuk+kk·j:_hS /h0$T̓^Z qTj[ *I\)UTrI@2iF*L,c&H5ڬA0城yUGfXIʖςyx(cʡNz(Zw C7@]FDJ `8G A ٠!iFG,םuzG(sx#pYN -=p;x5]um^֭f՘Ⱦx^ߝZz;z;@Ԯ'XEv C<)B|p{{QNqAqHs-)ֳ̳6x hj]??~ts*]WZ9AR e^PdZ( -DQo<<d`{h9AG#"O^r` -,¯` n*:$#ɮ AJEc`w/{gR 'Cu!+j竚.w@rz[`u®H^-ƹnbb#W|\ATbǙm^h#{ LSHRdZc%O~UΚ[7Oa$ueUΫ*;~&L?/i}PlIR gFaj2(qBc7X*Z,SS -K 2VHSG|~I9wSQ1jFkdg|Le"oԲ"WYʈ6+yH Qz0ErT -2Gt.މg8ޏ(r2?I?=4993("bi`VPy8H73rNjPCPp`S$+Dsi?_SR",JT*>QGqC][Y_X'CH@ڨD†6*Fyzm%#cJ+aZi"k&fOn$c9 @J8ekԵk -5LĻoX.&[3y? O=2\T$LDSd5A, -5;DZw⨈٭6‹ځkO9p؜.9@ >N.0d6ʡT*zTIB)y\6R8t6)z=R-?/_!:nt!^2 : ʺuX -[.?cܮa;LuuQVGMt|}s.9l ug$~2U60$c]NioځKLNOR3j֕@'تZ3."OpLunN'D! lQ=w.v=L:_s}*_Y -*4lNY{R9rU|gy\}) ˸UUy7opDO%v@kxalJV\JP1].ۭ"pXwӁ3 y`#L J%Rg6qՀEq8ѝf*ϳ鐖:F9]v)ʼ(E:.7 yOԖ -~FTSiA:$k4Ǜ*xz?\6p6v]Y -y2="ZIO:΢|ߵWթEe.*B^@_E+{}wPlL9X2X&RaUԤf;©*Lkޫ.*kl w؜WOdBaݖfXE8Lr}ҿf -h/X k%DTkRҫq c'¢<%'ld9ƈչb?bEI1. `hQ1nOq\88ϗ[P0;y\..ay9֜R\|  9өSzObjs#Tp*1RR&Msd:'N 8!' 4%Oeӷ5R2!>̘`ڪ|wϻ 93X`vfΚ:1gg[,##rҎ2JVF)xMהSWtY|%֧P("kOnY:z\{~oh Em6LU2-Ţ85W_ |8>Y%K-nٖe@$`a'q.;C ܔP(.RnHH PJ(GВr-mJR-Z1G~7yoQPYzm;H8??7,BCDblvv{U=5,i( zs|$g4&ƴPgl]0ih̆;y`s'EOAb ?<ͯ)„GD"ZPfKu;@lCS5(X]\w:v53ͷfny0TȫXS [,]ޅwIroltmjjmo]T8ϷŻ Q*7ɒu{f'|5Z tEi"(kZb];X{O#SZmHKZ+Y.&]((*=-.YlR+["~{RMCe͓PG6+tW'{77~͡ЊYVd+*L9jBHPf`yb -C& ~XS֍:Uh݋y[+m/m;TӨAijKzTmF:ȴ\}U7=ꃫӏup_0+E}F̉c~E7p򌤴8ZZX,A>/~1gn0$fU ;%+%&BJ=QHFCA΍H>NN#6ۓ0Vuz -zk72c%Fa]/u>tLyQIrJs۱}ϭ::jog]ߜ25]=k],{ti鵓ϙzlUCWj%:nڕqQ bFCM |(Ҝ)>ЊcMJl>SRX0VwLG UeZY{Yoֲe{erԀ(w5W)ҮQ*T \aPv"l10wT1Y/EeFѲEM&C=aD<CuM!C)\dPD -qZ k oonJs-uCb *. e] vjN_XWjS.Ӟ;g)Et-$Z7NO#jp{/sL8XH 24CyJ^mobC bm"[\˭''c_UB8uezk_誂 =BcOO (ً`,H\]?i3G&lNv;km|b+x+OmK|2Y%5fws{ج8r@|ԥzA *lt>>]s`½;V7>F$Z#a/|ȀYO4u=[|k?k¨SSUGqSdl jgܸt%Y+WBŮn`nPH >5c7'c -s?YT8A)IΩ|#IBER1,H9o - k 5vRĝKg/}`鸥jS'l.+=~&s+=)2sZUKϻԣ^}w& .ҩtyQiNjiOg˿cNXoqAy3OuW^C:!z9]\:T%% , X8K/NmB[n8u6b*{v9x\u(m(jX6gxj &FY zX{0jջUsjRBIp6֋ V::7Z4`Ȅu'… 'd/sZUu-dQ3&7h4?Plζ 2W=`zȲlW[:QlϤmLNV/-r[q6mr|l^Wi2=e5" Vت%SV-BZq+^ZIz`U -DV)dꫲ ɠs2g5w5+6<Oo8^{nܧqnD*j$ζXN(/*ة y*JagN 9-LWpB+-U0YSW*ukR[X+:tcFi=``?`:{45K=zY@A5ṙM2FNM_ kj|7s#&zNiDpnY]ytؗz V/=;oIg/[sީwLmjUҞ ]i<,^I_U]Zy1,^)Tj{q)oU[/|u=n9O\j]1S\BQMD4}ȝrt 3.3bMN; -ծD -ѽC(ƨ :75W4W%cJjE,Q_l2G#nT { -Șm¤\6@MpRU IthMq/.x@P -p3{*ZRV2Lֱ Uj9Ts<HWKS4Φ)sCxQK0K23uUQP(P DvLZFL -jqZu$26`>Ԕ]hv @| ǟQV:z(Ypť+C+ -_y֡+יqs i0d Dx\ .'$'Ue@6T -C]6 QRJ苫nLFqŀ?<@d>6rvY- %pU5R&zJߧA|':1I8oS㹖TfƠt-)j m`Oh_H :ÿuvpN7 8Mw͛\!skS94턡E x\ Q;kwj㄰!k{Wvْ%h4PrӾƾεط8(w|MyWNXܥnj,FpSVšӔ2j%;_4 VFO>d`KQW*b`$r`,@Z6ZXS j$zUj,+ =쁧&xPq:O -x.=,QKU*DVf9b?xBtF -ַ>6T*PV YfmOٍ.!]~[ -zZJ[{cR"Aj7v bg휋Gi!āf;ߍ")*UDEmXr rSa*1xRV4*WtdL.g3Z s oa}tսսM6f>7uչwe*s.ΜL~;u}c;O3yz!c<kAw(IvUjMT @hOq}C zWfj)':&ĢθZi)cZ3nk山qub,ff#fl -,6[&3(4<C\;6͡['ogi2PT(Cf7 < Z`s@WfVC挐y9|<c>fd2&0ip3>pep8hѹXa3m,L vǟ7NŪdIVhڊBXgŚ.Ca5#^հd KU- -G$3Hϟo q9'k_Yt42˶g2%g_&fӍlS GN&%a9 `|]v:iϝ}xrv~qĮX5Ã1UYUw̜wZk2)b'Lq 2NO4{!.m7{μn:kEh*^/?c|mU`\>_A{iCEm" +]_lH &/" !VמtńH^^!/XZ$y],iաD6N xS/ƢV%f7e:NXL\>yN(@:N͙J~椮i7tW)Ex뚖CQo@v5opJ$GҎٗ4[$[P3 6d:4aSQLm$=k9ktnOloL@1-6?@n 1!^ˢ&C,%;rxnj&9% ݟȷlxa\j(DO@dqIQI0 -B;`ͧp8B Kح1]ΦAVF<OQ˴W oPzfeci)պkuno6ootnK9s\"oc)g/Gr)Ɠb9}2;.UEAr;@OuUPeBU~ajo<*L -OvG%Wk ,.pmM.!⾹NS\2<)&v8%aG<߿WK{m=U"0uC ++o*裕T:P~J'*F.0$ eaC]z躉ӷ/>WOm?#sCT)5u7'mLOXo8ޟ:aN%p"QR9 ?Ϻii`ܒw_=i"pJڒFGVtA -ðEslnCqZO!SṖ4b,-vWD!TR&boχ7!nR@2FVƩZ`+ihs.a*CAYw㓑 efO7)[2O XT'(rxgqX4 s{wx7gsb,A M3 |:}8q~䒟DzxD<60m>/t~4i#r<Ͼfj9TsyMk~@r  -?QP(l N٣P,Bm7!(HCPz ):q|`gVڲ (ێ+boNdi{w9|*( pf m41p蓝 K@lN~D`)?H>&A߳~x&sƔ5y819zCHaDfnX5e5WxbOzҥ @o.3sK{o\^5qҲQG/Z-txτ-A@WkͶͲx!s,mw就cZvEdBNRz{<`@{ -@.&[I:,j`Ro=s`aKclr&1Mv=e=ƚ\4Q=FG>}kۡjr˙V{E.)Q䎒GHBEDX⤨@Jm3>dl -)MBl!!FEj tYlVF" -$2N;ONdȬ:t"3Df߉̪"ϋQg3k1]ܰU7:(oCqøcrOq! qr'4;ba9 ΡWPx;pֱDZA̼%o0r`KpLїE)]3zo蒪#ϕ:gy:<Պ((+KG1l0hfz *(`zoҊ*47zP8df;u!5V8pHI5|W J+bU ]-spqIDq:IN@F&Q Pd Rs+N%00͢Xl_*뫜I1qAa l-,r!)|E`_Ȥv!yX?_a¢w;=Fᖾ-i~xzC!XAqai䙗eas aΥט)+w*F'þ $W\{z]T5t9"K"* %݄g׫)!7 F;+w#`A̷M!d+dzY_73pxz{Nh%]l-u//\ -VOQNsQ#ߚ͕W_E8ޯ' I*DI.SHl_iXp]ȪT+Mߔ©tWLje/NIm);]DZu"=.@$:I iD,=EA a [1d1]0 uXSj:Ub֊TZ -" [% -}a苍@QRc.-M¶J\ֆ٥w82d`9xK S9 ᔘY#-:FZt[4WdC-V; qf@O{Iw8e :M 4JFa%12L:FD`|CܿFxMP& -n:(ـ顯J{n.v=v;t^VVAip>(7h0(= @MڴTU(*Qm!d?&vxԤN⸶vIaV'jn7 VY %ζf*-^ l,][^l0ڳAjor nr "5$x}SZ[\:ԨԺʐD!Ocwgd%Uλ~DNlK'9y&lڔ1f Z;f13/fL춗 Q ܇7azqKVQPoWM?\c:'Uݮ6iX;άɤbծf&SS6v,y(P_Ynm"@tr- G@a[dKyvd/ >C(#CͨE3)|1ڏ֑uNիz`[` D%җsO;C,f6652aͳ_HWqӬUX( LI2xecCݔ `M\5^ǧ؇/ lfũԯi"!LZǗp]/z*sEs_hY .vzFQEDqy|uvt{ѫ;jCͪ ^ҤI@{S#Xd$ŎQ\$[ped(@LiQe!g&m~ꏫ k{Js@No&SI=I#t@UaUb&qc?:U -s f2w7/Uuahdx*JK.X?JV|x3/}O^?R]Zuesu+nl?yW,$9ťI&dDht}ӆ2qMӵqI-X| -mZ*sc¾iaԃi@Zgd'1T“N+@^ `?mDP!$?ׯj͈}͒nxvg;n=ngΝ{tm~n{6>7tb.!N93)_mCr]]y=JbHGz̷@w œgyr{a2t_tpNuؑwC绾7vȷE`v(*_6c'e(e;?靯^5?0ꓪ_y7u-_6>FM?pxhԎG#Ǒur9<.mG#Ǒq8r9G#Ǒq8r9Gc$a3`*E0twGBU^el -_ic4̀dLP=  yhS$9,BЀͨ9_l4jv<> 5cw9̥lBf[s ؄hh&4簙|qXlB{9l1:uXǿa:_u밎:uX?ۿ2`opRPDfm0GjⰃtP -gz / p(]akH{,PNÅeCyK^πh][ ԢQT{ 8SW }jVcM0*r84`Z`iF|4"(jQh)|AG88 z7/Q whGkY]PH;l_ z) wٝ eؽ>M?؎79k¨꫆# 6.=p}o8Q᷵cP&P_6;߶j[Yż.v=c+ ޾εݫv/Z:YȻW-Z wv]/X2~yϪåeᮕ SZ5\{ċwoZ_zx<_W3oAi7k%뚾nxkgϺU+z|)4zԮ0|o -ҵkÝ]0B]+zE?8*kK8'2 CZl,Cy/h:_ -)p=e>rs|$r=x5PɐWfXY RX?4VSi4ʤF kzƾW%5؅BbpTǭE0[.[[f/ZNZڵ-[:Jcf[!: lȅ -5 j"9y1 ;(gAAgOpM=]he/xz Og@u^~J~ -+v/j>Ԇ0]( -Gh:]1Mfilejݎ]W){ -z G؄e.Dw1?{10򩁑8Fܠ/ |i`f)+?_A/CFA1"a#cD" #ILjDuHɬc$1HF@ϡ#OWXVɪcDd#]Lj1"9F$ELj1"uH:F$0"|:F$N1R@njTcF*f#~B~T/ RKKKK\#14020Rj`H4HJ#Y#UF9Fj 30Ro`cdF#MF i103SL631:f@cn>]#Va6\%Qk<,/'e\~р_peB~ ܫtX -xuJ4 -c:A37oSMovMo$kԢ[|[|ɷo{#ߢ-8ߢO-ǕHFP~ȗŠkft-?e\øp+OaHyaH@Wsy<7CL;,-ދR/塗9D+#Ÿ`-Zq%/2kID|M7ЛyyOy;[% b:u-6ogow wACy"<"<S }VMVQx6͂lWAdh7u~ɡyhJqō`G>O?%`D`_xx,B.+ہD%{b0*Ǣ*FsxO¤TJRCd9,ȥ2S\K~Fn&;^ n+k-=yB ow?SZJ+hFqtDit=GO'Et ]N{N7г9\z>^LL7ӟ+*z @o7_;=>}{iK_/W>K?Ӄ"M$ʢ"EĐbJ,bF̊bAlLjq%o% ([e "9$G\*rG-&'vy||<_;Drz!ERH i^Ȑ v5Fԑ:$YL! KEr>9YɅBd#?&?F2L6#;A$W"'\rM&& @r]K!BlC>r Py'1 Ph1.:1)&ѩbX֋b9:M+bX~$VU FAg916Qh$6V-jNJc&DDt8_;Nt' lCvvlD0Kd*Sc"[Х]ͲKvdE?r]. BS9!'ЕrJN-r\r]-g,Fkѵr܀ft&q83y< (O,yI>F>,'~. nOOFɋЭy Mry98KT9H.!d+N'dyZ#ϓOʋU=\!.0ii4]K-+3WW.\^ٸ\\sr咋%7K\.y\rT咏%?K.\*K H!.T.m\Dri&ΥMK$6).mJ)ҦK46\dr @\p P%@Kz.%@#M\4s %h.Zh@` c%x.&p 0KI\L` -S%t.fp 0KYQ<{ ٜg:sqC:s<Ρ'p=shГ8q>r~\cŜp~\2Ώ9?*΃=@5$BHԒ'*rFvQ'ɳy"yI&%g<`9tNgt>K -KGfz+Kwl}>CG^e:3}蠈E*ZD;;.zb= IBq1P̲MvO.U9&gjNnGc y||nf>ݍv=%z}AG-sɗn"5 OM< 1 =5|k'+^ÿy N5k`{JphCژCgsЦX q!D@6U -V$o/fk?|@껛Bl%b*;J PlCah/>[OlEfa n+`xa{lsY`fOwg"s]ǡw!q+?Yv -endstream endobj 157 0 obj <> endobj 158 0 obj [250 0 0 0 0 1000 0 0 333 333 0 0 0 333 250 278 500 500 500 500 500 500 500 500 500 500 333 0 0 0 0 0 0 722 667 722 722 667 611 778 778 389 500 0 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 0 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 0 0 0 0 520 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400] endobj 155 0 obj <> endobj 156 0 obj [250 0 0 0 0 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 0 0 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 760 0 400 549 300 0 0 576 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 500] endobj 150 0 obj <> endobj 14 0 obj <> endobj 99 0 obj <> endobj 109 0 obj <> endobj 119 0 obj <> endobj 129 0 obj <> endobj 139 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 140 0 obj <> endobj 141 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <> endobj 148 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 7 0 obj <> endobj 4 0 obj <> endobj xref -0 166 -0000000000 65535 f -0000000016 00000 n -0000000258 00000 n -0000003459 00000 n -0000057459 00000 n -0000000137 00000 n -0000003543 00000 n -0000056268 00000 n -0000056104 00000 n -0000056192 00000 n -0000009004 00000 n -0000003645 00000 n -0000003694 00000 n -0000004438 00000 n -0000052631 00000 n -0000004689 00000 n -0000004740 00000 n -0000004788 00000 n -0000004836 00000 n -0000004887 00000 n -0000004936 00000 n -0000004985 00000 n -0000005037 00000 n -0000005086 00000 n -0000005136 00000 n -0000005186 00000 n -0000005236 00000 n -0000005286 00000 n -0000005336 00000 n -0000005386 00000 n -0000005436 00000 n -0000005490 00000 n -0000005540 00000 n -0000005594 00000 n -0000005644 00000 n -0000005698 00000 n -0000005751 00000 n -0000005801 00000 n -0000005851 00000 n -0000005901 00000 n -0000005955 00000 n -0000006005 00000 n -0000006055 00000 n -0000006105 00000 n -0000006155 00000 n -0000006205 00000 n -0000006255 00000 n -0000006305 00000 n -0000006359 00000 n -0000006409 00000 n -0000006463 00000 n -0000006513 00000 n -0000006567 00000 n -0000006620 00000 n -0000006670 00000 n -0000006720 00000 n -0000006774 00000 n -0000006824 00000 n -0000006874 00000 n -0000006924 00000 n -0000006974 00000 n -0000007024 00000 n -0000007074 00000 n -0000007124 00000 n -0000007174 00000 n -0000007228 00000 n -0000007278 00000 n -0000007332 00000 n -0000007382 00000 n -0000007436 00000 n -0000007489 00000 n -0000007539 00000 n -0000007589 00000 n -0000007643 00000 n -0000007693 00000 n -0000007743 00000 n -0000007793 00000 n -0000007843 00000 n -0000007893 00000 n -0000007943 00000 n -0000007993 00000 n -0000008043 00000 n -0000008097 00000 n -0000008147 00000 n -0000008201 00000 n -0000008251 00000 n -0000008305 00000 n -0000008358 00000 n -0000008408 00000 n -0000008462 00000 n -0000008512 00000 n -0000008562 00000 n -0000008616 00000 n -0000008666 00000 n -0000008720 00000 n -0000008770 00000 n -0000008821 00000 n -0000055484 00000 n -0000055538 00000 n -0000052678 00000 n -0000054929 00000 n -0000055000 00000 n -0000055056 00000 n -0000055112 00000 n -0000055204 00000 n -0000055260 00000 n -0000055316 00000 n -0000055372 00000 n -0000055428 00000 n -0000052748 00000 n -0000054374 00000 n -0000054452 00000 n -0000054508 00000 n -0000054564 00000 n -0000054649 00000 n -0000054705 00000 n -0000054761 00000 n -0000054817 00000 n -0000054873 00000 n -0000052877 00000 n -0000053819 00000 n -0000053890 00000 n -0000053946 00000 n -0000054002 00000 n -0000054094 00000 n -0000054150 00000 n -0000054206 00000 n -0000054262 00000 n -0000054318 00000 n -0000053006 00000 n -0000053264 00000 n -0000053335 00000 n -0000053391 00000 n -0000053447 00000 n -0000053539 00000 n -0000053595 00000 n -0000053651 00000 n -0000053707 00000 n -0000053763 00000 n -0000053135 00000 n -0000055600 00000 n -0000055656 00000 n -0000055712 00000 n -0000055768 00000 n -0000055824 00000 n -0000055880 00000 n -0000055936 00000 n -0000055992 00000 n -0000056048 00000 n -0000008875 00000 n -0000052532 00000 n -0000009261 00000 n -0000015099 00000 n -0000015274 00000 n -0000015454 00000 n -0000051658 00000 n -0000051893 00000 n -0000050971 00000 n -0000051211 00000 n -0000015596 00000 n -0000015623 00000 n -0000015918 00000 n -0000016089 00000 n -0000016159 00000 n -0000016417 00000 n -0000016747 00000 n -trailer -<<0C8B7F0C3073A843B2EACC4124CDB925>]>> -startxref -57604 -%%EOF diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/52 Fludioxonil_RAR_07_Volume_3CA_B-5_2018-02-21_Page175.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/52 Fludioxonil_RAR_07_Volume_3CA_B-5_2018-02-21_Page175.pdf deleted file mode 100644 index c077f3a3..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/52 Fludioxonil_RAR_07_Volume_3CA_B-5_2018-02-21_Page175.pdf +++ /dev/null @@ -1,355 +0,0 @@ -%PDF-1.7 % -1 0 obj <>/Metadata 2 0 R/Pages 3 0 R/StructTreeRoot 6 0 R/Type/Catalog>> endobj 5 0 obj <>/Font<>>>/Fields[]>> endobj 2 0 obj <>stream - - - - - 2023-04-26T16:31:42+02:00 - 2023-04-26T16:31:42+02:00 - 2023-04-26T16:31:42+02:00 - application/pdf - uuid:6e8b6ee3-c539-48d7-a380-acc82b3f3356 - uuid:03ff6878-f223-4d49-97f4-712cd3b94bb1 - Foxit PhantomPDF Printer version 8.0.2.0718 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 6 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 133 0 obj <> endobj 10 0 obj <>/MediaBox[0 0 841.92 595.32]/Parent 3 0 R/Resources<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/Page>> endobj 135 0 obj <>stream -x]_9G;өjEg443 4jŮNES@隆mٝT;tڙ̗ꪌa;~a}i.{{w~rpݟo>{Q{KuyWg߿DzBcYSϪ6{"=r{77mk[oh77ۿgtޏ;HLrlo6YWe.\RB-łO[Vn wfwYm]וxȾ;bQ𼞩(3`Jm^Wۆ,b̊y5S79cq%:r1Mt("g6kKeVuU^!%׫l%m+o{'U9Q OϟbCFK):M&\ *do6)A'|NZo2oiX!򪵬~=qVeJzAZRit&ij8|q~3 /_Bƕ Vl~߲v*KR g[Ƥ9^KG.715_.ØTU i\Gcj_Dž;|IƢ/p{miJrPTnSQeB0༇}}zsĿs<̍|K*Bu"me(B^A11!Pă5ܥ.ep /1}@J~ )jocT[)מGx:=EN,teO W)An_e08¬!89ef ͜$:;(* +O(^Kv5u -#h5rc+Ϳõ\'kof{G R ÉD5w'\3dQ@ID=nH9ND+DOqNd8AY2}Yg|3{آsF7K271kcx4AJzLćIdd2[ G*t=\v_|S!"Cb{_rbhBҥLrZwS^ L?JQY7VS7lmq'dL_b42ܟF{jsYg}a+l6f8ƂZ_g(; |x%Xgƛn#zbK`p@g5DJ *}j[Sg8_+;ǟmsq[ʲߖeSMѭ4*%Qʼnov +HX{o+];c^[n߶\lzL'AkVeѢѽO[e±nduQ UI) -b*6&&%ƪ wswxpa͐e&O~@qt}\ʪ)O040`V+u”gS֜bj#L0^=r -KYPP[*(h(lTO&̱Q{(TW h1$|4+$A.zT9o{$V 2]Oot1Vbl}k٨6IwO-Q޿Vs -'ƺ/rH JD,K@BKL$ypdeԝUA/"aA c_v) 8 p:V̻k8>t&g[ٔp%ϕ5SHCq:r  kZZ,]aW ˩b l!>T_I"鳓ꎃj<" a4'0kabʉ"xVN$a{.jAQibE\XX~Xr9|iCl/NcQk-s5 JgfofA˽7X>Xۮv}v\eLʋJ[7sK.w▍lxT$Us ! 褘=R78"[:5E-X -8\5,<М`+ŝVhiwie' /7ພIt > Zlݺ=m)2*m)Cr5k :8˟8ދ,5wYލə@4]Nk4ǜId| -]ccd}JǶeL&g]k%AhV>IJe()B`VB~IvZE?,` 39F63#oa9%%dRĿ 8HpfVq.[ni e70B_f·0ޙQ.~Х'P,&mwcdfqB{Hn'!ͼk1Xqrto~5JQO/P}|DYGqٓVyAIMFdQ-6^-M>NwQyix-!ڙ)U1ƀZ$XaQ-FJ7b Od/k1EV&sΫUMpEzmwȚ*9YDA;bpCYOTQN#e(XF(RTG[N-1QHk;i6XI[R$YBRXF1l'j)Rrb+ҋ)b5;"A2USL+')`bg@OmDRO=Qdb7!j5 5wADFTXZ#\cWX1xk$Ӧcob#*Hdà6V0`E\O*1Bj\jÛҋ6Z8oZjcvlFm~\=TdTmp֘cv6&10y mIC}鯌ݰѷ :Md]f4]QNTAT-65'sKEƚӈ 6nDj8U3QLUuQ8P ?(7lj{q"2G\8'2tӠ^agEp4l~o XQ|XT6w_="1x 9/Eە")]V@Jb-E|߲PquM/nuM%;gVDsZ:}MéU3 -4K ʀPr@ZB -N ]G>%m$9Wh oF,;DžJbҙS[ёP9=*#x~/ƅ{DEBt͌,6{(GT^)9{ST~H~i^0m(E2kބNk(A?ƉR$AKJh"zV1""Rh8Kci#(|Q;Fei,w(z‡YFˊ4&㲈&.K]|#ˡ0Mc1x2fDцih=|,3.Mm,"[ -endstream endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 146 0 obj [148 0 R] endobj 147 0 obj <>stream -x]j0 ~ -Cq]C`kn,8(!o? L`-}11.ae0I8oޕ&*-p- ƠK . xT ^~gj[p8ʠofF;uNt0-"K_E64j*gV!N 2OUP{,yJCT>? Io+ -endstream endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj [0[778]3[250]11[333 333]16[333 250 278 500 500 500 500 500 500 500 500 500 500 333]36[722 667 722 722 667 611 778 778 389 500]47[667 944 722 778 611 778 722 556 667 722 722 1000 722 722]68[500 556 444 556 444 333 500 556 278]78[556 278 833 556 500 556 556 444 389 333 556 500 722 500 500]97[520]131[400]177[500]] endobj 152 0 obj <>stream -x xTE0ZUޗ>ݧtgHBHN6d EIHA6!"  4A?u\őq1 3u2|?Ͻ߽Uޥ޷Nu@!dE}̽˲QWAA#]>tˋ ya2{]_Er0 -Wܞ]OOPxBiae/PqYgѳ*!K5"_"\lAhܷqيs=[/ȟ;z&ԳbtV]0¦WX[Gt\/ WTG>AgCM÷HU jPHWc1hOol7B#ywޝwywޝww8|o;c=λt<λ;λ;λ;λcޛ+SA -'#K*((բ -Fеh'R$X ܭb ;xXi\:`o,1N,8]'dp8b:"q<D\/H:DS5 T \'VK#|--\uC_[27[#trԠ~$(%e3X/+ $Cb/@ˇamv&%42yH*uI7]HkFjN7m"yuQmʼnSguk;q9L}l*ni`<$"F}f:tq6 2Q_T*,2a&6JL0㵱sɟ3xߣ(t?A$s-`I2M"/Z֨a`AV1eD_8|=}me3_1Ko|Yә$Fi&aY0FCu:=!;aC6fO`'i/Gbh47 6G(02anC% ,g^g7o5jQ|D!bc|?i\< 'Byeka%CvJPȮN-2ՔgGS#Wb?&:X2)g啸N^ gnt ]G 0hx 2!fx|PS'ָ-(l5&<9e/*V(O=LLN\ꇱOM@ڲCdy-&'b8aqɉ u4&:0PX%Q:g[.[$}5Oed fK2yFeNq, e\bd`U( VaJQ-_ <'v'P^o膰<!C(~'A߁W#L!K  xpU(:3#ah. h@60 ~I%U ʤ%4(A=>5SjW jL&IfEmoCcկW#:lB<`r/ BxTn{a!,)"[냰$ -BhXC!2XK>Gy@wB -}_{ޗ8We) v9%BXBS8 As |'T arO!}Jd@nldG"2`&D^9p4rt:9?K -=1&Ֆ8 -vQ:h7x@*ANaqɩwn7GN!iːl ;٤2'b?I&x2QF7rs9|HÙrhDQC&'_ҿ??Ÿ T$wPwA~vP?5]!鉏9JAJ* }S=_a -B$ #R"_&'@- 7'6 "wm%DDF51=QX^LJD/KDkIJDE~L,ACbaD' + FῢN,|Dy[g N&zx/a(4'܄ȽHh 'dV.0Qu"J=+W}A>s8à3O,̇('"m djFL(Q֢r;) mOmIx~fQÅAQ<_F/Eym9=0y ~f yI΅ۢ1H.H]>r - m>O%%yE4"efsw+_}?RąN@E,E =)x"5 ܊efV 0xD#㖡(LsR=0BAE`OLz:/SLhu3hPD~CL-h?hƬYA 㷮Y=dO#/5ₖrE3_Tw1b:cO%1F*m|]u9t]ήUwMսz2}W/}W/}diӚ=*<;l=28d~icq׃U -XVpy ~2[CIlB[*pW_xժZ;3cr=j$_%fW+θX,VŚ;:x@zws2/f-+vY*6fP?&k 4fhzfh1>f +dFeG@_Չag+b1,V7 t#˰JX-/ L4N7IT^!7ɔ:CPA_}E?l)wsdeAҟ?Ԅ)n)SK Pg]Zޗ^"Bo؊Pb@נvޚ*DԎl h7*Ecu3OAR8,Ft'ډ/HCh$P.ǥ?ASQ{z?h+ځ SM,?V wF6n'Ҏh6zh"f-.}; -tr ݄#Ohe1lv_&Gl^Vbea8w8v:ӅIx^B i = ո?( -A6r9D!GeZ7[Ga_Էim:.OOo@@]KQ̾=kD~?bP F"0śx~S %UdM'_SFJf+kvW3ܳwʰS Bũ{S+@y -47|)g%Z(g7JC5&!H/}L@( *x2c/4tso?}?aNFr̨\LCȭd/<"N>$'?0xt}x4(d0tOMJ߄>d~ڿOq`=\lAj@!b΋jV37%*AoYEJ)"s[p(~v- cCa1GkBǘIk@>yqt9Z ҟvAKP5,5PNr v_I؆^USr/h .E8q5 qk~in/] \{`kG7&F8ÖNyԌݨd`&XYU6``>qχB*8H\rPld5{A˜>BH*FexCjc)[7Pv&]ЮhÀ| T&vCP ^1lx -L]={ v 6bcgr¸ ;ٯtޡl r5%%2ɨ$ ؗQ/aR)nDj@EO MOԵ סH (- 0ˢS3xJЏH`E?`y s}abnr7!w %6whsvíw#@1Oo!uFMF_GtIl/*3cj:e|낖ϻPC %xlؖ-XF*+6R`h /+PVϞ0nNY7d0*neGǔDI?j;iI=?'zׄAXM^yrx{$8]n\6Hd_WI9un#WclvaHT*6UUYɍD>5f)鎗^s\.i׺tlΗ^֗^jpZfѹt&^qKCު;zV`lœ6=9©^Ï·_/߱k\CuTq6-=ҙZHz1v)oab{O>aElը/XHjER5҃5 5 .X'B 7ümdkQiKdĊ?ҢYN \0l*+S S=c6M -V#{/ٮ~S`2:]h9T< -Zy/H6CuqsMqא&\Z OtP e 9WvHf6/<ͷ+JJtJMS,_p’An{O0*`*'7P6oifGRGq -ia]*2(ZB,dfYAc @׌@GNoE`p#֝;$G:=I*t(P[Rv;Ŀ%t .1'`9D2 `̡!f(IVFc$7r(CyUT̜,P-@YdL*JU'7uuFRNviAiPdf`c '+zq (Yz]#Ti@@P FU X;n#xg}c,}U*nR*Q /]uձ&%뮜~;,\q kDChQ&d{4u'~;Dxar;fL7ʸZ+EՕ7SY8ICq)Eʛq'"^C!{ycC=hdcEc]`/E@e؛KۜYDg? U׼C|wꗪʢ@aѸnjf=*iAGUӄcU|* 2g(tFg4lĤ\C!neV!&X/5CUB$$#igv2 ȨKZ_-jvSP+ ;N Qg17b לa\4u /S3kh"yJ6 ЦQVav!ۻh=_/R8T|B*t?{Ů^r#V]=ʹ?zoɆ]e=> J f M:~MǶ8ȩ\|Ht1J:#􎷑wn?ҾaWi&Y%(x;6)q{>7G8y8TP矇fBܳ< -2:rV>J]Tf8kKSSvox%;Zk߽:]yeܦ\7ro\O%zSW[z.|{l?˧[_Sar%Rf.xцm.郞#60XgomdnܖM@" xċD 'sᰝ1[M -AW< IKҝؼ)yLo*?*G&WqxBY@n&7<_-x/'s{i*BK9L %Q yacza5TdVTjx0P1ןKr WYy1XWʶP_Dھ)jM=7zr4őE55-Q9C!f xd6pK|aMsx\&Mڨk:A=I uNNvQ]55_F:19q=e*@oUuXZ& -ODoׄ i# 2^+Dj+(+)VF٨5h73m-m}Y~ڽ yxC]B[&_kRmtڥ?cPq9^bX+v‹4ieE;yeŐjfeQ7( -UEF VzBR.ĩR()Jn'J)w^XClJlNlElClK졘*vo[*Ȩ뉾> ʲ!Gz9Nbjg#~hnDh1`?F eXo8ԋM&34e2hYTSރ)\Dtm Z*j ZN4+";<8\=eB|ojjf:2W϶@twП~Ԧd՚&BD؈&0c5S 5k47k eռ¾\s;'l`djAAIKr} -(>֛J -2GJ=#/q/E}FPsZmy!Y ZFy -1XI?QD 1ʃiX@Y\}O1u* 3(qFyQgssgESKsã3^oXuy#w.Rs);`SWmv(>qP9^&5<b†+o =FUڻtj""Z6մcGOj-FrI'yǚJ685#(}Ѭb9~3U}ePLqWJs9<p|ڣڋQW -v-"l4 #{=~A#*[ . -?! Du|F^&WFFA߄T~▪"p,p)H6=2`>MG(psC^1K/y/"ҨS -†|gRzo7۬^ 92!y, .Ï5TcTa~m 9vh>U0褧TNΆQ; I2 kij%1kw2M`rOI{ME{HrR`KrWfDY^^;R[SR)U"jHS}ÿ9 wAݭDjmooe[׉z1k1M˘5zev=9A#F 5 dڈeó ,ۨJ%܂3gibo) /ԉLܖϬIpߙܩϤ1^LwGf0@|$t >s0|k)(M`{^XsipFh5%h8=) H9@2 -yacFֻ H|-/V@3Ԟ93&3L/Iޕf$* -a<$7Pz Sb[?9TS̃ ygs8"sY#,, B.v=Ec+QȘX ~xK{|5^fmtKޣS9E@ÜhT5W=lz<ĜA` yBt=0N/*k,n~ծHI3&䮬s0$DW਑(Bhӗ8,L3ZƤStu._\?JFw.1'ڙ_"X*F -fzX]8j}`vpP,|A#o+`AUUr>_U>/nTU  f -Qލ#OD뮖2oNEO j:ǟW\DLX,: -kTu} fM]@Q$[NzNRUb5;ȏcNҵh7.nO^u6eh{DDߝq]C<-_1V?K cO}*JDvQ c5)ϋ<݃g56Ew̤8dA ׼Й9K˘b^^@T"#oV -=>/p'7 ho@ -l j['',={)o<ߏwz|ܫBT-ZY^e4]j L d !s#,S#B l 6% eP K%NĒ^1}u5ښ)yqRG@ ATE=墧Ȍ^L -}d\OFU,##n]c Rq;33.Y}# -|n -(~7A[ zI1=Y9C -Ɣ |OӇSp(o,LB(VNmxs - fGK.r-^fZ28޲Qq|eMӂ5[m;vE^7n) }g9٘Ns FjFt -^c 曍Xtkuk+kk·j:_hS /h0$T̓^Z qTj[ *I\)UTrI@2iF*L,c&H5ڬA0城yUGfXIʖςyx(cʡNz(Zw C7@]FDJ `8G A ٠!iFG,םuzG(sx#pYN -=p;x5]um^֭f՘Ⱦx^ߝZz;z;@Ԯ'XEv C<)B|p{{QNqAqHs-)ֳ̳6x hj]??~ts*]WZ9AR e^PdZ( -DQo<<d`{h9AG#"O^r` -,¯` n*:$#ɮ AJEc`w/{gR 'Cu!+j竚.w@rz[`u®H^-ƹnbb#W|\ATbǙm^h#{ LSHRdZc%O~UΚ[7Oa$ueUΫ*;~&L?/i}PlIR gFaj2(qBc7X*Z,SS -K 2VHSG|~I9wSQ1jFkdg|Le"oԲ"WYʈ6+yH Qz0ErT -2Gt.މg8ޏ(r2?I?=4993("bi`VPy8H73rNjPCPp`S$+Dsi?_SR",JT*>QGqC][Y_X'CH@ڨD†6*Fyzm%#cJ+aZi"k&fOn$c9 @J8ekԵk -5LĻoX.&[3y? O=2\T$LDSd5A, -5;DZw⨈٭6‹ځkO9p؜.9@ >N.0d6ʡT*zTIB)y\6R8t6)z=R-?/_!:nt!^2 : ʺuX -[.?cܮa;LuuQVGMt|}s.9l ug$~2U60$c]NioځKLNOR3j֕@'تZ3."OpLunN'D! lQ=w.v=L:_s}*_Y -*4lNY{R9rU|gy\}) ˸UUy7opDO%v@kxalJV\JP1].ۭ"pXwӁ3 y`#L J%Rg6qՀEq8ѝf*ϳ鐖:F9]v)ʼ(E:.7 yOԖ -~FTSiA:$k4Ǜ*xz?\6p6v]Y -y2="ZIO:΢|ߵWթEe.*B^@_E+{}wPlL9X2X&RaUԤf;©*Lkޫ.*kl w؜WOdBaݖfXE8Lr}ҿf -h/X k%DTkRҫq c'¢<%'ld9ƈչb?bEI1. `hQ1nOq\88ϗ[P0;y\..ay9֜R\|  9өSzObjs#Tp*1RR&Msd:'N 8!' 4%Oeӷ5R2!>̘`ڪ|wϻ 93X`vfΚ:1gg[,##rҎ2JVF)xMהSWtY|%֧P("kOnY:z\{~oh Em6LU2-Ţ85W_ |8>Y%K-nٖe@$`a'q.;C ܔP(.RnHH PJ(GВr-mJR-Z1G~7yoQPYzm;H8??7,BCDblvv{U=5,i( zs|$g4&ƴPgl]0ih̆;y`s'EOAb ?<ͯ)„GD"ZPfKu;@lCS5(X]\w:v53ͷfny0TȫXS [,]ޅwIroltmjjmo]T8ϷŻ Q*7ɒu{f'|5Z tEi"(kZb];X{O#SZmHKZ+Y.&]((*=-.YlR+["~{RMCe͓PG6+tW'{77~͡ЊYVd+*L9jBHPf`yb -C& ~XS֍:Uh݋y[+m/m;TӨAijKzTmF:ȴ\}U7=ꃫӏup_0+E}F̉c~E7p򌤴8ZZX,A>/~1gn0$fU ;%+%&BJ=QHFCA΍H>NN#6ۓ0Vuz -zk72c%Fa]/u>tLyQIrJs۱}ϭ::jog]ߜ25]=k],{ti鵓ϙzlUCWj%:nڕqQ bFCM |(Ҝ)>ЊcMJl>SRX0VwLG UeZY{Yoֲe{erԀ(w5W)ҮQ*T \aPv"l10wT1Y/EeFѲEM&C=aD<CuM!C)\dPD -qZ k oonJs-uCb *. e] vjN_XWjS.Ӟ;g)Et-$Z7NO#jp{/sL8XH 24CyJ^mobC bm"[\˭''c_UB8uezk_誂 =BcOO (ً`,H\]?i3G&lNv;km|b+x+OmK|2Y%5fws{ج8r@|ԥzA *lt>>]s`½;V7>F$Z#a/|ȀYO4u=[|k?k¨SSUGqSdl jgܸt%Y+WBŮn`nPH >5c7'c -s?YT8A)IΩ|#IBER1,H9o - k 5vRĝKg/}`鸥jS'l.+=~&s+=)2sZUKϻԣ^}w& .ҩtyQiNjiOg˿cNXoqAy3OuW^C:!z9]\:T%% , X8K/NmB[n8u6b*{v9x\u(m(jX6gxj &FY zX{0jջUsjRBIp6֋ V::7Z4`Ȅu'… 'd/sZUu-dQ3&7h4?Plζ 2W=`zȲlW[:QlϤmLNV/-r[q6mr|l^Wi2=e5" Vت%SV-BZq+^ZIz`U -DV)dꫲ ɠs2g5w5+6<Oo8^{nܧqnD*j$ζXN(/*ة y*JagN 9-LWpB+-U0YSW*ukR[X+:tcFi=``?`:{45K=zY@A5ṙM2FNM_ kj|7s#&zNiDpnY]ytؗz V/=;oIg/[sީwLmjUҞ ]i<,^I_U]Zy1,^)Tj{q)oU[/|u=n9O\j]1S\BQMD4}ȝrt 3.3bMN; -ծD -ѽC(ƨ :75W4W%cJjE,Q_l2G#nT { -Șm¤\6@MpRU IthMq/.x@P -p3{*ZRV2Lֱ Uj9Ts<HWKS4Φ)sCxQK0K23uUQP(P DvLZFL -jqZu$26`>Ԕ]hv @| ǟQV:z(Ypť+C+ -_y֡+יqs i0d Dx\ .'$'Ue@6T -C]6 QRJ苫nLFqŀ?<@d>6rvY- %pU5R&zJߧA|':1I8oS㹖TfƠt-)j m`Oh_H :ÿuvpN7 8Mw͛\!skS94턡E x\ Q;kwj㄰!k{Wvْ%h4PrӾƾεط8(w|MyWNXܥnj,FpSVšӔ2j%;_4 VFO>d`KQW*b`$r`,@Z6ZXS j$zUj,+ =쁧&xPq:O -x.=,QKU*DVf9b?xBtF -ַ>6T*PV YfmOٍ.!]~[ -zZJ[{cR"Aj7v bg휋Gi!āf;ߍ")*UDEmXr rSa*1xRV4*WtdL.g3Z s oa}tսսM6f>7uչwe*s.ΜL~;u}c;O3yz!c<kAw(IvUjMT @hOq}C zWfj)':&ĢθZi)cZ3nk山qub,ff#fl -,6[&3(4<C\;6͡['ogi2PT(Cf7 < Z`s@WfVC挐y9|<c>fd2&0ip3>pep8hѹXa3m,L vǟ7NŪdIVhڊBXgŚ.Ca5#^հd KU- -G$3Hϟo q9'k_Yt42˶g2%g_&fӍlS GN&%a9 `|]v:iϝ}xrv~qĮX5Ã1UYUw̜wZk2)b'Lq 2NO4{!.m7{μn:kEh*^/?c|mU`\>_A{iCEm" +]_lH &/" !VמtńH^^!/XZ$y],iաD6N xS/ƢV%f7e:NXL\>yN(@:N͙J~椮i7tW)Ex뚖CQo@v5opJ$GҎٗ4[$[P3 6d:4aSQLm$=k9ktnOloL@1-6?@n 1!^ˢ&C,%;rxnj&9% ݟȷlxa\j(DO@dqIQI0 -B;`ͧp8B Kح1]ΦAVF<OQ˴W oPzfeci)պkuno6ootnK9s\"oc)g/Gr)Ɠb9}2;.UEAr;@OuUPeBU~ajo<*L -OvG%Wk ,.pmM.!⾹NS\2<)&v8%aG<߿WK{m=U"0uC ++o*裕T:P~J'*F.0$ eaC]z躉ӷ/>WOm?#sCT)5u7'mLOXo8ޟ:aN%p"QR9 ?Ϻii`ܒw_=i"pJڒFGVtA -ðEslnCqZO!SṖ4b,-vWD!TR&boχ7!nR@2FVƩZ`+ihs.a*CAYw㓑 efO7)[2O XT'(rxgqX4 s{wx7gsb,A M3 |:}8q~䒟DzxD<60m>/t~4i#r<Ͼfj9TsyMk~@r  -?QP(l N٣P,Bm7!(HCPz ):q|`gVڲ (ێ+boNdi{w9|*( pf m41p蓝 K@lN~D`)?H>&A߳~x&sƔ5y819zCHaDfnX5e5WxbOzҥ @o.3sK{o\^5qҲQG/Z-txτ-A@WkͶͲx!s,mw就cZvEdBNRz{<`@{ -@.&[I:,j`Ro=s`aKclr&1Mv=e=ƚ\4Q=FG>}kۡjr˙V{E.)Q䎒GHBEDX⤨@Jm3>dl -)MBl!!FEj tYlVF" -$2N;ONdȬ:t"3Df߉̪"ϋQg3k1]ܰU7:(oCqøcrOq! qr'4;ba9 ΡWPx;pֱDZA̼%o0r`KpLїE)]3zo蒪#ϕ:gy:<Պ((+KG1l0hfz *(`zoҊ*47zP8df;u!5V8pHI5|W J+bU ]-spqIDq:IN@F&Q Pd Rs+N%00͢Xl_*뫜I1qAa l-,r!)|E`_Ȥv!yX?_a¢w;=Fᖾ-i~xzC!XAqai䙗eas aΥט)+w*F'þ $W\{z]T5t9"K"* %݄g׫)!7 F;+w#`A̷M!d+dzY_73pxz{Nh%]l-u//\ -VOQNsQ#ߚ͕W_E8ޯ' I*DI.SHl_iXp]ȪT+Mߔ©tWLje/NIm);]DZu"=.@$:I iD,=EA a [1d1]0 uXSj:Ub֊TZ -" [% -}a苍@QRc.-M¶J\ֆ٥w82d`9xK S9 ᔘY#-:FZt[4WdC-V; qf@O{Iw8e :M 4JFa%12L:FD`|CܿFxMP& -n:(ـ顯J{n.v=v;t^VVAip>(7h0(= @MڴTU(*Qm!d?&vxԤN⸶vIaV'jn7 VY %ζf*-^ l,][^l0ڳAjor nr "5$x}SZ[\:ԨԺʐD!Ocwgd%Uλ~DNlK'9y&lڔ1f Z;f13/fL춗 Q ܇7azqKVQPoWM?\c:'Uݮ6iX;άɤbծf&SS6v,y(P_Ynm"@tr- G@a[dKyvd/ >C(#CͨE3)|1ڏ֑uNիz`[` D%җsO;C,f6652aͳ_HWqӬUX( LI2xecCݔ `M\5^ǧ؇/ lfũԯi"!LZǗp]/z*sEs_hY .vzFQEDqy|uvt{ѫ;jCͪ ^ҤI@{S#Xd$ŎQ\$[ped(@LiQe!g&m~ꏫ k{Js@No&SI=I#t@UaUb&qc?:U -s f2w7/Uuahdx*JK.X?JV|x3/}O^?R]Zuesu+nl?yW,$9ťI&dDht}ӆ2qMӵqI-X| -mZ*sc¾iaԃi@Zgd'1T“N+@^ `?mDP!$?ׯj͈}͒nxvg;n=ngΝ{tm~n{6>7tb.!N93)_mCr]]y=JbHGz̷@w œgyr{a2t_tpNuؑwC绾7vȷE`v(*_6c'e(e;?靯^5?0ꓪ_y7u-_6>FM?pxhԎG#Ǒur9<.mG#Ǒq8r9G#Ǒq8r9Gc$a3`*E0twGBU^el -_ic4̀dLP=  yhS$9,BЀͨ9_l4jv<> 5cw9̥lBf[s ؄hh&4簙|qXlB{9l1:uXǿa:_u밎:uX?ۿ2`opRPDfm0GjⰃtP -gz / p(]akH{,PNÅeCyK^πh][ ԢQT{ 8SW }jVcM0*r84`Z`iF|4"(jQh)|AG88 z7/Q whGkY]PH;l_ z) wٝ eؽ>M?؎79k¨꫆# 6.=p}o8Q᷵cP&P_6;߶j[Yż.v=c+ ޾εݫv/Z:YȻW-Z wv]/X2~yϪåeᮕ SZ5\{ċwoZ_zx<_W3oAi7k%뚾nxkgϺU+z|)4zԮ0|o -ҵkÝ]0B]+zE?8*kK8'2 CZl,Cy/h:_ -)p=e>rs|$r=x5PɐWfXY RX?4VSi4ʤF kzƾW%5؅BbpTǭE0[.[[f/ZNZڵ-[:Jcf[!: lȅ -5 j"9y1 ;(gAAgOpM=]he/xz Og@u^~J~ -+v/j>Ԇ0]( -Gh:]1Mfilejݎ]W){ -z G؄e.Dw1?{10򩁑8Fܠ/ |i`f)+?_A/CFA1"a#cD" #ILjDuHɬc$1HF@ϡ#OWXVɪcDd#]Lj1"9F$ELj1"uH:F$0"|:F$N1R@njTcF*f#~B~T/ RKKKK\#14020Rj`H4HJ#Y#UF9Fj 30Ro`cdF#MF i103SL631:f@cn>]#Va6\%Qk<,/'e\~р_peB~ ܫtX -xuJ4 -c:A37oSMovMo$kԢ[|[|ɷo{#ߢ-8ߢO-ǕHFP~ȗŠkft-?e\øp+OaHyaH@Wsy<7CL;,-ދR/塗9D+#Ÿ`-Zq%/2kID|M7ЛyyOy;[% b:u-6ogow wACy"<"<S }VMVQx6͂lWAdh7u~ɡyhJqō`G>O?%`D`_xx,B.+ہD%{b0*Ǣ*FsxO¤TJRCd9,ȥ2S\K~Fn&;^ n+k-=yB ow?SZJ+hFqtDit=GO'Et ]N{N7г9\z>^LL7ӟ+*z @o7_;=>}{iK_/W>K?Ӄ"M$ʢ"EĐbJ,bF̊bAlLjq%o% ([e "9$G\*rG-&'vy||<_;Drz!ERH i^Ȑ v5Fԑ:$YL! KEr>9YɅBd#?&?F2L6#;A$W"'\rM&& @r]K!BlC>r Py'1 Ph1.:1)&ѩbX֋b9:M+bX~$VU FAg916Qh$6V-jNJc&DDt8_;Nt' lCvvlD0Kd*Sc"[Х]ͲKvdE?r]. BS9!'ЕrJN-r\r]-g,Fkѵr܀ft&q83y< (O,yI>F>,'~. nOOFɋЭy Mry98KT9H.!d+N'dyZ#ϓOʋU=\!.0ii4]K-+3WW.\^ٸ\\sr咋%7K\.y\rT咏%?K.\*K H!.T.m\Dri&ΥMK$6).mJ)ҦK46\dr @\p P%@Kz.%@#M\4s %h.Zh@` c%x.&p 0KI\L` -S%t.fp 0KYQ<{ ٜg:sqC:s<Ρ'p=shГ8q>r~\cŜp~\2Ώ9?*΃=@5$BHԒ'*rFvQ'ɳy"yI&%g<`9tNgt>K -KGfz+Kwl}>CG^e:3}蠈E*ZD;;.zb= IBq1P̲MvO.U9&gjNnGc y||nf>ݍv=%z}AG-sɗn"5 OM< 1 =5|k'+^ÿy N5k`{JphCژCgsЦX q!D@6U -V$o/fk?|@껛Bl%b*;J PlCah/>[OlEfa n+`xa{lsY`fOwg"s]ǡw!q+?Yv -endstream endobj 144 0 obj <> endobj 145 0 obj [250 0 0 0 0 1000 0 0 333 333 0 0 0 333 250 278 500 500 500 500 500 500 500 500 500 500 333 0 0 0 0 0 0 722 667 722 722 667 611 778 778 389 500 0 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 0 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 0 0 0 0 520 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400] endobj 142 0 obj <> endobj 143 0 obj [250 0 0 0 0 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 0 0 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 760 0 400 549 300 0 0 576 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 500] endobj 140 0 obj <> endobj 141 0 obj [278] endobj 134 0 obj <> endobj 14 0 obj <> endobj 93 0 obj <> endobj 103 0 obj <> endobj 113 0 obj <> endobj 123 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 7 0 obj <> endobj 4 0 obj <> endobj xref -0 153 -0000000000 65535 f -0000000016 00000 n -0000000258 00000 n -0000003459 00000 n -0000056960 00000 n -0000000137 00000 n -0000003543 00000 n -0000055769 00000 n -0000055605 00000 n -0000055693 00000 n -0000008482 00000 n -0000003645 00000 n -0000003694 00000 n -0000004326 00000 n -0000052702 00000 n -0000004577 00000 n -0000004625 00000 n -0000004673 00000 n -0000004721 00000 n -0000004769 00000 n -0000004817 00000 n -0000004865 00000 n -0000004913 00000 n -0000004961 00000 n -0000005009 00000 n -0000005060 00000 n -0000005109 00000 n -0000005158 00000 n -0000005211 00000 n -0000005260 00000 n -0000005309 00000 n -0000005358 00000 n -0000005407 00000 n -0000005456 00000 n -0000005505 00000 n -0000005554 00000 n -0000005603 00000 n -0000005656 00000 n -0000005705 00000 n -0000005759 00000 n -0000005809 00000 n -0000005859 00000 n -0000005912 00000 n -0000005966 00000 n -0000006016 00000 n -0000006066 00000 n -0000006116 00000 n -0000006166 00000 n -0000006216 00000 n -0000006266 00000 n -0000006316 00000 n -0000006366 00000 n -0000006416 00000 n -0000006466 00000 n -0000006516 00000 n -0000006566 00000 n -0000006616 00000 n -0000006666 00000 n -0000006716 00000 n -0000006770 00000 n -0000006823 00000 n -0000006877 00000 n -0000006927 00000 n -0000006977 00000 n -0000007027 00000 n -0000007077 00000 n -0000007127 00000 n -0000007177 00000 n -0000007227 00000 n -0000007277 00000 n -0000007327 00000 n -0000007377 00000 n -0000007427 00000 n -0000007477 00000 n -0000007527 00000 n -0000007577 00000 n -0000007627 00000 n -0000007681 00000 n -0000007734 00000 n -0000007784 00000 n -0000007834 00000 n -0000007884 00000 n -0000007938 00000 n -0000007992 00000 n -0000008042 00000 n -0000008096 00000 n -0000008146 00000 n -0000008200 00000 n -0000008250 00000 n -0000008300 00000 n -0000054880 00000 n -0000054942 00000 n -0000055032 00000 n -0000052749 00000 n -0000054331 00000 n -0000054401 00000 n -0000054456 00000 n -0000054511 00000 n -0000054602 00000 n -0000054657 00000 n -0000054712 00000 n -0000054768 00000 n -0000054824 00000 n -0000052826 00000 n -0000053769 00000 n -0000053825 00000 n -0000053881 00000 n -0000053937 00000 n -0000054029 00000 n -0000054085 00000 n -0000054141 00000 n -0000054219 00000 n -0000054275 00000 n -0000052949 00000 n -0000053207 00000 n -0000053263 00000 n -0000053319 00000 n -0000053375 00000 n -0000053467 00000 n -0000053523 00000 n -0000053579 00000 n -0000053657 00000 n -0000053713 00000 n -0000053078 00000 n -0000055086 00000 n -0000055157 00000 n -0000055213 00000 n -0000055269 00000 n -0000055325 00000 n -0000055381 00000 n -0000055437 00000 n -0000055493 00000 n -0000055549 00000 n -0000008353 00000 n -0000052611 00000 n -0000008751 00000 n -0000014773 00000 n -0000014934 00000 n -0000015109 00000 n -0000015289 00000 n -0000052367 00000 n -0000052588 00000 n -0000051493 00000 n -0000051728 00000 n -0000050806 00000 n -0000051046 00000 n -0000015431 00000 n -0000015458 00000 n -0000015753 00000 n -0000015924 00000 n -0000015994 00000 n -0000016252 00000 n -0000016582 00000 n -trailer -<<4DD82B4E2E9F7745A2328511A3BAF267>]>> -startxref -57105 -%%EOF diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/56 Fludioxonil_RAR_12_Volume_3CA_B-7_2018-02-21_Page170.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/56 Fludioxonil_RAR_12_Volume_3CA_B-7_2018-02-21_Page170.pdf deleted file mode 100644 index 67a15d2f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/56 Fludioxonil_RAR_12_Volume_3CA_B-7_2018-02-21_Page170.pdf +++ /dev/null @@ -1,952 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/Metadata 2 0 R/Pages 3 0 R/StructTreeRoot 5 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - 2023-04-26T11:22:26+02:00 - 2023-04-26T11:22:26+02:00 - 2023-04-26T11:22:26+02:00 - Microsoft® Word 2010 - application/pdf - - - European Commission - - - - - ANSES - - - uuid:06c71b07-c4d0-4ea9-9002-69bdbad30cdc - uuid:6a5ca73f-812f-47ae-9ed7-9bcf065175f0 - Microsoft® Word 2010 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 5 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 141 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <> endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 155 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 293 0 obj <> endobj 6 0 obj <>/MediaBox[0 0 595.32 841.92]/Parent 3 0 R/Resources<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/Page>> endobj 295 0 obj <>stream -x=ْ?c.P*AR|ɶ$~6^4)ŻLuHTVf"<@fN1Ɔ77 Myx|#,ja5TA*ڌj~YL_7RB]O0M}^4TKVmV]+Y5U DA#f&\K10pSwQR @."-fK3WIfwش}Snʪk6/)%l_'^M[@=G0-OmA!pin$btŢjY+9u\«PW-098NE݊f=RU5b CПԠ%4zw xs -6C Qx~rUƪGCX*ǏW<+#_WBlF[ I@0 z^ýAdQo60Pm_4fA|8n??pggH tHhwo{EAk#;˥[{iMbcש4?(Pw^Z?Tw!.B6Wbw04(/͋>Ll(ēY}r=?'-aS=Ig̋/\ '׽UyrރONd3ɵ5sbPou`Fv=pϞE=D+{q u [<_>Cea;%vt1hqen?̪GU{FϰXڿ/f[myk9&M&p\?#q좱B.a?@I!W@-\G:@6CLw?7B!e~ Ec4p_Md3r=,}~)&T+bA]zZUݜD9 * *1{4=F̲3Y}Nѳ}N Ɣ|_TB9Y-hWA7 vVh @Tȥqq@D FILA@`CH@($p C㝏ǁX:^"14Lxt*_\m6B[Hr=OdȺ53 AÄ wM;=Bcn& Ic jP-:#zm0?x\Jw -`t,HWJ&fq -bgiM2Lf$u[2"/?AtA4ICf -oϚØh!g.%L#L($&Xa ,ȤvM#rd<[:f D+<%JC!hDڅ=TXePtI0.`X`,dbÃKfwEW Pf -a# 6G+[W&Ł cˁ8Sp|kBI<\z ӻTۉ - B1rhD?Ruel̛̦^5C~ -d#ZCW)pSЦYx:R2ODIXra .+$dFѯrT*vVC% M-9KHϽO"b]f8al"FUź𤋮+ӭ$Fp%'5_D}xq:4GC -23"4d59 Ad%ǾL]C/̇4q\ܸKx^{Pn=>\5U7T]F$.'B/=+{o\ۂ,ťsE5[vs+_R_zw?͏ކ!EVY;j>R&Kv féct1+h)m R|ZKE zafhk)O ջ麰K̥SK9a]MCMT՗`\B 6.Y`k=cK`H@8ȕNrd^DɃDBe<ڴ+Kƣxz>Q~:#k]k{8{HIL٨|D,#B3HM-I?r#j$!m/N.B+~`ќ~;b=p%k_]"?Qj1E|sb3j1}i1uWZLl|C-fwMl=8Fx}@KBk6 -t*a%2E 3:ZXYV?󻋴WW6Z'<.Z#"\F2WV7]À{w}"?r P,ٹPԢb3~鉐fi،{NpSrmj.e&0;Q.#y=&;$={^} k9ϫ?|l}?>l_#ezpK+|u%3u%"ݿu[-W%?,L_>CJz uU'en'g4$c4F< (hxLѰK @h FKF/gF/b1^7U\1,ݯc MvfުjÙhmחjmyO_>Ck#C&tKqhrpD1ҮS@4RBӨ9YdRsbAxs2Ø ŚkN>cN>kNܜ(:͕s"vyڬǚ&Z¬ 0f-k"4+횽pDTj;E3)6u C2nje$]I]Bjܕ5nu@ui]^PٗjZlRo>dZܥ#$4Wc)^Ic.\]Z׊/M1L@GҊsYh?'(hvNۂm8?bbZg^2hhS.堯Ul}w|7o~$-jNhAnd]2%&aN8)HTO#(Mሬ#B@cѴ63)|&'M5l ugA2KJ|_]RⳲ;98!O,-58rǪ0{ė]JaRac'p-v*2& -.(xʽ[Y[ enkY}W`נ骥7T*syj\_ -uRt/ BH@{sװcfYCCp w 󻒔\̻S!$RBAVxGAs)/iפʽ'$ÿ4;5FG 0Zl1,BZ?Kf<"LZ9|g.&$i@Hx -~7al67C f9i/B%݀a޾PmѶ*B'1e"!g->5TzN`˜\[ɐ^w;.a6C1ζJnQv ؙIV8 -ZTR)yH#tE˾x!)=;0ӋK¦5#\xL 2|}`=cP2XVWir \`NrD=tK~2rvvyEgtWZz&یvȔJ0Yo*v>vcL WPMCЪjRuvSDi%B;֑7.\3 14JCqbh2a|\ -EF+bH5S?§! 2f A4ZosA!.E+"aLR幍W<JsMP4 Nٲ|QsSFKMٸsaƊ`@#_ٜ,c _}6۰G&YVxlwjD,^4^49lǻ:tN{2b2Nd]:6Bh~:vX$g%2ӣbM'A@dyt>o (g5znXqHS8s"͐Cm0 }V!R9s&ayIڐ3BhE"H>'>ԗ b*i.ud1\4yYDl -,ablљ>`} Y="\(N"vrЊJe% -{]3hHk̟Mjt3 <*P ʹ95"#[ۺh #eBA,ws果s 9iNÊà㎅`b0ĺ8,Hm'ߚTrۧDp ,JXҴ9bۣ (F;))9 9?UPm'l"7줠RiU Y0>OZOsDRPDOϔr=gv7&vT&شش@i\s~q<ȢD2y/ش   AS\?CV31ثuH3!'y+f KC2w(_ -Y^19I:~BbQD.̓g)Z Lãb9$]0b|F5!uX|AS׼ &Qv -FjD*)” zUZ> ٠,{>hde㓠Q3 ڠIQJTFR kTJ5h9Ad֊)FN$%cEu5^P, tG Em$iYA'W*S+Õs{&w؜#TjV*NZd+)+\ -EQ,P|5/ e_$}vyn|qhj|d:FD\erTPWSAyc7.#zزaCnnRrr,_4LS$iZ@2ֈ`>u.0m%a1aݻ6Jݝ -t>X{;W:ⱨ#`$K3Iq9+e'݉\val`AJE5"kzX2ٝ⳻Y(. \f.P.#b6J>o0LF0a`6RHǽd|(rYu4C1ۤG;Q=Dl~ xsWx$E?6Dz2XLl\5p{Lg~/sKJJr.$4orA>Ae| $Y6g (SPt|IvķX<˥%qHEr{,!=3KH7\${ 011PutEcKl.+E *[o:}}kM'Y;Gx*+v -9 馃ᑌu\lsy Kz$8$Gĺ#H{#8dg6+fŔ -P\Wz,igiI,YDϒǐYA=KpCy&VYznI.&aY)2g|RmYVrab-6&T&Umrj) ֢)DK8LlmmXnpgza8.CU}t#RhX#y3M򭶢?c1@>KA֑mzԞR%-YTtMPڣbkblIGMB\Xć8|AzՀۦ,MEs*=gҵn>%%aorS6]p> N-um{A"z%LW+A |O_^+9#b(TVU)W}#hcRQe,XPYCPQXC i0\q×xUCPlǓcM8){&R&T00<e]G2\Nv%t f}%XdCS-8/ISDE+y#{<;}yk} 2QKe^%>/>L畊j.eg]F)xTl͇آ>K2reBŦ]WSz&,L›y io6x^vLbb| -^Qw;1C#(k_ --3.$dŔƝ!r~`r2A=gh)=d|DŅ -H2<m̶yn؞3U#".ɖ,L 9  fkJ[TۑG El:.!|PM j9bKǨgHvIDe .+ U*gO`U>Ucb,.e|Ȗ1oĚnH[n?ϵ8VxMmB)fI7XDSǐnAM1BM1*sLGpY3ZӾ$DIJgNj}8۾5'c"Wds19*g9w -*ou.(0z!sA9tW<"x@@\ xmq p@3< S8 T00)"s;)kuh;5K=ټQGz6]uQ֤/(ѳ&9YCJL΅E?qgHN=3r9C8nvXLQ:A:u;Yu #&֪{|?h_v>6q^0ݮ -HٶRķU7AɠnaoϾ LXZ+]`_ċN6d]Gs*U Е-x 0&[KHC Uu`gZ.;z&xsiq_ݿc)Ƽscnݤc-kGL1'!sxR Lk-ygͤZ$-QXrx-cɡ~涱 -ބ'#n_h#0~pCyc}%c҄@؈Ie+2^&BHP CkF)4(a?wDb.B:4,:|͜ T.;z /rv^M\q_$|=Pi_*?՞\9+|RU/ _^U1r%S1)ϟܢt>A ~p&`=61 h9?@5~,CÞqo~}&}gJx^݃|Mbw^NS^TfHKwťIz|q:Cշ51*:`T:ȨtP=sHGcSJ@J:95TvfzTyTh;0wh0l:nƘņSfUcr(V% -7˼jQ,:WA LA -A -*FrFWh>2^`<%F6Ċg Zđ -^ n -endstream endobj 296 0 obj <> endobj 297 0 obj <> endobj 298 0 obj <> endobj 299 0 obj <> endobj 300 0 obj <> endobj 301 0 obj <> endobj 302 0 obj <> endobj 315 0 obj [317 0 R] endobj 316 0 obj <>stream -xۊ0}\v/I<ԂնXwƱ+Q7ɔ۲n@a&0L,:QHFV -pJFE[48&F5Ŧ丯#Y|fSC r$IRAlV+}ߌRk6f،*R*ꓐxO‬ϪC-JeiOӔrjsB]MS LeG,7eb,Dz7o"y?4"7`}İ%&c2 LVWy|d08ڵ1> endobj 318 0 obj <> endobj 319 0 obj <> endobj 320 0 obj [0[778]3[250]6[500]8[833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444]36[722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333]64[333]66[500]68[444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480]96[480]108[444]112[444 444]123[500 500]129[500]131[400]140[980]148[549]151[576]158[310]177[500]179[444 444 333 333]240[300]266[444]286[389]533[509]] endobj 321 0 obj <>stream -x} `յ46#eK,vHI-q@6v+ ) - --yR -sޱaik6vrp·uoQGwwc?MO+R+g;9n'뼰 |p>eݹ5yɛ==.wWN\w-9z4XϚu .`zW>{ymn|=0|yqCǿunEPm j 7Ek%}~ #p-7YhjV5\" ඃٿ ۶* *k6i -c+oL,54p*U@@qU'r7`'r~;pJ5jWNzh=aht!W pF8zf)yfs^[5C|#\p74 ;V`[+rl+a}PK0Ti&?.Lmbڌi`:c4r+4;2000L%8>,bRM생jøFqܺ"Ea8CǢ(> Mͦk^g8.2RC3 -[uC=s}zgVVv~ qG#eAO9jK4P[ٛ`})pG$$ܔ5&iIi|(3.000000_x#<{ =NE#F? t:zG 0 ),# -fP,0#l,d 6d8ݔ= FΦdxd#9~<@\@C! -K0Ar9#WP(E2j3"!3)ςk*' sD乔ka&<`>B^5a\|a.r"7<&a!,@^afʋ.GX-ЀOdX !/JXr+ K©pi`r;,G^ +J3`= k8NCB~ V#g!` z8l9@>:7P>oFF8+z.uț(#_g#>=SE"l@΋)_}_ [B/&p+b!R~>.CueoR } @ DWa)F.\=|-puȿ ȷ7DnD!nB cn=mK>.Z|?|ynAy#??@~n?< #;/Ô!? -w!8)=;^}ї + Ex !'')?F_]g`Y}wS~A~/QF/_`y//__EQ~~{x y<}I)aWi8H<<&.xv#ߡ.} -ރA#e#؋'-JI3#ë}'௰oEO(" -F13/2*9g]``````H #%&jZ$PTd0H} _tKD}IytRFt;I++T]``````H #̹F$0yAt4RNC}ף24ZN6tT[b눾"DeFE ZM/ J3HaqLؘH$F W!U1U2Q17 T;>L"EAe?=Cz`͗AD(2J -FЌWj J+e4&5 KzXHpI' -]-MJ2AI$J DW:@ ,!gt{$JM=Z_^JBα0Wn& "㠲O )qXJE ;)q$ ,"٤ǚ$UzAB}%iQV :Au:(uNt DkIcKOE~LG!~odHS&,ǧWm2T_M㕛I+c8v!%2YiAuȲE`DAkCТҁYQ̲l%l3Mf`R?7 Y %Lv&,vؽƄS3xckYR/G0:w%xܱ0Wn&>/2r]``````H } !=̴V+L`%(k%hCeY6beUY*[-bV3,Vk8I' V`LX 톱{wQ%.[%fIoL8h ǧ^J&*Fc4ʜ>/2gTa!=ȞJCJEEQږfQt,ۖdYD_:D;Wz$d4nՉ1 Q}_8J[&W2J_h>J"l;4(w,L㕛I+k8L )q?Q4zlu!ImYCo[aXlêGL -t,Iq^/ɲCMr­:S1(1y}X?$G -&} (TE WT;>Lb@V8v!%2 P/2@TL_1Gd$Wc0Xm^Yt6MqX<Ǖxr=; -A`JE&kL:c1+х( -FEYQhD7em+c^ r@7q|)%m?t,LqLMhT=CzPdA/L6ޤ70Nr<#'ۤB99ÝS"WL,b z!`ϲd`ʶYY meLpe6ۘ<*M 3Q6XMrthD}K'zܱ0Wn&'}^d4ŭSCJd%|M &DY `tY@@E;sg%<_m,U !nwa;Yv;micLؔczM~[#p0(#_ԐzE*٢M2͕pL$>N|To^2GTѨd8_4]^hra2z^<'/l y^_^^y^^RN.r].kyNݙɊ)r Ƅ BsOV lv%>Q_.M|(WٓئFc5W9yzB҃d{HX<9&I!999N+mʂ@AAuAA<_8=[.",6.xnp;Z1塋T1a3[/,Ih%q]ir<>qIIy.=n37 xg$27}^d3ϝjRbeLbu(}^ds6M )L W9˓ 5=oqXPQVVYWQ( U -++WV:Psrsr\52#7kw[s?am{%@ET֋ƶ fI~ 9Ľ|O%{&L㕛Il(Iʩv!%29`:sa,8lXU5ęe 3g̬*.9kᬙd_3/gl8W-?tb(/yFT S6KI֏q -WBF'>H)@~AT;>(ke|@H-7M )0,-yl8|[3ZR[[Q;|Fm**Ɨ,r,(q^hNQa -l -*.&\4&lVcI*'ўwtD-d){OkO$t"[uT@Czfr8ipd;q3f(ykC 5+UϮo8~|PST/_YS^HeeP:hE$ū91UM~TS| G}G$Q\)g$-3P107}^d kB҃'N+PXN2U5[[SSS f57 -7747kn^\ P/W^= $e *\UUǖALGؿ4>{RuCi[AS@0 9y0<1.000000D# rXÒy35 , .pa81|¹UT~~ D@ۅX0t1=8}Ӌ0 z(zעWF~=Kqʧ'?$rξ{L:8e$n_ >-R;j6j&Y1[Y6r{9> BE%e'TU8q欚sΛ翾iKZt+Vj=W3c`^Qõ}-.z~5|>`QPF򣮕p)Ν3fgTWPYQ^VZR\TX lr:YVYMF^'ZAU6v#u~ԃhgѴ0OA{YG z=9_ e?Lc?̭^цh$ZXpɹ:Moh`Ctz,q8|T9*Tllăj,_ J#\Cw+\B@=LDhhagwJw_;@WG'ӹ-wcK9Ǫ8k[=|l?پm|kp{;Qv/_e-]ASD -Ӂ?wV^t;om " O~ @~ ++bu?ty!\QQu-SHі ^x`b6h -Xo9- X{MmG!3\@a0p9@3!h66l=E$&3:_Һ_жU aGptkWЯwm|[_S85kM७ wՊ0wժm;0:jmTqWgRL*B4S#&5=W{?66[[4F3 -dy—A-v(fuH}VW$T)f#}|_Ư5ѝ9՘ sooG;S-P)B'ln ZUOU+zR/k|Zn{|U]x b#Z31şZ<gk -X>k2V2Z,ԁoU!LjB #i ֌X3b͈v>Ad?xj;HOm#~m O;H . -"Y,kPo n m,xzYpYhY; B -ܡV* -+Pw/疪.ݸtR~K*h".w,n~|;koŴ> -L 0mĤVݏS݇z,ôGG oomDU <{T/[!w-[18~/+OԾlvj!1an5bä?>L}ǤW44}Wu/_6`(,*uʀ׀(_My弰i%Ɵ.1^XU!4#r 3>Pg\Vg,3lQe,ޥ|2pVÀ]*0w%z14qXgnPO90FG?A# dq:>]?ko7ҸlܟjRp$[ `~u \k/'㿃 W$[q,£~wEMdT#900<\MfCN u!8:o\q!_j!o>[|w*V_{~9]JCg~7̝:Y:,bJU܃<_w_VQZ[np!./}}Kk- sŃu9 |\3-wB0q!_11?H]9eêA}>\ݤҞ]֖ilW%ZDE4Q' Ebp@|%($Ԅմρ'iߝoQ"hi*iFWFjJZ"8X;6@ -џ;*CW\εDvvCK?*|:`hsey$1%cp3;rS˪*RfDCujcSUvp_Tߴع/6ǻAA-H!% ݖnx65:[L: i]l<<εdMyt% uM>?6b\szgdk? ]Iy5 6:4w`t7 t{;ÝM;4$$l Ζ$-GɗGUd֩{^$t" $aG 1!*¢ bO? 3Ht3qf2@ߩ~oYv¯U˯U˯Gޣ\vrN~PM0UNӢ?4z|uUvs 9-&@V~*2B䧌|ha>qxj[U$BF^y.Yd)˖E]̩[NR{ʫȍ#뀫cct|t9m.o-o/U|lYN:? fݿ_'fN?"ϖ5R|TT {|K-Xure+&dKy$"8.K"+7p5{K*;|rt 2_~Xǒt)JF`&. H >?8<;X Fv W)D=Hu&(ry;q?i"{a|ܪlb2&B-Ƒ' ON%%&/a,i-g|lA$D!,<+39NT%ţ{ɿhT8C8J#҃T@Epcy.~s% -҆3߃}|ȧWIsd7^ZS2-F-u"At.2^BT,_+ g{8P!?@]51-TKP2 vr5j*'\|i5q]AmT'໧woB-"]X>UZ -a2́v]pR0T~w؟bQL7y&V2E ܅~y6A#:=M?cYpI'kbb#QB9,#OvC&̇%V323 "Vɮcu^{^X,>LjYu -?p^aMbg6Z",*l$v/Ymk z#-Fz, 'Ѕ)R=j5@ 1|BwztasQꊼd!zC4Vh>'y/"Glq,L&QRO!e_bN!8$JU6q'%$6%ԄQFrNxz0Qa:G&%&AK&nE}V=m$M܍IM8Lb<<:SEx·#pئ'Q/VԒxS h`HqKG}% 䒗$"Z)|O^GG;{>M\D8%kƈ,W|19Ӻ0)&rVQl/9bcT [u8. hlieBo_%4TVʏBy"P3,T+.,ےURϏtiD^^02+aYEckK~8Fa=z؋8s̎]7]뙾+Cg Sh ;qʤ+񦜊Pl׃JSmz\-Ns?.A+nâM6bzOC+0Pa`k/"@K`rX^:thnZo*dY2\ee# Y- ?L?=$ngEUSt$ IFd1FG)Y*ӐHъ"Y2 Njd0R[*KvѦx,L4Ze $1:~gi. @AKZSSSRUYEQrTfIjdDj5tz:nttYm~uCw@wXEV_Zx-XcVշ~ SnI4<}&~ g”)d6ވ:1o`f5oJ76"J%d菙dT3hŞmR L 5,J1]x🊇NsKsgJ54'P84hHE"^3J h楼nPduX./+ch(CCC9 9N$}05X_J*3BiG2qdR_LOG)BETrlMI<$M ss2ueC= S]FqdKvÕp -$QU]\␸Td%ݡB8X}(-n w?iS,<19|n^FW.W;=պ@=3vʺiu߭}͝7.XUW6ΝR;Ƴ垺 ?b?]5[h?lafqyY~ {VV<­IGklKS!NC\M':AϣQ!5i瞔#y;vwҘBXM3Rf!]k A+rW˻HMX"dC[,+*ccO=3V~ -3( }}}=EA7RCEgHq 3T%ŗw.+:PʻK ӟ[$dr֍+.IK3<jˈzi\8,{LНffz+]v\=)W*y|d`B('=Xj{pZv֘H#CJRm d97UO6<&͗j%J~EA-ё];1ګWJyfҬѲ+MlQ0b# GGqatQ7x ǖB'$n/wKT| xLK_=zOBgO -HU,g5-ϸir׳07Lui3.:I:dK٘ d]DM.'P?R0 tkQe9-JLJ/-ߟoh5h5e5K䳛mt:u`4TlKUP~5Dhg@;L,0"s_VA{+a -/R#LO)DtLeEA4kf~ Z'+I+J'e:Hw1K -5PL)Nc8]N(kdXf;w.h>xNA>.P̔Hcm"U<6q3 R{@:$6 .0I7 !*CҌ{;@ -461Է\;BF ßA% - -xR=i&YC.t9\T &. و#Gm$\kYJZc%@[ %f-<*&DݼtFU~+kn{xiZn44ldy&LZŏ<|xgcKkwCPbv,;n@N!XiyPtp8 &:&/&P5j=e8|o#'&R5:L8N3gPqfrE0?? Zda E\|>k8mjת`7,FA,oZ:l\~\c̕תR3嚘SSݞ*WQSIa RҤ_<{MYYgGGK\v#թ8tN]j5uݫr(u]zd`.*JN*o6 hX7vpG]2^ T[d`m6[[ TM^u vz?ҏ?sOE׏C2sox]'55ԷEzP[^Xu fqW6zV2 U؇|K0 ;޼+t~lq84: bb`5{{sp|~l -zTg=FCR JMFWNk 3shkuǾתH *5Og8VsԏQgv!C̤tB3l{:*Gb]0lrduQtd=`+iˡ[s:rh?ܠjŵw/eة! ?*[OZU) Lz"+z{fAŹyi!I/ 4BZr#5;=mw®k+\{'xhg<52+$['MRq݄9{8{[v@> `"ddB%:AЫR$:YRjn A$]AI$( ٲN11Şgu*2A#U$Y**j)W4Tï|W4o`OܿRjQfCnDLHb,$PcGvB-π K ޗcO -T6/UlZS7 [RUEw=;ͷ vqyѽ1 #0(d;yÐ+x}nO -S9z}$NfQ_|ʎpQT܎?h@vǿDxes]0|Ha\ϥvϕ U1hD}2ԹE a1]] kZÁqfnМts"qQX_$KS -X˙4s@i&-Y97Վ[vp^A{i L)H}+?,QQ騋hN2\ina\9&(I V -zP",⒘,b/!-N"rri2 -W:tn%gQ91#;Kr OFuê2(p r*Qy,_I*"DN jRSRd BAMi">#2&HI6reK)k2fd˸9%Q\<,qm'dl}`ӻsViK&)3{Ws ~㾛<陝zFǧ0'ɋ^06vLjzOpRȲ4UD64: o[vPb 2݌&3FfQE a'}h]\z8=OZ,DCWD?(w%(p#h_4^RqN\' r18߅C -~/_7D+Ldž~zIx͓ۨwbFʠ˜! pCxf|29ṅ+aUUBئjSMjOnolKz̾'l.ݷo߄)T42R -C đjw1;..9R+5|^86#I\DƢ"("`YڨCvlu0+v>,F*=} < -HUMDr0" iG9M$ϒ3`ꃶ#U/`>}׿7ot_urȿS}춢)v(]u'-sg|֒?uyw>!67/u56t>b$&$ zpelX+,WWhiXnûI}UQgaj1"K -D%1!2ɚ`s3I1Q_p8 $ɜMbI]p Qٖ̎L!8mj]C~gzMW Y f}ey2}L B_I5I#. s' 6~MjHRbN  N4!n]^Zߝw<돿D ! ]磇6۸kckΎ15gݘ5oe s񟦦ouu`'$0muبEbS[JW־}yUgr~kG1> d/eNWToXmfSi|&bKM+ L̻ggQ -Z~1ao<0w arBAxۿ0pDAU' -d!"ˋ(ذdQI5 HʉUb^3`E"ƟE)H9WBl[6Q)@DY[E(6SY\$R "1韲3m%,JTR6^ɫouN̽w -?2`|إ&ôr(TnGEVT#AKl,ʉ6yX&bmNĦ!D$$DA`35*%If6^,X)/P@[IoʖL @Nh+*$Z%rBU()*U(^Q!EFd -hV~#(PL_.Le  -BeH3~]L仑Pl?Kc@NQ -=?]f 1%;m7ijFg&dOr)J)'7CEhEtB!JI[GR Ff3ї.h?!7(jk9qbd3uPT0Bꆐ6W.hHfGi j yK:};f JJmirB9oG)Qv:ݎ9 DV"[I2ddLI&dv,dwavW]newE@mVQmE^.hm^mE-mCa,Üsf&O~3- -FY>hƉs=n[ M.n)uS^}Mtw'k~_RWEWѪy7غ 'InHpeޅd(<T@PLLEe"cKo :tAF$FQJER,oNoHs:uYlUT,~ {¢oPSKxڣ+9#Lr,Un?8o鶣3SR͓nt_-VrAF 7oˏxp?tϤG'r_DY"Q싈DE%)buDk ,dDUqR$p>OJ>%9)!0g8XMaau.3 =+f:]\M&; a (Os84mЉq` yOŝܡ=rkƴXoGRaHPWJ -$#&١D ps'WnGZ3LלyxfU5 #}L,55|i^P^z(<$ic3y* ~قIzFfF|R &ڄ/ڜ" -b&@;ZozzۍGq$nv{[EP@|6vI$;#G.FL'rHBO fM=U;ȒN &,Dh(H/4!UyR@AcN͹FJjKSlۅ $z@?wP8u[5R"8מHjR%mUkxj$xߞhÏF -`4}y|uAŝ+4Mpt5w]w`ڜ觗}CW-aڿym;g긷d1Nh\b-y;+_kߦ7G?_et7mγ')"oERf-Ba>OvazҾMG9L獼 -(@7Ȟv $ֶ܂,@0C]|-=f>N;sxO#1hq0j8eOThm~4!s usU Bt6 S"(nsnYx]y;Z^R9B߷}aJ7T~pv7A ^Q~(3<nh=g^ɭ r{߈cJ4X,RJE*!Ys0iAPڏiH`]^2 Jhchc7%98r-j<8BF=&L9r1%S})~4D= zCsȏS^Hcz -+F9Ƣ)d+^$ -s ^zrM;5ur l]^Xy^"`*4el#Ew -C ;'keֱfjMbTU *.lYRWB"2N hڞQ .O_ WQE=*Due-CfA1YǍN򬕹ܐG_]C,+%#W8*.& b*x$P - nj:6sԦϑGGSvd*x;9) js^Rk@ - v:@W yb]B+0VUu+gWoYOz3]ƂdnBvHVTk# 2i~:O\[Rq-ϒV~uSߍ9 I 9-? $cjv釳gߣkC<0X6!Z)ɊLTJ܂d̢E|$)%lXjD`HQA sZMS0dYm*gLoƔl `$%Q.IapQr1J8ݖ_JwE,yTv9Ǽj faƽ7!@YڜX_2é =ҿ8m4ԻR&#L\w#bgWJ3ʜ/jcvzYu]ywA5y)ftX`h^ؼzC6 C]!{C~}N ͹pgso=6CtEc\KC؃"YƭAA[zڥŭ +KLyY`"KqC7Cl;񣼉7anȀK 0au;% -N~LS3J7x "ҳ|pIGa.qcf%,ñΤҴŁi10Y[LZ)k쪫Ñ9il .,Ktؑ!.p]dN?"=(!n AUqƙ>AlZRed?̺g`xe/ʼnćGODa$!(:ёGGrъvt!i@% 0A=OP~9@CogCzV4z=6Li"Fs'ZB$qv%ň/bNOʼnJʢMIxeQTq4(,NPdR8anHDdyoqaz7Xph1#M[84:6 LKŅEX6uѯ~݂'`n)JP 6$?6p%Y] A_ -l$G^tNADDܯK!MZ|V|r6 >mFKTcBBDG1RHYY"T,J<$@IXeѣ$x2ԬXjB, 5Qev Yz{=Ҭ %u/.ZT( zBJP) bl51U.Qt\7CD%$U/x}~&qohPhƒ>8j -lPQB!3||ôm_HsZ/ߍbz`DV&QY2!;kd2(?Ta0;C>=htdO_{[?;ra;"nV -6bp'L<,ho -Xe!>VHbӜ&DaKik uW7_Eo;G8WGM']K.[J}umMSrHlxpǹupp8vA 47}lF \4v -7UrQ*[ۭ{׋Q(]%X0.1:< ۍpm%oS_wϨ)')B(bB|遢V&MOu):-B`LJL!6##>ˆHh-NF`/)I6$ʲVPT!02pbK/tHgqyNM*Zs2 RaАڪi --Lj(-9 l}&Mfka8pN'p]N_y7pǑXsDmNyBh,0Zk(m;A#Z]?멥Đ> 5;T_y5_ha'.lBnMãGsesݮ2&gvssh:)ZOLZ1My55ĭd5?;-UF^4]˂V(5ӗ^OUkQT2h0.T-Ȼ pWkR0@Tu?.F2D@#>^oc[b;cb1 -ͳ5DVqgB&ɸ`P4qH,RepZmDTl䪍m|]VO>+zʒm ( -j.`fӃʊ3 sT?K͍q;?X -nc*MX}v*ZE? [. BN͝qיt&仅`ps~ؚSx_8>N؂}N7 4i!tʠV%XJѴZ)7R-CNI]Mo5:pdSѦ?S_|1*f!cV9bEP*j^R!%(l>&y.yۃP(,KQXjx,XmFh?ɹcn(6'x#1 uКrW(\p90EMx!CL@~n2Q;#ȟL]VSb^9_3ٍnl<-F?!˨4xŘ&Q 㽫(d877Nc&| |q?0!`Z,o ?UO99dzs0/Hۖ!1ڻ#8B$',cZ[2>NZ ->yr`sT6ϚNj&/no; `&#n -aKpto8e9'#2"e]D2QG 7_|r~tm/N+C3fϥTQ=4EQeodDKO`YJ@uBk|Yvʙ K<;k 0zh|L XϘ&N*7EBh(oQKjČH-ًӊs}?Wc;wSޔiD 4V3Zq6gA4𬿁 - ԅ3R`Y<qل!xNwTn|V9Q/e7|=/.fe)hznʋ{փ:0 \zŕ,,`*ZJܭ -qE䟴f|A%rZӭ!ݛ_@8̊*hޡ% |/}D,iƺ)Yd2~%AEcuQ=ё?d\Xް9<#WS9`vࣹC9:W A"VX֐Qp8o=:MZI:M5aE2ݺW=('3jL0UҡPD\. $d~kE,)@ TP:f%s, x"8>gmT2wv:ʭ22'l,/֊rj~*E)`-.0nzG6K=2 F hMIC,adY'޼T5{ghcm3n鿧Ap-Q[;EnXS15;lhdBM@75Ǎ*>UMV6 -4>^8 -M%Kk> -Sꆛ}m^xFBpҽ/;_-3?vz3_纖I -+oQYoWvU߽a@X=V]Y4P[`w^K@H>9[i<.Ok--UF0{|ņѤܓ35<L>rw N -05e-}I򆼭ˢ[S&R٣d2B1eC\c: SP8 kh4.,OZU[t(Yv*f`46n,lЁ%~~rO4ۿGeoʒwZiu-x»0g1J -cP@Y?(%d!/F x}J$XSPcpFGJ6 tja#-O:F.T=c7ރ($07sՌyiJsJ\$uY>ǟNF-!NU=;Q// dFvb9@bA.]BW+tM5ksv{k3 {5 ɇ[C+ugj}/Rˡ,9`U gikcD.EI:W>d<.:\LAHkC{A=Cy|=pyyHrxh]n6cZT.ӑ3^S2J !co/؃Z/*UNLksRgZ^o-P7vj^40::58 -QMsŹ]:Gn[Wd}n=8_p}z,cv ]pM\$<S{k=Mc6n$Sc]a@?=C,]Kߚ[O¡(yt.;eÊ EDǾYk|[?ۥGK7Mћ$6+'E>n3 JU!kYy7z\',f5#Zf%v䬄 8idB -~nر @O[S-OB^mwǸZAs2%t:NBWAP=պLZvD Nٽ]/ys - фPm,my2w?gS -}0x@x!K1 _4`Od?0?lvo6++Lmy~`nSrcf}7J'E5_e1ǔi*5eV-Fc50Rѕa\KlG(`O]ȏ39n^éj@~NtXa9( 00(hl`.x{FaL?F`sT8 /&0lLyPݔxN롄ZƁc¾YꆼHDM?6V_6,WfYoG{6͋y]Cx$3R~! v?2Z1Ќs)f2թ4^w Zsɦ~D{V4DKvd%GìEXσ'8`FhR,A<'!8XtK]@Eܓhl-gZMOY-)Kkͫ3bnlE}Rf}ecm,eMJ*ǚ*qmdU]{؍{- [kwO[?!<}*>oE~6Elu Vxq\z::veLʛŹ+tdiCP ")9QomukdT)+,cv#o#kvF5aV[]RްOjbyxwhņG>eb=.OHDl$'FЅH>ʲqw"z#:miMC vek6FijFdJFS zQohHw4.h\KN6jdO[0Fpt:;hS-=UE[C19M@Jv9\rBy t+#ùaDui[=xƞ;vp$q 6% 6r][Z(m]L0@m6mٶwi/m ަ]e<iqI#}8d! 'QH%.k]5QH=tg2iߚAOcQҸ+Qc9ٸ!{6uJY9ZHVyd@tkė^18]Nγ~pT*U'>GfKm.rVc뷕Y`ӏa3:Gq81qz̦S -tJ选5QuGB^Dp'.t37t V<5WU^X,Q>H5>ܚ ~ahG&M=~z|yR/\z7* -+.%lX\/\%[ȔA -RoLCh-TN!S(荒bJ&HX -Ռ2\b(Uj>.q ǔE$R#Ił djbтMBA~J}hMyΡȂTiH8_wJXoN`UA&z&((B:J-=Ԭ ,EOsr: a_'W'{a݇`uU Vߩn$6jƗNj8㹓EqJ54xZ%W -yG-5`Ǎ5lx/{,(if5tjI|k::ZÉn(mT%ngސ+x5nS6#>5}hw̟Zܼb;օ}G#9}x&2 -={ߡ#ǯ{L!lud^DxzDłB."?R++%C[ҷdͰcfhh4YdA$䲙d6U(ZᮈɎndon2UEܝٖ񖯢'J#+I#ܑ,8:40B1*[Qj#h2-X`L&@x&b_r%SˤEcL@EA. -:hqdǞ"Kx -.[Eʔ2jf43e"'4(:FOPto.ֳ4袠Ag?Uk [@W+ ~H0(FN@Z3DB]0kc=XU9~ x:޺jC4-n[Bo_R+,[B DK ;|rUGU792=eL*s -m6IG 3ܔ.ܬQQCEeq :,̂ɂ(T4#XK#J047o!z5j7 7kSKgmD(i㘩K=j=ei(?m<_..~X*_רT,5K=B)J=Kadb,ռZ5*8^Qnca͔==3@ EXPtiF5a8 -+zS5 9'iV QYbY9.ibI3S.#f xX SUSYBǛ.'LouYK $a>@PX@pHs^ _@bYNhZk*;ZpkͿq΁sFc:EA;&p;o/>S0锓K[oYKvi5$a})}sps0M7ȡ.'cuG= !%❴ŀ?@ynjuއBۨm6g3ͼll{1,5"lHҋVoO27fѥOL]rJчv9$1bG| _J%Kvu1O>9($V`V3ahsɀ'֗rIyJK4 n=;?<%`ɷ2Q?Bew*oomNnOhOx8K X}?#܉.q,/1)N3]skc'w~oz5M$k=l|sJ[Q0"IyV)Y%?%ϭ "HLFH̊/c3wV28xK7`vɑc1-U[V4D -uDT"FP,fxaXqȩ"M}-^e8fکq9$;-]r-+$Q v+悛zmҕ5IJǩ7Zi;~o$ G#1|%O-֊Z[c5FYe^11ߜe-}j鞶([=ɣ@#%\"b0eRiSNdZu 5Q0"EJpaF\D5v7&*Npv0LovsomBr/6؞{6kֿhp/B/_Oն}3hcpe p:{q'Ԥ%XL |j#"ʦl h)Cl}o -qoC&轌=J=-|ޤq&IQw98۝4c>5,'JߴxLg8FihA(Ų6Ȥ QߩjI,q 6q׬k6ENf Ј!m/}Y=g&{\ -Z@rl pF{q7뿴xMhϛZT˯G8y^ө^X=1 -;vAw#f otIV۱<[ڤcw*OU^'zuHAE&{H<n.@P>eS2S#XD., KaEcJK N^IOSrOU#96d! DD&KJ_nϷ6YY_^bC{~8P1Hc/ _rԾ} -6OB[dLj,=}.JGɔ)X-\NY hǰ»Hu(HPmr9§`}brLڮ.׵6FZsv >e_@3 pz#+zpī3ӳ:S_ŚmQ3v2_:M|0$"  -AJ;, W΂{@`š݋6X=n C -Q>ARM)J}ȅP,סU.kxs)&eV`U:.?&?'3~i)2>VTfRP+I;E&}p A>Էȴ|`R l|bzW \.omuS.5j)1J*3턹0Ll1;4H;S,"!>|,eK3YCGf7#{W{?s^85l{@Ċ3&7)&:Iܣo꾿m%fGi4kDʤWeALS0G+>nz#NXY%eUAroPҴ*)V"La5`uJBc.S|bE+)<2l莍K,1ݺewצd%ȘNkko+1loz[jIJ pw4LmHFTz͏N a4FvGBP756$-C =axyڑ\6Zf,yz-- ?I&M f$I4=M$tJ6kNbTR]+;X>qw;7Rx''\;9pJ yGxXo ښ<Y?h1fOy5S l>}wFձXJ[{̭ǯ{RC>3}ʆӿcm>HU,N a1 " 8!=hxTL@Z.W2y$x5ȃFq-b7q wP)z-պ'?YPe1;V8#b -A" -_X'Ve ^)%+d1SK:3~-Z[.2۾j'ɰLe2,ٜ'w_λOw|Sڄie,4YXU[*$)Gz:W5Wg¢du -*Lb.\d3E3CqK.* %\4B)~$e:(2K,V9% &s4oA˔T*OB,?O <=GPh)&oOv>|H+IJTT -dHt &6J0LA.Y0T;C3l5^MbgBVHȁOn -햒UYX!omѵ>hG.㽫Wݺio4[Ð"lE]Y,ok,ĒIYi㋕Ӻgi*ApĒ!-2fA-7CB$q1;r -6&ǝ.vn/=IMs|@>paX&HDk q֍0Q_NQL 6Lp-[NoQ -, ?JQ00i6'66FfO^<Z 23N\pV%;"#FQ{_j 0k\Xӣ`}=mr0|,|EiH^u6nwjO~N !IQӽN9~ aՂZ&|Ų@GU4!#S!]< yd  >BSN(4PR@ -1C@dK iaAN*yOf~% ),--]r|L5!xMzQh+ 3Zs8z vR Ԃ}} b_ͯGWbv ӿw82՝uJڀcrT[)%* -WCۅ!!F 97ǾkX~OEbMFku:ܶ qD1v3fav:wـ#v8bH` %S6Ÿaa?K7(( 4:;IxP^kX2f@~ݨcN-bhELBT2L觊ӝHbX6,!ڃ %Cbnd N/7aja1Zgy3z15Mi6IJXŸ/ !'5+4ΚCkZ;khMȢIP"ǹNެ̌ŭ$m!!$ѽo}d`C/65Pi^.-N$}w.DhI ݿjGݒL"ߎm(tZ!g(z,a90O5+?/|Y9B31[h|SA" /?Ioc`*ƹ/!g欲NINo֐q)CE(Ni6;D4׈hB}g49c@Z]F~G)>sQn(rQ6h:-qBI_F wtx4ʣI~Oy#ҷFlz%A~F&Mh<ب A{L fi]C L[bv3s86lj $96\jPx}% ︤΁QͣH38jwKJ~myp 7/;a \fX!+tX@') Q$3 $J0IIѴN'\ -5v F/Z¡.Qu6@% S6v`3lSVըEvML`ju `O9-(}h j<3r;vqb۠@S"TI!JBƔ^Kzf8hۊ ͍cZEE݅xg.چ;5>ŝ %--2Do.:;XfwgtߔQkRvËI+@[I[Ʊ)8rIBS<,*3WPR';a779<gGFhjDG +L_<됸&"Ř7A/UkzW'Gk-S5O[*Nrq{j>jĨow:/ё=l;}mkrٴY:7zݲbevU>8LޮFpj[uTvm[uA"fȣow[y˖wI>s=UP+Jc 1WڎHkg{EG( u+?ڔybdEJV!D6KI(^"̙I+Pz`󚞕u tQrr\(B.ZιD4yKŴg0,!1ͬm qަ:.تEZ U+V{h~@@vl\Y<>6ط@IQ]kSU]UG_0==3=<1-Y"=Y)X5XqS>* D !atxh4E3|E&SigmvWlZ V*+ RAGG*#sH+te‚ixd%-l&Z e16#2q<mYx;Ď oL9F2A]z$?s$CH, `i|7YQi+PiZEkc3A,4 L;y;t>c^}([@,!Dpť^z]D%67aܲc}PB#mZ\ }>ƙB1҂΍Ι:W 7>ɐ `JFӅʹ:\v: 41BqHHCp2L0$(ądhN.Gq ߏx-*[[h09b4}YcI+)239X 8YZE*Δ_ Ɔ#髗ᾧ"LUׯz{BmK@ym/uGľU_B?h-TK23}3"ntMx[':h5w)/\Nde՞5"v? WǀFc \@D"6A'rO?A ﶓOcBl1M5ٍZGMx[7e^VW -@Յcǭ >ϹOSLLUOA+1pfg ۥw[/cs\Uh1fK3*uWT +RaKɹ4[BpT6#A~?tޏVG{.`7v% Ycbv-) ,dfDJM'D֦Ò\g؋$!D;a `ʾisaEW CA-hߊnܴgߗtեu]Lb,$`;k\yon/>NPrTXK<Ъv}c{+S֗0r Z֒U&$t.: l}#8ąค:-dr,X32Lt4XhNYLiX [WR(>T`ZhO+B44#"8J볫sśMڗr -_ -z |վ|2wFZg-%]a*C"6u-&%"*5$YcZ8NV]5Vddhثx'[x3H*ǠnFΟ+.n{yܓ?SؑQ/p=[Wtt<9A>R16Hk P}·?lxig),a@~ڽ_ XB" {>$AaH/0Ԕ#,d)8Hgx6z O-m(G R%+^]_$iI@i*呞w=NnWDD8Tm.ꜳ$t&AhͰA;[MƎu/#ۇGi6IзU: -GQz ~~m``c YeKRG- VZ_0r52WTl\!wxrJ -7ݚcf!|#FQ| Wռ.{7]&Tiщlj!;85hS$OAsr7|?8 -ESwhrˍ #6#;7o^pM_ -|cyYe}C/)t3Ek`|euwWt/]"I6ylib!n»̟T?Hi$pYQ1#Cvhл<|H}=-D9cHA4YIKs7gPp1IeoL"LWwK|ΑRtYg3ps2הWE}'ot AU! XnӍ 铡kBM&r.*ېo.%a.ʻ64V=Yaq_hfMQ% 4u'# L̛s`dVLȌF ̲IPn5g2×M/!\!'˩t?ډވw"B$Q*0 -=Ñnt#uƺW`3"Hk =b̓D$o(Y.Gp!8 -_ $.re߽M7mFp6]ŝi8$IhHHO!5 -RPЂ@b(LC^7'uQM:DV6S!ꋤ\?޾`|s1;ГÓoP/xpGF;Q+:C4:hT4cq@$6mvp$BMmsZ>=nD?IR :9gsƥϊdUWTZ%+-X -xTZqEWu2N{ѭ-a^~@ֳվmy|}-{٧ YTtʇGZa-lfΘEfJe,fDJPBv0 !vs}-\7η+Ol{n+[ Ka4 -vyNSuEU['Ms,6aX2Mve "񴚇"G뼅0t=ɾFNݬ:P{k8 -.qTwKcb i1 -'w{3VUp2/I] GMrX -#N`h]DȈOكA%c_#cd]euS~f 30x8SoY{K;̵{bL/I=ZRή#~GQ9Ɨ[ђ6FK2\T\K*,NDyOOdFNkMkHz Q)^!f+Iiy0aߜi| 4 VLwVO$ HK!SJzn^_M;GrKH{X̬j$ %jǕǓ=Lr[(0<<6"H_JIɌ!>/NO&N_(x)VbX-ť8_\eV*׾OܣU$$G.$qĠ1~D64*DX4L> "j8]ǰإ$:kc9[d# 9MŌ12G232`a -5MeU{߅Ř;CwD¹?P}T_Ib@q.ft$y=zT Gk,E 8BX2Mdgl}3Fny9IߴeeN(&=7mL#H]ɞtϾB\!- %ת&7vw;FQqT2 " y/b{kKd3.BbdhR#$h=ӷhl}T{{;e'Sr%!$(U,9B;0 c;cTl_ DX->dR~wT`b%T-^Ix*×Jrف~ys˩j*%v*B#(π$a\d -PCA̧7c -UWbPVW|Kco;Z)?8ʰ|:Z~,zv"Z6M }{ E7ItJ #TꎒrA<_u{\~m|IIQr;:GL}!}qSNsYܓ׃D8\ T)\m#ն2]@zJgkMa.BۀCl)^=oƑ^Hxi?".]9W^zhb^}5Cۋo8"*q9r\K`\ ,qښ=V~E+pO~/W=p_׾;εC$g<$H]>րIVW55{\\ݒ8gT`c OSPkSX5$B`ǓCx߁hnBro -xAèNVa)ߓj 6FB /?_t~b G l-g,JS7+ Zy.Cu v~;+h#u)ǼQ53 y-ga Om#ڔE@Yf13W65^J쏏: $H#TYq [?{| ?Ow ;\}{~w.y+/{f沝0/!}1lapJnj3א-̯m uuuxc0q,q8zaMfZwW_7_S;\C?m7;cq{~㏅]>[u%3J%A//@PijhȢ#N/:^^8GTII mT$J3;| P Q #op|8 EE'i7{e=*r7n8R|c`9>SwwMe:bQS#)$05n&=%virifRrK%80zxGr\4Ml؁/A*yIQrfNT1zZy/_ybAWVMϫ|M$RdGX:p"(FpkQ(e^@ 0yP*O,Iٳ9\V@[Yp5d>@;wY[:E9_چ?RTfM&JxI+9IӌU*8qY5'Le4%)@̄L&&&ɘHD.8?H0f?¥R~kY4=زB s+ ] 9WqWD*^+%K.˲/|nefk*犗'ǩY /28e ýB^*$p6 -Sk184JmDw|f".sS[-qla8}ê 5lه2a씡 VhUqikލ^ʻRYy9|Z{j'sVtZzz -èR1R5 -sJTc1?-e@6FisJO ;N/ Xt|n=E97ׅx K Rj[61^# 8X!xuJ~%հgP)M荶}6v}կL#MLrADg҄NNj - 5'nF'Kؔ娨7,5fKʴʇOnoUT SʮBf! -_x_ˆG un4*b]ჾ1]CTmy]W!B[ }_qp<6 -Ck:S=Ztpv`c0mxn?(OXGͰngdʄ#s8Yca -1,rrәR5b,ܤ?scj;sacm-nMY+Ȇ뾶 -`+h y(ÿTmÓk#JYucwnU^5"84;:\ү̲ܶSovSk,ИR#FkA %UVbEf19:F$>rS5$ - +s4#YbU%)%S/e,<_CM/MyN]XӻGnm_ S](oYǿ箿ytMu`_\tH q1@4å -Ć%.mm>P@X; Q@$Jr/Oގ@"e@TYCtB]F\ _i u,F8x4M/g9&ӔƪTǧUx˙K:q?u-/3{y׼wY6dkgƜ.avu]׬}2qNgf,f68bB8 1"c$} ]i:#ؑBA0W$Fhft@0 p6hQ=,8ajLSVl2.%cDax9 DrWʹlͩ* ظYr09 30B -!pJKGV=&V6q164~$Fwtqfw첆ힿa`&}Kiv%YMl &7&"ʫW+/ aʒEsGE颓S⑖E-O)^ N);1׶'+geⰘhfҨ -7GeK I#T^ЧȿnþYrˋ]ظQ}r,N7zJj^^AW+zA?S/JFFF5iMnQh9>`_O~&yL*r?nq"wKi<8{ąmSww |o6XD{)쬰^ Ֆ h'EM; 5{Ì +K*Qh*l+T* -sfi\({/&i x!gF=3N⟶dW+PE%GنlÈCS4IIbiq6dde'G'V9 fsč9B n*Џ2+XlFY?}>VX,"ɴ$tYJžW=݌ - lTP{ 8 -yXze8܂5 -5Qa~>卓,.t`7Ja\OJwaaA~^ou0YԶ|5ڪ O=42pƣm3ɻvEWsE_p'FCmtbla~ų+l[ ÅII;e׌)=X&Jٗ \pՐ?S5 \*h~D z&O܏?.ԇj%C,:-,<#it,3*@Me%%g俖fhL6MP z'G1q_ H_(u /dueyCIcLFio' )9r7!REH*U!(((騺@ZW}&")b:ʯ)t+<Rgb?s$Yo%R& RH=?xCڣie_v2@Vqg/?rd⨸8_h܇eP(z8-r#?^y*sF.R s(kR^gPZ_&2Ⱥr/9?T̂^?XQN?{{Aq+ KzÄ'{^W{^W{^Wty^W{[ϮूLO~̿iJpi%D,OxҁnKV: s$HO8 < xB}b%^(зg>$B{!>\  ,З. pNz<,. hɇ |(ђ%ZDK>hɇ-QakI*ua1D:&N >HD'RB<00:C.Ӛ05acu![^egYPOgmpN-ۈc,Lf-(6 mbN:{p#8qZ -rjC[$pihFsmmvΒԃkܰ]j -,р|,5T6"my W; +:0L6`Uu?UNv- ;3FgfւG*:-5v>nmXT+Y6Xo ݸ7őG*Ǩ$(Z,nY --.9^`DH}ag{eIϖX(nT8 C]nѲ;| )|JWW'a2Qv!{}?wYLݽM?í&ƦT86Hi?Pzzլ\OhG!mn*70A|V@[ATgoF  -g))*@?xtb%UULT@wJ'm\JS(W/ޤ'ʟެUSU TA˙~Dԕ頫sAתkAS]vvݠ^~AS?z}+Lyϙ"bG{5槚˸"!9r^r\ŝ6Jm6Zo55uڳ+f˾ξվ~~~%eJF=V^$KQ!{\Q n;bDOU MO8"2D\!v[lwQNJEpEexYPV*TT.JiYuzV(#FGҤi4Ś #3HOdOTN/mV׮h^uFvۺ=Wct1bcbZbي滒|OH`7@dc1*#{-= -N|PI;&Τv&$ߕ2'w$~$ߍ{|'RIg>$߅{*ڃ;|>ڻ;|/:=Gn#k;|2=F"[;1$OPEw^"I|!D(D/ww!5{|ǐBWw ->!%11ioPO|O@NH;|PE|NJ'.vVcbD*r#/ -RMD>F_*6C.lCt! GMX'naLpD3ŨߊS_Ŭ%kR|a\F"o/Faw/$Lq28  tHX pV+(2&* D)d -A_':_~=ЯNpN=b -  !]>R2L6I/ -<[ a\!VdVHz| =)`=dUC0"Ɉz!~Ul9a>q8#q䜼 "4wfD |vEA$d? OBΓ\OIp>>KʺM" b테^ z!c/t셜!-xrx&BN/eZH )'!$$\ȗ<)HԣY$d_a 28 mـdIr2<C)=y2l wڕl|Qw a&q*j.؟@Z$~=ߥ-="ީ$6?G&t!ޕ%"k Ow "-HBomh_ XBBuNʆlf#01vcMrGF,i.a*b -Z oƾOMhXXF4nXA(?+]4A;N -@C<*PIm7Wat.Eٺ *I7+>7gVD\[>;$Nwbň*H{=a߄b!/(,rdVb^9-gRbȊ -'ӌ6 e%3B-Ȍ=yxI162_t"V^.=[B5!gAKBsf?ֽ a/C^лƳ@&9|D*s[s;@K0[4J݄T=˹ac- #q*s=duh7¬Ff3ӲĝJC65~>E (פGfGdrtrI+\-2ׅ\@pwC -OP{#"i n=1FLqk!6+-^G<&8t]a'g1HDqOPfP"K(Q˞cXbQϿ]^G{f (a K,_ _3 |,tQ%X!F3+Ʋd1eC4#fl߻8F+ecÓd6^,+X8T&djV.ֈBwF+6%ZE+-.YL\kŵ(1"K#u,+`l2 K;@g0 9:ot^t? a;2S2'e zI.k2dl BD":@ԇh ;C|z[k% CPdf FpXr8Xd(ygm׬6ߴ^26Ѫi6"PO>~ \zBS0BzRL=@P%C P*C B-[tq㵿 ֩Х u `h`=h[lmVf{ '8bJx% ;)ӈ 9~ע^)';wO(16ːPC `1CWby{P0<^!C(wFܕߖGP"A jD;sXs2Ρ?A7|᐀J Z [g3 vZ -z{ăC?A[gphA'szKm ~'8_Ze)%}KKH<-`p\C6WY2m#s%CX!49.2^'͒WZBYy֒@{eYO ж!~Glvϙ|uP~"6L sÏ}Hp:sSҬ9Sm׊~1'/z~Ӓ}x`@GWKKrzi)K\8uÑS$ "vd,j P7ͥ:r ~]> g)>T -XDKRRWg\fϧSޱ;+_sejE)k,Q֩JU'ٳTU' -#ԓ W7 /mjSuMP;Ha5m^ - :*+by `=}Afz+cUzGG=ig2|"`BbnX(zC9ԇh ~:ZfU-d-llvnva'G4La^g3w7-D$sMP9&ܬs̹FsPc2dsyh;txh֘cha3+GLL7v銱%9͠ΛN:m:jzψpqAu14A421%$_2}4?$\5} --L@řu%FnZf'ez)Iko% B^NZAĀ9 /3`dr4L@ wƅ+9gt< kz /mWd:d @n-{0z2*5nOeoBBˀ.:4Ǜϣe^UE7uį5bX) bQ̢U#'N> gscos&x8 -$;3<@3H3{̙Y "BgE`m1.\y-x (0ֹZ6{>pn>~ D*J 6 8x:2P!={-p9ճ 6VEGi -e@oF89Ox@=@K-u~2 9m7r|;ֿy[x]se4)oeOƙM9?Vf9Wz+_xg!ZNg#^N^m)\"˥䳦&W 4:zs'`Y:gW"k0e.y۹EefxFȺFGQn"S|]x} .Dt9Ӹg\3g, 4R>/]5QzUBʁO -<=s\D{.+̵r@~x{ 7BmvB. -C2 -{+"p6]{{\}͵ރoiEQҌB;f -_x[z{ؿuVZN>0 -X'q,_+ t`#φ@/sN Ұ^v]"_w -pyvY(;2?_[O' d>wrr ?<]H` Dﵲ30zob=cж˷a!^ LI=_\yey-f)y!?$]>cm|]<)cuh'0Vc_K^WtWi!0Y7Wq+rJ:zùӧ }  >=Z2%@̗8Λk}E~W)k*8gͳxdݵ5!_]3w2wS^k9KvߊT^[cwݝu͝Y3okL|o{g˷oOg)`:9eEv{k^V#Sݻ}G;3Yv{nNwֹNBYH>}mTTٕ'_McIiBjbX4%1[жMc4McQ, -3m1.Cc1<81ax.شq "!o}-nښN^ g}}9g}>;q= ZBǭFr6y CͨUoQ ?|W(Y%)V#>W%_}`UxLZ}k XY]׾.|4ð:n_)6z'|mwBkۻ bMߎ@3h+ OLv}߁?|l8QwlIZ|09ؼʟmwt=8zc)}g=m3y<լWyiH |ۺujٝ N \cםcם ;}98sN1͎0huE=6uNt!``"OCIK7MuOhӛ;B~4^֙u,&tZB;)BieN'> Rofgu(͛ӹ2.\ smx;ׇy;C^0d {K:[BG6l] z[B'UCY=s5C#/t9Xίuos-:Bwd9JF uM xÝWx׶{wvNһ:o1p6x{;x_2Ih!rWG]Ykv3AvWԾ z?pӈв§E]YkХ]es~_Uwu^u^w^Zoj5bֈ2?"`䃣6_1ܙw١$Cոj]IpI]ø/{hZ yWzǡlR$YFXwn-ѿ# nU{#8Gl~N]2?? aU~Xt8N -A?ti/|~ɸCkpj~?ls^??h xJ -lCtR=<4ўåHEF^![W#/ǡOE L0܍4HEt?upg!xhu`XD#yuNFx$&_Zv5ې*m` U/v{|N'2עϪ -N6]z7RwH~s8eoJʹ 4g'voOӰ7Y2j,ۈ&>8OCג_¹ѽMG-ej &u,W M 1h+nkn'J`c]ۖكfQs~n}f[CD)}>V{,xmUҕ޶&{qT_rC72_o|!` -+os}U|ch>uIX{l3+b_a;X-;>Bxfl1;^cgٻsl~nVvg-dm㶳n7.{߹k >w}I8AsNgLi~=tt'uu?t?[{EKި{[@?p^kO4~ݸ-a#GO1^m7?c|? w'?ŇS_-=ፄo9w3ď'~Ub^b?8 tSߙ\'l;Xze} MʎP*VcVxS/?4!_W2=_2Y~3 -X"/Uz^їKjMog_ѯf e$leLL0ɐJd1U\qX$ZRQW.N:q$z!C [!w{AxT<.ψ#8&NSMqZgc6-bKerl mvr-mŶ>M&_\ToA(b -%baZ_͖k̪__ǖ2f [U;6C`5J6 -ejDt;z;hnsZw^$m0òHcDh䷸Uˢb4B$P-H.J>(s;I/e\ %^lUvҽ}Į'KOSy9cјgh#2U*qnMk7=շ{Vb/+s{$m݇RquM{&}L Iup&=\>_=?)uOUOtߠ+ܷ#vոwߪ<jܳD{<\j;܊ԇ> 3okujLBs֋֫k[;֙RҤK--\jV-]lsi3 PSHMedٶFT{:Z/E8ɎB$/[y}Xko4VZ -l(l/r^hqjh3Z|r:.1/gL`y4l{iY+KŒSKd"$fsBHf+ <ͪg@b&:Jtμ>2XvB&%үmZ*/-o)/)Q~.[DWP*&]FmFAiN,-^'xQ>\POFjmћ7@ڐ -JY‹A%}K -](E Pv@RAr6W\XW~ZЮbi~޲"s)zo^ʯXo+o$/Y- @&Yl~gRq*D@q -I -߳Z1-[ūC68aK%l)Tr~P K-$JH!,l?B/گۨ}ڡ+GґlV>FΑpd;rA'9Bo[aȫ(8m*@ ৒++ExuW@WҊ+ABXWd-Vl}*NV U W-V\≊6w+fO@ɒ~_ڴB"/AgMtg -0T pA!p)g -@1 ܄0]82hxͰ~M٠_;17^< ۤY62VC,tҌ @$*-]䛑hLeh,gȋdPu˓T$TP>1AJ=VQx*PU(/4:HCs\<Gce1c]xFnLQr҆zWX3-!+X([cxN̙!G1~T?qO:^[0VO?^cZq;@Pse̻EgO=h`%3"S19y (\%z>!Sg$[\<pL~˧֠'㖈Vס/ziPVoߋXi7dP;QoܕaXq uL<-NBENg,<6aqdC -Ϫ_y-]\ - F{ -I.Uc.ڋm\\.oht#C>p{cפ#vtyc?*D?0?.~L{>f>ɸEׯhWb ; ph@\^n3ȲXp%z?eo,cI:aɴ{HO]޲P_lkWO/2`)KwrU:[1v"ec"XsOkYۉ$Vʘy7>rK`CGN8X0d(!_9x6$壼7_&!`F"^,1J)4s9ǼМo.6Cʼ -xk(47>*sؼͼӼ'c,Q^‡>l# o Ӫp?'} z|zC*Yz{Ca}7>WzKC%z?C1BofXBd_>KO͞``:ƞ9+67x _[CLː997bg7Dj~άBr<4܌!CK䎣Or'һ;},zG6Loȥm|޳\aszn.?+l5T-RW(J uuNtE" %)rd I*唚 }?3X&$U>ޓ84+7hʃ'? ҩ 1iƙnRo!Ʒ0 [q??ty~aV|~>ohfneCad/j up~Q(?BZK;{j0 iUϐ)ɔJMy<|s@ܭnZL-yHYuTT8?dV,Clzūu2dZNԂ\QfLNs~r81Lˀx#wۋ8*㫌7f\tuu`l0~_2~0ƷXkleO= sa.-,eݓC&xL𪙹& mx71.MU*S3`xނ%:3%3eĂ错4kI<ϐI Y0` ˥ M,ɐʧy k` PW&Ʌ 勆yLuAzfc 8tzN?*ws=rFa {"%) RS3 G1"”yBQʃo`qƗ/>o\6}d}D|WN8W])|xoE~-jwY,]G'K7Ǒǃ{Y"I60j<ՍBͥ?F:Hk5Ex<[-k'i10=כcCi|'ddןb3h-il$1đ$$ $@2-uZI~nv\5Sٞk{C{CIZc9V'e2p2r))5$B¹T)#HR*ғ2 ulr /JZ\ 1DKT) )J))#ф6jFI猟67"8xmbGilT&%:W^6q=F%'['I> -)5Uhvx.z;YOj} 8%o\kl-$77I @$$tgYb3H(='1"J("r -O'X&@g% @-q~D^Jfu!x7 Eq3&.ye7KYFqcx^M=~w ?}s?7?c W;,=_/d -=͏ ==9'O î`Ttޥߖih;V/On [xex(^ nE8+ -8iaF.]1}!@CLZzn?PݯNPFC8&9%*z@VP( c! u^Fُ=wRXj-zLaJm…Z2vף~=٣탔~ -Tn;>9) 99WdI$9AP~x c@|,8^3X ӂ_=Oŀ*O2X8!_OTn'IܐքX[ӏxw?gvjg&9E%4a6eu;O4NJ%n$i-zL׌r`x…ușųnJ ;F_v{ _$yfJO$qS8A‡"~&SÄ.M2᭤o3Vwϙ ב Iq0$1da?v"֊W50XcA$ ǑnG>/ SD[L0~? .}& /~'N"GA9'B>H_(%XCeyۍk} #ۨFi UB{) 9e 23_RY Kr~s"ہm _FΧ`#Hs#%簍HCN,UنkWT{ Y,(ܜP$7 B H —bN0qº V)h@RIyZZ~F fϑkEȟi:WS  mm{(WvhAO}h_BjjWBv#|7W;Zg` ^}G݂A&_@›H[o -a$}~O6%| pgV~z#vk39+ /"wICmgSW SO!j fB/4^`?ڷ_zsZ X48ͤ5Wh\^y[`*WhD6Ј [6H1J݋!Ce+lF;=6~]4 -_Erp .a^-B><! \4?EM 8 &8gquߤ=Z)j>.!N=g)'UnxFy ʳ#D[iQMJupsoS{ K%Ym.$Cu} V$#K?;l?/VM֧=ջ*t9 9YMa>C4#  ER*-O,gvD.%Ik"}"I3LghIA&J, )lfv b}ޗtuH bY"HBSH1H":HLT4t1+JC !yJјR4{}S}޿~o?g^{{"Nǫ!+a!q~FjI趹*$A$-pa]e%DNlsӐi `U`*P:i#<Oc)^l/'*1u'*0^(K -I<%49#@+7-AT~_50B-W 8 N("=gJ@JS:_gI6"P2 C R^=k8!7z)c@xCBR@\=~t80^/d2g>8cPhl= -8P78yq蠋|+C6 B*ҵkNHDwBpC+MPg '@50000 P7vZˡ ~ EyN#zP l -8`s -Z-E-?8/z(zSYh&_&7z)ǀN=hvs4|[OTv܁:k5q(\LXCERľAY8 -v^?lpd+`oXBu]x;g`e K$C4鰐gD]B8ݳ(&U kߓf ;Vh -$_? ƋJgC&&mk!4:_o`WHN챣n/ppf/q?0^ y -<=^O(Ew - yƶڒѯ[wdN詏|} h#!g+"lFi|z'p j7 x#!y?>4oڪUm!eEg*ٍc5">p*;HF9, -&\.kT+T̙K]xFQ:a$8:ElKbhafٙ拯/B+n"퇌BDk|(]ɞ/- #!_ 4OI(Yt 4ۭ={&YO_Kw8'Ig7ii3%Ls~ vM;F$>ZB 4y/FSP 1 #d9Ǡ}*`^fmD4NExGo8LEiڭcZB((8@ ca1>hC'8Fg [ԍ1hx2ٯO!x:՞mѻB9gu*@[ | BXXC\:}4W]9>fa7[2rgw*-'W1 -6R=u35H?j#m._s=38h.k$ͽ ")Lا2D+~.m_d.ku31r5J/j=-Eh<]mu?mށ v^G$H^C[g[&? -u2®JSqEԏP'oc h3~104vYT63-ufÌ 3G; ofD-'ZYj|쉁=)MTT:$͌;Nbw| uAUEl"v!DvX/=~G\ yI(nEh5EqB+k9YCD]cǢ4{Z UđߚP, 7u?ͨA *x2]:h#ϷտEҌ$9<wb4Qm19Eu7Ku;Vi+Cg|kv߁?9"8!SP;MK}ӀtNڹnJ.271TA$_1F pNz-h3 <`BߦgKxATWN}z5O*ky>$l9^2 sI娽w#۔DO'^D)ї]&Gu_5ҩODh`̨jx"a0vha<ߋy.蟉WcoE(;l`A(p[h{VQ%$[#~;zZޘjNLU,J  AG~$\C]D8D_ḿLgߪiZG'q7GV),q^U_2T7:im3IQ0Ӧ\+EWϱK|>@X=̊q5x)7"3S;Z5SP4 o+-Ǡ=ޯx[V$ki 8eBܹoJ@r muGXHt1lnUZ5$Pk :#`ݠ`Uǐ -It=#Qɷ"DCf$uа8mZI|Q::{A&(ʠ\@s@]ӷ5N۟v 2KwC8<+|{>2G%VP -p/>Ir$aΊ5'?R-^`3lSA~?uJD-`|!N!8w-϶U 揶' ~o鈎tl$lTz+o8@k/x-[gZ.E8X =PS>#? r mB{$q21`WwLB]ߖZy90Cay 6Q,gE -D=O-I,zWz-[< 3Z:B[}OY7Bp'fN17W+cK+hXXUc,5fѬcXKcX|}a6[Ⱦb^KfaӼ_vFZ;1zVW/nYź0% Z:Kɫk_¬@XzKo۱_oVPjFJ|YkbYJI`X2fy,el#c?S"gcR- F++k߄*f\W۷JE}JV\sp]eLSWމJ.\sq]e߃j^%kߧ~Rq]i?kG\W~HIVV+#kg\Wُ~LIЗa?y8z~L噓gNY9Ya/g-r#-\&g]-stWK]-]rtҕZ2 -x,jqTKŻcQʢ.,wYˢ.n,7Ew]sYteE*m@)@U*jV<j>`elZ_M츚lo[e[[-6Vno]Ԟ(툢E좎chuhhlj֮).<uW`^) Kkdg9F62$h4qQg]9uE]pQ]%uPHbuݯ$i.֮]mfh3ei(lmsr\VB[a%uzmԶ(Q/FkHJZ_E\ -k˕Jk۴mj}F[ЦoثL}Uj YEc;n&ըnZ| -*EqQ.-(-}D5|ZP1@w$CUy\N4pns7F'nJ&+p6YIVz[^+Z<>O3L> bs -W|#>~ďS,ȯJm~E- f-EkFEW)DO C01RqC(&bX|"f\1_|./Vk"b8 yqY䋛ⶸ/gdRiȒSzIYNVUeuYS֖'d Ბl&(rZ ͐axF9g0j1ŒFmNFe5%lഴ+1k2s5uy]5A< C8f?bD>|2stfǬ8Fσ?c%|>"V/K'Jő/k|%_ɼ*k7 ,7r||'{^Vd~U1V'Y~a~+_Yu-VwX-~cQ3W Ƣ1+,PDHVO-SDh$ZV1,XĊX":,Tt]X]tg śM&z,\$!RD -k$Kc k"2Dk*F-FHx5o"Sd(1^gbZIbk%)5}لňbk#f,V|*>eml1s֞h:b(X,"Kd.EUdl'VX-VbX^FCbzb7%-qHbgGX_qB`j^f 8%q%kK7 "n['xRS / 6P"&lK;,ݥ;"K,]PYZf,Æɲ,.+ -m'YMVc#e Y#kZl#2@12P)]Y_gޗa2} #d'ʦ,SFHl![>}e_6A&$6Qf 6}6}:6;TCB4CM7 Q}l2JkkQ}jT0*YF -mT7όFM67\Q3`6hh4d FF#hQF[d6ZF[-htdYFW+[bnΖ=Kч}e$kя}cl1a -`Os/w{]E^~Oį?6$j:|h':8C}E/D.cRbQDM{ŏ?'qA\@<?M -YL7D;"ˁSTo S a7܍FiQިdT5AFn41-6F{xxˈ7Al ͆!q4K kI+;;򒁼TyyRIRKK^C^F^*䃼TyRyd$_d -H*!TFllS٦Mud65mj!FlllSy yy y>@0@@(@C0pF 4Eh<<y@@4@KVb "Eh<y@GNjPuFDwA,wE,!~!~#~_G@̾}11 1b7bb/b618MD&!N)~T@itt0t4q:ux!1?Bſ|=ķ|?<Q٨fFha2bFH0RCTQIx A<6@<6DpQ\TEwQEѿ>iQ@]_fL) -j7jn̡)a,ΆjKVj(5H.@΃]W^ !v6U} \AZOd'K{gd=ucʿ !Nۆ~uQH;p O _vgfe:b&<-nkYV(Vf;Ir9㥛̆M x㻴105}X2ߔsVyE;K,<{yJ^󃂬2ng&_5V&Ny`mnM 8r.Kkݺvn:!J:=i/m4hठN_⸕~}jbƐaCRW>$#~xQYyiR%:<~PzNQ͝ - r:8뿩~6t~:ǭ_ӝK;vTYYqpTjz][VnٵCD jаUV-UwV5{O{59cDjb3mL[ nZ娒Vwwh*Mhg^[YcT{1/M^P̒uXs乛ۯ>哫5V1svHͳ [ۂn?On^:?ܸQ|z?:Kݲg;ߩXf7|ǟJ><ء ~wnŏD. Wg?=֫Œ}}<}wp`ֽk^Gs-w{y [64 񗙶b#YA{5^3;hJp'CZ7>fͶC>N<;ӥU۝#^_;t] g T;:dj9!%fk >03$8|X=0(bլ T"ҡSͦs:c&49r?k 9_h,MV _*,>^a -c^^w.±\u8ؠo*<+$~go's}Q+wzc]s+{˯TzL곇 ,唦̫t҆ -uϧD*lnrO 6 ?Q+ɢ^-OJ5`Dl jR?$Ygs܇>}9WZZ[V/w_S.!J}Vv>&#KYz;Ň?]}ZO_3:s}&OZml؏bFƷ)gtԝBs^7}Vc.?փj9|}.th3xᩝ:~ξ߶sQԶsU(qmE t|NeMN}y'&_h#v`u̩a'+Di؜+ <>a -}\_Hl5-ƑӖ7 qvR_rF;(]'8(4<l %nHbg݄ )uÓ'%&9CBS3c&ce1ncDD J1E%"W$QtmWqPKd;t+{y9s;wC'0L_Hez$ӃPE`P4I-gE~.po/-ո GL9:r:䆣0fߠ9AzrEںB𙳱3)E9+y76=:)F{8&akpUijL+Th.:3ߝk}4|EO6N)^`8/̥{/'d*w9cd75/~evq>(wl_v}rA ftzQ\śG T1(4п vdi#I9*.u-Owk˻1Ip #3jᥞ@=3.sFz,/v]vι=9M6r.I֔H/DOUf,:+x?yZػ4a2y H\rౙhlc*s ޜ".72>6N;\ -zwXGFN4ŵKn5W+dcxY#o)V"0532mvLOA6zY@D$$[SF_~! -@6HwqRj& [U-rOznvfnٗf=7TE1}TM"`?g `ھs2qo=qNW⸝䁽."-TT` B,Yi>e H45p䦉#M# V lb5﯈0MJ{77=5&^a2C -Uȡ_%#FD_T3έ6"ed>^>lޛ -AͿIA{$†]odisg!kGQ5)1ʎ6Mp+"1"%).^Amē_ئB9=9axy4RǜGs݄OEEPBt>b[3/w$3]LY2;rFr>>o\XlewXDz!t&Q44p娞Q  di)q{PWqO^7+e8EKԔu}t%6);U6a.9 E\js+C!S^ b@g:\j_$Eec!n뮩Wi\\e*&/a -3 ~]6~*܂.2PY;3%}= -gi LL㥷Ouw(ĹYy o'2/A#'Y/r2&τ`/^w޽zz0>Z'Eh^mck?R~G1k)s+NX9la!3!+nqq9KI#Ig?<ͱ >6zRl ('?Ďn$/dDQ6L}P%Sr  f*ˁ\A@$!$" zə^oO"Ser>${2F -tiXmh@GNB-)Ϗދ(Nǁf8>0exއe܅*)ԃȴq aϷ_SQ\e_gcEVnO{6iS<e֫7@ ǜEOׄ~yvk^{dΌnYaW7\XJ(p$tErVxIs<.M > endobj 314 0 obj [278 0 0 0 0 0 0 0 0 0 0 0 278 333 0 0 0 556 556 556 0 0 0 0 0 0 0 0 0 584 0 0 0 0 0 722 0 0 611 778 722 0 0 0 0 0 722 778 0 0 722 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 0 0 222 0 0 556 0 0 333 0 0 556] endobj 311 0 obj [322 0 R] endobj 312 0 obj <>stream -x]j0 ~ -Cq]C`kn,8(!o? L`-}11.ae0I8oޕ&*-p- ƠK . xT ^~gj[p8ʠofF;uNt0-"K_E64j*gV!N 2OUP{,yJCT>? Io+ -endstream endobj 322 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 325 0 obj [0[778]3[250]11[333 333 500]15[250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570]36[722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722]68[500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444]131[400]177[500]] endobj 326 0 obj <>stream -x xh#ɲ$˶$K$o'5&'6`C,&@RRliB ayB!'!ۍ.4)]K(.l{8Iyܯv3^I#. 5u97r1a@+s[V/X|_/܎e|s;jW_ +uv\Z8(dlm&SHzߕX"u4q +nj|b >ۗ_?}ۢ'wt6pO|@UFo4pgyag߷•E1sE6*A.KB/Y9v^@ u{nr߾) $X:OTΑ? DKԘzԴ Jl<7v [EVu9Om085ϋVA)p9#}|vڏ[rNQz>SPifr 'QخbG#=hU$4`9~&X?:m~"mE#@Su+?!H!"4 UBf&t,,c7C!eafy aaԌfm݋}ͰӅ.X-!Q凘o|X(}h Oƹ8͎۵bZfvǧ0]0kcwPrxc8rLw `0{PvNw ?2 tSD]7 `0 `0 `0=鎁`0>S㸯h^h4h 4+5Cc_\ԥuYLkʾטe||W2f_q|"C3?R -B=5)NjDiwr˽7Lw `$J19Ka.* NtGS5F#0Q5BU!X@BU;j::j7j&dfQ͆L,TU?d5>?j.A5oPABC A>j -PP+C¨TˠHy΀bC) (Spj%DPVC9L@J0lBըTFy0 jFm9ʟ jQs^9TτFyЄͨCr\ԅptE0 j Pφpn@EK\ԷPσPϧQ}Ѝ=˨.%+WyVyT/QWRըoG] Pr Q_"@ ?Ũ% -`5FZpgB_N -Xz% ~.V^~.A6nCpr6egP?O p9p*|>z*s`F6C7fp [-/A2Wz;* 7Eu+ܬ쇻 nש[P/n/+6v+R -<w> w>BQ[y~p<naǼ `~AoCOèO1xu|u']< D ~38PF_Q.Ȩ߃Q -~F!<,<#?1؉S؅՟/`F A9<<8_R*n >>ԟËԗ/ó1~ ᧨){wU`/ks ᗨoPD}F} /C0˨WP߅(??~`=ߢ ~wxU1px C=GG1ήwMk5~]5/L5 >CA -SA%>&5(DFSiD^ԣi5hԊw45j*V'*Z$jR%2FdFjO]!}C`0 #)lȘB.™Wt+VKW:AGW8E뫩f1{0WotMw `$S)CX_YJKW*NX_iu"DW:ň__ҩZ_2eF]œ0R7eLw `$S%ۈ*HWjLUj\$MVӿ!l@:Q#Qg4zެ'FъZQn*Ne$4ɷS -"52eF&ҝ(N;xKt`0 FR&^?H>™+^g+Ɉ+No0X GW"Y_u}%?I'wa/;`0W)Ěc:ht`i1 F`04:A2 &\_!1Mi̤DSʧ -[1N#jZ9`0Ia3GbϳZƅ֨ h d6Vo6L&dJ: k j ++WZ2\Rw!IGSioϛ H -[_1GHgiZZ\$M91%Ik,Y&%bIb0 z@WVO+`prb$c+])"8B`0Ia̘B\evh8tۨ5Zh&^Vj,6hVn5YVdMB2hMZѤ&A' V1侇ʧ -YH$ޖ0RDpMw `$f0c -T:@L2 :h@sL--fu8f͝:,4{=-1 -ʠQg:n1[,Fb:+ R:9,a$a+])"x*;`0~31d8Jۨ,kEz=c9v[Soq3N[C9<GbdLz$-K2KѠifsjwL>T>U`+F&k۩CU3!0 V)u(p&'QI D4@tӑr Ns;mt&Flf(tclX0$dI"ޅ`$a뫴0RDNw `$erߥb0>CFb}CWVN`0؉3JOsg>WFeKw9}.WbfY jYL5]R.dW|kIĭyl}5u `0Ia+;/ t: hΨ'0W=n2ٳAO3\'1!9$ݡ7Y![͖jr#`O}H$WΓ0RD;oC`0 #)o0P 3$f f1L?tßYwd;3C(i7;F˘Ls:9=-;͑Zh#8 {01[2N]Pt`0 FRRDH I?shrN`9{=AOП5%9(4w2Z\Ơv,.?ݙjr#ʧ -/10f(N;4%`0Ia1DVdřVLV=J`Пow˂L0 33%w1f33vk;rYdsqޅ`$a_܅"Ȋ`0˜B*ׅleTl06c -lOre,-r9lY OjwO*d]ػdLV])\7!0 7YSHbX>Y`[ v: BbgVq~u8XaMM(%˗HJvT2voVaf+cr#45/xrFhk6Nw `$%;Zh Z 9`Ms&HO#^eeeŅ3fd(+Q8,kJff;sr{enNnnvFz NvJA1rRaF&qk^ᩋClt`0 FR&]*SivwL;n#o;L*++#%55Yy"5%*CʊyQr ~w^]][XrV VaGK'!hɩCvt`0 FRRH·L 33L34Aff)]={vUy]_]R5{vىQB%%gf$TR, ) s ܅"F2]OY·;`0~31􎵂ř^o 8Ό īa̹94lm(ИWR-h//)// zKK -R -"UQRT"F&qk;6!0 )dų Lr%ߝIZ[[g/ȏ7ߺ`jYښ%R]T]Wg.TW#gF"E)*(|ػ$L9uQvV<;!0 EHX&p 0= -*Q֘!r!m8ĸ3*jMgWa{A=kq_(>a=~ -&8wA FX$͞Hw̬lD07/0.*.)-;#R>zfͬ_rljnz漶 v,Zut,9ԎSslT\u\?ш63{Vꪊ3JK¡‚` fgez2.g#nJhDFx-}X^_Lhm-&@?VWaUˉ>1_uEρ= |_칦o[77z|iм ~?v5V5b\9r٪&nĠo 4ހYbhw6׌ 0XF94bBnsXǢ&S\  441-݌o57R4>|Ә1l6ŜWr+oͮ>R۶V?ў-}- upk=1Zܤ ٫ 45.X5,/gdDw(!7<̑4^|Ũ;sR\4"YvlId3+'h\#ˑg -a$ܧj"+axy5!=GduL7,Րz?Εixk5\= YrLj~4 c9Eb\Q\to`Pa:Ԕ|Xa!6;^2 pO#-G[g-x&>11oEJ7qҼ2h[<ܗ8m]'m\-xDO gR6T_COcZJZZbR_k\{~Ɣ#MuK XuBۺ Ohk+pK27? - !_l;);oZnXCH~HsI wu<75{/%%)Ag̋ɳ# -0D[Uq@ģu,uC>/zժ72vgdLe-y-Ch=Fբ񨈰^T* ;paF*Kh*FhٍwA>x=䆆D: GUx8|駽F J"G2'| #‡RnMhbD%ЁCLq4.ރMh"\ loE   WQ 0uZ9$֨@{KZHCCZv بRop7x1Fq 7!HǶ=fp`pFJFݏg IFMxN!»xߥ[h^u󄛠 ǃ*^Ŝ$wazwyxOZƖѧT˰^̫p+d<;h&X!|N - W$d]Eu`!#ȋv ]2uFOlx"t"Ї -8|#pXJJP|l+^j3Vgime>-hàa  |~a!f75cq^ACӧ ihi4^mNը7/A݆Cau Ieu/-o>AZv\8K7rxuQ̜`4KA_ w$  x(ah>}8. {~$Iu}4Ej/ȁ*KG\z/4JQ.%/F[G*5xO2i2Έ,[qȭ8VhuwM.yN<)?P_$`; Q凉R:N},AD6o)yQ.Y+ʨt3I6hwʫm1[rh0YDfF>Ӈ>o}LLL=>Sݹw}WV<5aʚa㕉;WnsIˡZ s1ɔ11ɐ/.n'+^̍$5ʡl':>CL>0y_ L#ܟaa?ܛP@ycuT|ܷj\V(o! {D` -bP3^~It_٨JCx*~7 -X.h{w ,n#A>+>;hVO,B2JVO[_ǯin%IOny1V5,Ztv {sFi6!NYHĝwnSp#u'Ɓ D7Rn.6# H:Ehc͏1;^ O#+Nw +b7^Z󍬿,~b^߲Hڿ2vY`eSl}72I@t7wutGW6ssM= 6W_|¶nVOl3lkş|1i^@u1d[ 7pm#"44QޠgKӐ. ҧ,jNp!3b&4T\_\O)MDY~ND@lt5n/Eo?֮xp3mGHAO@kcq_nioovn$~̻= o0&5ӉA^k /A:^8kD{/->X,T%" 0c. oT9tI 4f^= hFz`x=Ɓ2⍗. al o4$j2ɯ+E;k!`u0n r 8{g< 7^gB>'gmֿƙ`;or-_p^%Uހ n5<ᢐV,)+6 -[93X\@ُ#l`'Xw(+OA/[d™;> qZ -XpZ(@z }8[|XբQx])C9[Ó -*F0U]([ܷgYy -&<.y#Kࣨ﹵N$hHeōEMQ": ([pOg)OqA}N3̌;: {Sɭ[շn{sO/%v\_-Jl&o[m8\]k1RGiYI~X! 89|]ǝ™!YraJr$+Tq2\C^8p>8]LoRyw/Kr<|H>F{ N) $q+|NA -pe7iNfrۅ{K+2 A${{-ɂ'`܋%!zMUy?#؄ܱ :t!Wn<OLCa4 a< OVoQR/>D_GQ.ȕrmܓa>( 7'S?Y=w%p .>-qm#M>H$ W7&bXfxpj -Sr'z3p{~Pn/I);|汾s$7'H:E=ρ%-sW.<Ed1h)jq% -yF!㚼-KH(Sy٫2-a6a51<=Dh9m#pEe44z9Mwɜ+\;ww>~f~$??+)tӄ˅]/>(R R4ҳ+q_@DJi7u{>ϟ %n5s/mCWaC%|Mޢ~gÇu,P #,A9_Pnߢ5KG)DX:N?X:g'd3}`QOfAJwM~ >.{n#Gɟȉ>xkM.hI/N0*Vo ǐ -c_w("{%hʾwrmB8Mќ26F^\xB' h -jCS%/s.e{ |[ -guO6 WAd̄ɤ _I -Eɷ"S7$.ُE->"sY q w++^A zSVX$v FDchߓ^!u-2O3J1c5ti?X݂:gYNAAxpd+\A -I) ߏ#ȳP2G&W 2R diH&$Q-t F@IYnL :{  -Ucd -](G\0Fl#`MbdpQ?A#dAD(1P(@"iE(us:A G O' -)*4=RMʧ}1ro/M/*l b@O΄gTHBM{ȺFwARH|1+TH ='h[_2DMPE}Ox(S397&+I9;Fnv*C:N5UWmm'T$cg1{pM2j䴚uڴiSa߂_~zΩ:.8ܱim+ӵMc˸2z45@uvg- DB-ݰT9V<*$t*gl`76_z0t/,4lh?=n6ᲺaĪVGf}oI Pj'NjH}h;ZϪ;ڋ[_3Z`ݵF7𒉽ǎfbsRQl{)HuZ:,]VQn&oH'i (mtb]*{Bd8|hU;*Ğ |u}U|L;Q_1XM&Ǡ[{ho/j0?B˟dtZ7JH"b!Rqf7|kyI]NN47&83CWr=gk=->:f&}&oswZ~ov9L>M6yMym~⽝enUymkƾ9o=Ûzv)x.#׹0w%}NƩū,{_Oo[cvM&[J3 UWe/u{G&A M٦luɠ\M]qb }`vu[j_s/anE[{}5f< UPIlJ=Jmstr6ID4U Wt`I稫g-QffW&܋++ڛ'߳c>B.gν{#J,CFoTo‡K|E054s6&Ŝm7ki-Q n:4Zܖ/ҐN`3j ͖FTĭsY4 k#oQO'UԮAZT}WO6@~!RAK#H!"|ivA_fO&/iZf}roKfj -zDQG<(R! |"O1hC>qC57'Ml ʦeQC)oAltj1$n9ndH!ƑCʛڼ܉[#ÛkKM{XZ%CF\6npemMJS$tƬג>Sm ita2]h""+X9Q/ӛF́4G_ʅs$ >`rȄ+F\W e5O^d$۔a-WܹpLGa~D?#/go6F>)" %}w=5+x2#QvȱXi T3[͞>0?? 1} N3/i/ ¦)OFn;j;-_mg:`AM4="Ҧ\2؏|HXòQ'l(էEbL_⑼W%,]Hih{9#j4^Kd6zl U14Un*EXf0WW_O'`:Q(j4QI6&@cI8PtfֳNa;Q8^;#xj;Z34. -Sj-TFb*Mޤ3tS{^NXɒ$ mL)pxfBM Sb&񺱗i5g|],TCsXdvGnwrвprXEWoP;*j|"ގk֌"ֵڷz8\17bw3GT|eU=W~uD[(ӤyfvGqbcZGܔ:Ʉ7>,qyVNF)!:&R|'YIw"} |18gsZSp]h3$b1΢Q~{u(a |Xx2je8=aW8|F/p\0G ForrSwE F]A7Lc$cb4cEwY0! {d -Z ` |&:<ӅQi45eٖЩnsNXY17jJh28BSv~֤=iӒKdflFaE2pje"&4)nܙü'OxI>jV]\Dݰ*͹{@g:\/۞lgz [zL#jdXg'$t~YVcyASu0y`*;llt#azOtw^.<o&n /=y5#}HJZˆf_n-BFtatD/,}J?&ަ&6N'퍕1.FTF@!#A*LTLgflk{e7ܔ{?{alcK2^2t[$xCk|֏r77U4[tO0yWPb&ToRᩤ7::h)L&0b53' TVM:t&3:{LW|O|Oy0%Ϡ'Y2MkktzZ7HV5l)WpCؖ+|s.s̀59Q:B=!v -Ʃ"ip\ C+pFx*2AG} v4rx Wrb ʃ_1^9nc%2ʾcO1!qK2 .'a`/.iW&Tm|tP$ZC}/n+܍YzK<1ĝ5-\ -p=XyH>cuQ+va7Z}~|s}gP8~s_]p3f t\ό|M7oO%sC{C%6tk@Y0}5PҍDb h(ؽܿ3gL13=/>߅2.5 ' -B'<{쳢U)c1H=#`go`AȶM]UѯI^+J&}l6ϊ -Ǡ\?ʷu5's[wx v j$ -Uꃊl7])/GV+#ϙ#f -%J$6XA' zH)TԻm=(#V9!a9L.NMH[NJYbXjMHfADJ# IY&^gueXN"PFB_U|~|Y|ShD\P\;;kQ?]rWSJdMIMi?07*;Ur?l#uXA4zEN%R+䢤"TU]JbLp!Vtz !DQ&ʭ_M4cIF -Vt~ Xљv7rX@%6I$ْff,G^AĔ'&bw$J{HPZ*&P橕UߔxYQTw4l\^*OQ`wdINwj[Ƙ7=;7vjk Жk_ߗ9bP?nȉr7\$t7F%vі vuק\gM}ÈUM{4_"}E\wzCmAw,xV'ak tsmsKlKmψ[u1;re4I9Q=*'hWI&yNeI~bq$Qğvy\^ŋXRǠ5?6 Gkx/s).SlWa, -`"F8ss$(dջ[鴿=)_3ɲ#zf6_92 p7ϮMZ纏&/ 6B/-+Ң-@{T5}zJU֥y>v~9Gİusjڰ[oxеfCvZ `)V>?Z)HMtA) -z%9˲`Rá`$3q.r'.7< -ouq TLՉU+&lJۥ#he;RMj{rV&cӒ%&LwunWS"VsCМc\.{ֵmR9M3=Ng/9Yiɮ !]`cM"4߹d\>iֲP45hEr#'P0Dtf:c切 -fB-ÂVR00+wʊ:-Fv#FcQҕW - yYMjYTƂ OɧA>3:¼41 p>2Ϛ+`)q<;7A0 ɛr_>_vm߄7n`px`5.'Uc1(;5xȜyj`]2OE'T{ufAxޠPDwcMsR -*`qUc\4x`%c(A:7$K$BAKPPRT Kuj$ -6*%\JtWJKJ^بIi[h˰k -g-}z;Uǵojη g -mC ;u9[ވ ݗ|#9ОՈXf\ .V2ם?A~lַ w[c=T}zOnϡάI>?|5jy -REvE CA(40̨}; K4AawUP"WVWy Āg[miHm!93YĶ9g&198/`T#񟨜Ґ:hK ـܟ Cy sDYa׾74ݠ2Ѿ_tkEq?m=Ͽq߅fCW 'ww'|cu3+΀;$}5 TW&R>42 vbkm77n,w<~EU`E -Mӕ|^p{\4LtLRPMx/hXDt*7_|xৠZP .{;V#( -h@097uu&$5HS@}9wE@]"mo~dҬRPU@msrͱyͰ-Z[|uQc^W7@y :JI`$jKZ>?] GW4%/kMqyP)kd"9s@墒d27m潫J#G̿-,&|6:( vP&$>Jl8p7"bCb?,mvIFL4!{ط P/OjrW@ny]{TI(&{֋zh`j*3 ݜ_:rk?@ee]N33 櫣E%1:ŒRևևoǶ ?4052y=Lv,IN1NY{hCv4,BOP(uvbX. tCXg9 )r9I 2跾k؆ݚ}EhuYRwO)y?Ǐx]AZ٭ZV\!*Qp4 aDGIkCnF  &kZE[@„U&0䶅ƍϹI}QYpl8|S3߉UqW]فel{U_RlKV҄45}.>g/N]OPfB0mAfM6  qJ8*S'>,CB;ѕlW߱//>縅␯X4p2Q0kcHc:z%t'߉w>%0_5# 0<7-dt uSm&9M ;`.#XiQ@TIRxߖA;] Nkbzx-F4#g"JlX2q)Wٮ7noOo_lGZlɭVol4ɜDU1?ÿmzoXU_iuqIR[+o;Ģ߿8_ D޽nfNTn\> =4% \_.8CMUMAtGaԷ\$ Ya\B 8GfY\4%!_(8 @ - Mb-rFHmg8冸ED!~37Aot8sBHjNJ&%h$I{OFkDGMO\~5;'=KWٿMo^s Rb,֢)L3> g$q 8gM -q ǽE;`30$E}CRGSF`h,!Ŗ>ݎH#NീV&cB\wr, gRByp9?BA-  -ps:=MʤSzE}YN|aÇ0JeO ^A0t^>Yeߏc~ؽ"ma*懄POܣvfSDklαh2X?d~hyIS#-"K%eaXpR*_wt]6V1(k{Pn[FN,[Ewhy//|)eE/]EIg 9AO㳹kru-oM0gYL:헷WCQwhx؟v7Znž~Y8 -R,c3FQ` S݂o& BNb]ag4?Ia@Ԗ)TCڀlV(6פ!z;K?r?$2TqĪ; >=$Ix2X͇ c^v]kk!(Upk}3;2gJw`y~CtC&eGK諱ÅՓSXƒWLE-BGUS@19a?'ARIjOlǰa.t+]i`ڄ0H'i=G(6%a4%S//G݂%`Jj;HS$e8g:N5NIJ@@s(#)z tnzԠe󌟮:&pWA龦Z){kЕ8ZI ̣誙l7;xVPS^\v7^HKyq'ox5|OSeV:6>%q}:nwb0 䈅̒$| l϶`>E,(q4ekB&t!,>~O*"32/e,˒y||UpW):w0^OU~3DUYY&oN!n'Da1_40#0"!.19KdùDK@ʱ,1IqTnwq~uܮZLxn>CI^df[S}þ>0 NJWRbH##*$oZKuLfKT4Nyr7{R51osߔyGm~ySeSK"D2/75sSxH߬Gv]~(M%C ^Ô QܮN/ygя+.8X_3νR؇tssɇO I`K#om3`CW;{S=cV7CE^עk?T@{[MYIΦ{_.b_qnqSNJV|ŏ'6tBCȫINVAry'|iAr$<. ^^TfcXMQpNM%˹cU1;,98ʊY%[hpS S,Uf˫Cv8fa UFҏKg(P:Abv*JƓF`TCƥF׽iV=/=1rjD~ S("s?H0QbOqFuZq$EU=&w -/ aID98#D ] #*Pt -#2=R+,u%+<bl.V ='&s+~Uu)@(1R]8Κ;Yc#-\IƮ{+vq^^N g:cdjfc$nδ  :bɽGHI,+LmTG֣==#/nVdxU& ܪ%a -Ǣ){$HKkeND7-Krllov&!8[UBZ+zĭ}Ywnxu坂*m&`839FcBՆCA\j<\Yy؇C=h7qj1zg&ŖݑţS+l%Ax-+uuȘ :~s0rX|=Ā׍8v 88pܐsq'ei=UԞY¿uCxzSrI;BsxzO ka3{|Tsנ&HyDKh.ZIj'H+ѳb; ڗ-x+s-& B]]Gn7^K-ŹNJGX2U|%"Y>g!'뢾BOx8%Rٛc ~3 ¹68C4 u!-א2.Wxӫ/$w;DќB ɧBUtȜMJqIp+g1;Hb;l$g ´l@ J2Ja{XU(af:v8ޘ+}̷3|pֱӉU-ЭVZVZQ 5;Эy{D9#aI\| x|q#¦C-hw<.~$XD1aY2pE`7ǿ%XUgp"ίox&U\SDg`1ո"TV/S`rq6afĘ  d -_fh*Λ_@7A`5H쁦I{/9nG~lUPa, -@vʂ?X"iA=chҭIP4:5OvWj|^U(5NĠ -j;2@Rm8N̔?<(v,&A#$4o|rI? FQVҊ|A\Aꂦw?;JiR[=ы?vx`9}>7E 44>A+G.MYBNk {_6gH*`} xG] 16Y=~pȲ/}02th0M<# an~5ti6uV|j̞1=iBi{ -{*d_rB?ΑJu z=zyk -NJ[!6az5W~,0kSTsffݍ0Tl2SY1d Q$JQx %XB΢fTE3]/K edzxv\h.k^̉#Y(#'۲^~|!k)' ݲ=*+ɋOȚha(2 i0_zU|<[Iwȇp"o*.Wl֟i$зUossk_cu{GV.3__2[V]M Eo\+׻iKuV=xuݱEl::pKm5wck?pNxi~gć,fj">>&N$.傎q.h&m,ɚ\{: qQ:dD:s*1糢O1n,bJ`xjlJխ,վ: =d -6r6B6P*,Dq:Hy\@?d?(~gZ: 8neRIb'@II' tkWOI!v~)QK8VJstSIP-i' Czz -4R]@mU-o⡪TU]}vx@% $1O2GQ%YgӨZɢS48w%ҩfr`vWߙL[mWx \ hږ27E}J$ʓ@R4^ٰ dsa!ɸ.dL -8D󡗵 :K{Lb -\NAչJ)Jip -?^;C;"(*G[YW\@#F52ȮވAT#ȱ)<TbRKӾ#Ǐ;qACKcǂǏnGc83瑋lr~ -tP6B^:oisc-v'0\?ʯj퟿XD=/31;~PP v~:X }; {(Ϝ NLڞ <ߍ#)*"H S. YܸY3EEkZf!?$Zt>ػ"ZC-wi9µ@wʲ*3rY8JH#wbz"2Q V0א\1ues)ΝtiO&6 PZ2ʜ'6Qq7| #ad23/c)EP6*H^L&(,)vGV{Pc'Lг h۪UMjb4ū֢ҊD 11T?p #]oyQĥe~&LXfXqh!EhAS|9Djۓa؃IeɸLrT?blӋ>D34ǰ-k-jKZڹ)~^_#s2@Xa*#{%Ex<Ҷym+W_k}9TA'EcpXr|6=SٺC:~f8"TopG/i`$y] 5 / VJ~P~BqA7ʆɃCI6i -ISO{< ީLdVDۢ<+Vw-٥Q[ -@j)22q̰3V;?(loSCۅ/gU6ˠcPi. d)v!\J݁bc_y`:].K^͑^qF)Td)7O]u?pz:*}.o[Gj05v&A}a=ΊdȰ<hVq2.ㅦ.2;.!T%TJq^vW[eWQC腭U*jrbíq]y{210n7ퟙ!3*ij ᨡy҈,FCt2L%ʃ)) gR019ҟ6fƅ!ۂۢےʹa``j[kc nx0'+'{h8wqb)O?l>5U3Xs.W]X>47\0`"Z-Z7.->FB 8Z@^v7rՀ(6Cȳjxn)ISRE]" -e.4{94B*'q*U2d'SJ!ҡEUćD,NL9TPy:yԧ"XcHH%)sQ<5š3ťSO} `b0`ض-9Xviŵ[U?X1?Q\MNTMlSst<$N݌ .>uML - ytvM=krK^X /;~dL_,L,.[?==ں ,XHDb!)'=֍ٳd!jt%]1)%w@%_>565ez)iK!H~9T(QT> FxVP%WKIlղ{Q^GD T*D#6! } cJ`ebiS Gs+Ќu^?wNDz+& 4ɣG#hMgDX:A>s|_ Vs[/`LY:o9f戄K}س3,Ӣ-Yoqޙ9_9z Ă(X ÷ |u-Q5sZ)(*RN&MAy]H*Jmץc7~$;R}.ng*Q1&&wu tݝ\@ Q| 'w4L}9|.zx+ @Y -c*qWLF#;rgsrrr愜[H 2+= :x6PqdbDXDIhy0aQrxuoQŀp y3)"?D˄"Q=[!5䄬&BM{'JI]N! ]@ dGƣ$h4*7FG5LpALi:E<npG!Ww 9#=.gu1[e @Ĝ@ҠgU8=7@"hbt}<y[;Sdd6n%N1ꯝ84I.}USiWɎZ9o0*͕o̽ ؓZ_/+j-q*^8syW߃ Y;;BݹSig((4@p^/뻊&ֳҐ)Cz̫<×y^GWŹ琇„Ƞ"#VyqEǏt}t98%_lre,d"8I!헺l\\}]ǟJ6?5x(V#\{7*7ݠ^f?o+p{=CE<^q &CH1n%61^mdPq12Sn -D@@j'N -@:w:?#`Y Ax8M.njuqS#217;b!+Ʊg8>+ ;MivN#0ʇk٥e9rOiAb?};j![:j$B5__)Zg -UT2* - - e+ -Fh,tb B!ܒ,a\N‹bB$|luUf똜M_A 31YJR/,GSXK墺C)tpSx䃉,+zrENZ!{u \;1^*]\>-RӚ -.öT2YrARiƔoLcjW+2vpB' Õ"F4ug]'84dXaffVjeL(=Q龖[: -indnزyD[ۧҧl\ -rdi~B_'.c'ZxSSܔ#G3Sqh&_8þDžǗ3ojNGܮcJ,H(_-T^siYO^2pY#Fc P& \zu +k;^s0#'&U'wձF|2mU̎h_YDOQ؍7-Py6tF5f_8= h~Oa4V9_t.q.t3(b^S_p-}5Geqt6N<9dLGK= `Ow&nF͎u::-{=BՑuسNnQ_ȯfNţz|xڙ6Cp8dw88֐e!Î,T <!*_bBIWzcoI -˒OabVZ*bSdPe Qb)=οF+%(d6in. nr ~)&F溰p|!geN2Lد7UwJ0jh?^OՂg[($-m`rpF\Yr$_4iy yII"5~5f@-F}ۦDr -ѫ1 -r ̙zv;b]6;eW ka>bab֪4JKg.J g/`v%v1ar:ag#v6G3?w7i ^5VY;ݎaM;;uViu(+@VWbmlRwH6V `&6%f@%ȋD^B˒V\̎H4]x#fOf{#xr`|ŋ&[T8vMo$hG$,w(7 '> +>ÔN䗓.<7[.+8!Xč23q-G!-9J?Ayܘ!{IW -@| Er m!?dr8I -Զ)ߘ X7;}˯ho -~}ݫv>Uw_Im}i-|0~ tӈƌX`3O^[еpt}K(!E|iPbŽbca%tSX%m;bE_±wr ([eSe)b_/>r"'83U ?+ýo~@M?=O}8ŏ~OQ[)~jf5EC2MIz]Nǣ n!^N eA1t2B! -ɏ5G;^9fʒil /9 - 5d)mQ QMjRZ*]utf3\|uѵxfUz*[Һ`4>ln -, PyZ8\^>F~þ&YLL?Z[K뤃}ΕrTq*]x=Oyշ . v -Qᵑeрڧ}{+[J/[.SźXfvk3ٵWǧkS׋-?c3Mӿo7Mӿki"?,a x&bQ||'к?~E^xG,u֏}a<4?>h;_Ej~?P"qp|6Pt5j!7м7@(@4@Ȅơ L[(]L}-xPBӺ0d4.V4ᯠi^A_eK[(]D].ҳ*Jϥt5@!@]@WQb_G\1R(#A"vE}谉9T519{TMlA'Q%zVt56Op{L&fQ-C^<+M, ?-hd8" -[Rn&\Mv˯L̡r[7Q6F(o` l7Q6ʟ`&&y#ػsZ4N&21Gl x9T)QpVc271=$=_M FVʉoS'M qCu96nCZ::mbRJ21q8S&:VFǖ41M8C±-51c XRK/)S>Q/" UC B9@mh=s @F[ wC ^4As9حh\o .j`nB)y aG7!φE`7.N  -(*@%n/ꂧmçr_ ׉N֊BmͧyCIkhĻ<%{ -$>j-Yj9ج%%vdjx? '$к$5ެ4aZc~}<Ը.~:[oZ CS rXhи:^㞸\tS@Axb䀔JWB{Җ|VZPmLut./_J'B!viʻ&sot͚R$'F^i|olМОx%yRК0+ MɖkC\XGjՕU9m}d`x`6o`hp`swBkӖ[?I[޳ghsOwE[MҞ- Z&S9t6ÛllsV mWZMEUVkh`#ZK&#k#dPuڲk{zvpg_VHP女rmeosXQ>0mܪlцCM`Іn킭G[bq<7C#]Zoe}o)~Zw>|.pWhD}[Rg׉'\2Iy7PϦ!הdXh -Jz! jz!-}S#DwI Бag3)\po39:[ح=pӹF#Ӻ\K\5xO玽)4ЇtzT71rZ )ODô>O~% tZ~)׭I6fjI6fqZn&sE\ichi-|z5By6؅d:'uG4^Bh=ljLfw#4Ao\lwnFCcmKέd K[rz(#|vvcd!X¬]̀/f݆v;{ {지s@>ˍp[_]Rۀo&&7s7ŗ#gj3s,ya> K/|pv\a# _Cpuc-d'Zv[|@lB8hK⛠%B[ zڤdR Rit7{$`'Lz3)+b_I~Mw=K@G?f38? wk;b2D#hdP-alR5r&BY爐#qpt8t%etUWWUUw_| 7@YRz,J# \B^*J!A4g@|\1; ɗڅG|PH:ԇ-]sZ9 k fm D<ӲAq ǔ{ sCho`@MS.G)tKHSz 7P(pՔJ)sd]&\EA[t$ȍQQQ*DT Ωʎ!=ɔ!/2K2]nBC?Fq4%-3:O18Kp-6]x7~ſ/B1:H0Lӆ)Ctt[uWo !q!A(B`twaA~~z-X^C,rʲq,88exxkݴ+uSzQT)-+X~{TJ_)A)A֞d:U?^j&7*7j'=Ti^#\|Ŷ;mNǥEu;SNT#GJץ]^*DΉ.#}ӽ{{\===zcS.ݑVK-t}nhR9KC”bH*M Ɗ -8e -Чsׂ@ZK_(i7`S LY}eu."!?:_J %c/8HG[et0hBjgieGı.X,G+ -(c; <@vq9&lնUH;V99F )DlIG!hj?QF.@@|oJ=QZ Gc,#4j,Cp؁y]1ϲ>K ^vGgǁ}@/pخGG9n. dIpu\`1qHƨqK#2C:SENL{;)6ʺUtmS)D[1r|^]Zȕ@AsPle y3p~=Iᔡؘoks [!O닡S|2j;!jàw<~e6|cuaQOM=}+3C Z1e1`q$}1Jv XXf,׷y^5ޥqTuW 8<}4pޒh%wsvcq{9n9\g1§暙'9ACG B/qO)YzR_6pSgg|%18:GpVƢ8,M棂$#{SotNIuntdFdk|hl:.gCl=*!F{B3h*O=Hc\C ·"Kbx}+G%Q/QDIXC",сqGl={,x[L%DIFշP2!ִ\H~$<̍x %"(|EyN2xȺzBz9!#2"|V9iuYw#ϱnMԻZ= J77fO!w#p\}##i9 /F>장 JH#{#{ #{^adFWZ8Z| ^*QUe`)٠h zY^?hC@?o;Ǟ#? څX%CJpP *!p0:JB=ЂOKr#%h{#ވ7\Hsf$k_gCdhmC38.F5g d8Z,VE+w=J+,rwY7%syꏠ>Y8x[Qk»`=j·?}&vhh cKW*QZiÈ#zi6*~+Іm;Qh R+`GHSVk3-a 赠`Ka*l5E+xcc=p=,҆ZNY `Pw%i$QEFVMCێ3\7kQ hW `CΥD c9TzacϰTn ɚ~^j"?jiFgeMQihAa>c }I h$Gb5o,*yhÁ"-ϫ|P=C= -a$H_tb),cܒJ[}.iҋepVhEA~ zu X(˅ǍFMGMG;$v9/:k̴y5.Qp~ 4EnxnV`:p<Ӂ;{#$X5&TD[!M/?4ȯ0Wy9C^$JV 9)6 }]Y2jsKDO:%ƮG5Qc-#P{A'Pr%IE/ʒ${IG%1m̩$%$FTI;?=΁ 6^Z-6ϻ8Kӣ>,{rk=6s-jaem$vVMGiC!HzOEBOc_,C[,S%jj)OտX/ʞ--h9SSl4[,|]ϖ ,OrX+䲗bV (^|V( \P!Te؉ױ ?Y VC5BV mBk!5B`b:*Z!,Y Mʘ*r!Uuu2fLp1aU"c;XC lmx>! gp*W k%A~3_@N}vR~9eވQ&tk8=S)0/1^34p$?_2l>GxЙ*u,lZ* 𾩍] [S/|ҫw^ z6myO,zkmi/{ rz7[z޷uAՎwg_W"n z{U#}ՠG[%nӉ;{5{zO#g:M/Yű}.qZ(뽩kOϠ֠xf6/NF}hq~Yowi}GNS?->Fw)j 7P>N Ӝ7!sNr{9XG/t1n^Rs;]ѻ4@yTyU3p'ͻ\UB\1AW=ډq.ѧ\́es - -Wj w;3P{jY\s+C<{Ms&J6I:m2$ }fk-2vWڌwn?tm%4OAKkxߒ#[]#d.{D]ƻ0`h:pZqBxG6Wwc͖EEBN$5H^ӞKjwAf|'4 ^H"uFF#rݜxRTrjɖd˟R/z,\S]MD˒i%ɐ=Y:\M[,V.#fXB7ON[\vIfZ@o rz;1p2N vgX$~HzRÜ> -vgÆYɞ( hIvX,ѧ,ݹy%wxrս̘h^a̶!+L,8hɮ r"UUk\$+fk[Ȁ9o5X3ulYf`oXͣY)YqK>%G4E6bH`22 10m%9[p9f))wK0ZnH ]׬`o7[*HȟAגc NDn zѣYaDX. d(m Ik΃V!#=:rVz)))Ɔ3-eRbit,DlXo)ڇsJz %OP,f7+ͷߜnqV[WYw'Eo'{AuoL4$<&gn :ln, vXy(4YOzVOIe) [0R Hs4[Y/{tA5OSp=#0Mtp{XWpM1π]la[g[w?ҟޟnux|;M[|"Nrc?1_)юՎ1`;y|-X!G™X\Cd -%/v/or\:.5I㦿dQDE>..D9c⹹lqǨx;﷒bm6vf);\SqLd6cO84 Fip&~q3Ϳ3ӯrfIwIwÈ-J4wr1_(Q;sM,@-3< n]+$}s8`zF<'m}Rmjs#8dz`%kLo<wlFϣ5`hFwUl-noj>!fsz6wA(3h-;]Z`-X7xCKl;ުP-[*R^o}жϫzCUȿޜvjmGB^{Ho;mP5ktѻ%i` m׽{ ׽#o{!tK ً|iq{/3t^ -WCgվ*_^]+ ]7n9"9:J%aph_G8eWP~Ha#с{R߂Iy,9.h~ 񭮱2Jk;_$]@|GS~x3ј٩9܍vW}- BAvw:!~/|b*ˡbûh+O >xh#vI c( CDCV1Su}>t :R}g Zh5>> ķ+C edsiV1;!ޏ|xG:ת |ĩxEt"ѫw>Os>_t.O݌CGo_@=`8v[li XnvU # t;}ZG blHxfJ8c8n8U┣w*|q{8.z߹`@@@s"#[1;w0:Vߊ]Gy~p?Y?\Z^bFÕҮ6v*U.YW3SY 9eNhUgD4ގWD&_&Y6IDl$݉hΖ#F4?ξGN,P;w _'.畁 sd+}~> ss&}U֙sb@qR܃ԁ#b@8o``mmXc `hMt?a^KYRSW>m-5ڛ d;X1b-ϊF\l {faø~v?qd7uvg`MsUTAv>Qdb,$W3㮝Q8r^P=ޤ>zA}L+NkUz)oU-MiGhMng=OӤ~MjʴWE.o7g[9W?J9zGSJ.U`Vzqa'mxTEIbzVCcSYTxV+@8ӲY}ؐ[X(Ne!.GSi㲿foHW<ϖs,}}AǸ?72[֍,R9*㈵}~w.\紒*S;V&G'<ҟ2S}N#RWuy;'G,ߞmSc츤vxиB񐱢QxXC -EP5, D=Ng]!G7,h6 ԿPʱP۱ܭ7lRVGw̰uҰtn #4^@͛Xyu tSdž3BcrcZcfc*{cnc~ԇ}Ʀ%l*ZB7ePعh{ml)ֆ6(q~Q%JDIΘ=)cYH?XdGyl}RJ7l(ږrИg"5 AJl ИNQb|TژQ$'/[yW5^7vjnm4?^cT9E=%qSd>YӍY>޸UlAğ&r";Z 1U ;IL̿|Ŀ|̿#}ˢ"qHb.W@E^Ǝv/7`~V|凗]~b_Z~uwO,Q +Qd+YPSWiIyIUImI}wU׾^wfb!"E6הRJrCE94EEJ\. )@RJR.)1"""@SKRLZd'ڞg׬Yff<3S4hRѴEs-*ZV虢uE(UTS`k! u$eB$ ~Kg2"OߖS&I88('C̽F9ay4QFyS{C{}ӱO>>_}J >#$=> 3}&g|zHpf9!|+>~=_:K,ŰIfFw{}Tj$e%b i j|Y<1Ȗe?S%f̔k̒tOR afwf6{#  --džLJ•ypUxIxExuxmmxcxKx{xglkxo@Pp:> -_޵+ ROLtG٦ x)t(t(J<R]ϋFּHH(|EUQ~GZI*B)^ W™ڽޑ=JҢS. q-(ߖ y E)zDƩx-X  ױRJiSdRdpeo+|,YDmK[(,2wVzT8ijƢ=:<#2?j5?}#D#k&Ѝ*b$G17u݋""[vH?푑}|<.gJdT"e I G·քD.ч"W ғhF4;#5F󣝊?SxSŻk,~菤P|R4>|+y/;HڵV%ƕ WK Bz-!VSB{ۻVVw/ !]m6ǶĶD;V-t(3'7v v8| vLVW#BB$dl3b\blchMJņ68PV%Ԯ8/tV,ˋ;w +._\R<{䌐zx\pxRsdhн(Z('FDGguntH..[Z,kPy|DgQt}tst[Z6K$\T:=u5bnG/D/GbN,ejxFI&k :h:ǺCq^(3VdžGƊ EXUꬌMoRiwٱyؒEWd4f%J -z/^˔HU{ulp#݋$u-HgBu,]CJJK +)Q_>#rdtɘ%S"GgK.dVܒ%cJ*Y+Xnϔ/\Md-k]JKvY齕B$gKjKs/|¨䙹{[0IIm@εK.inOt>m$ﶤ[ew{|fH-inUw]$X&?ZE/ʾb}{_v&]W݆-Z{-TB}:$t5?AO?׵sͣ΅yÎe%BBB%]5Aq'M|wuDڟ@ml>?_hQQ|G}x21jY^?/3khSlTF}ϽA;uD7B/7%\ms\?gC-߲Ze[^Q嵺ΰYUBKn<^[Ǎ'\ݟxm~'CKcMc 4' :~ -Gò* 6RhjB3f eAʆW^ZB[qxG*# -b1ˏIGBe}Bcb$Ϗ:bL?.6?)Z)7Z.{q9w^Хru(~ѵ^|?ac>I(sBo+=7Nqg@(--(5#ǐtiow$-XGW^{ 6G4B  4IhL9B -k1&u7lovk\mq{ͮ7%ܗox=w'ZRnt铮 k v|Z7g~{Z]B= mիB+=bӡE@Msr9$z&{]G3h/_Kj7.~_|2т~AH^4?WhbNܧ2U5B[^vl -(UPS`%/TpU*DF* - 3 - sN +,(Qط0RXZ8H - -G)(XXpJv gVQ8pHto~h[yC.ouBНw8 x{CoЗ6 L3~5ø0 -:gVzTE($ԻIH&uIt䕸ۣ?^喚ZﰴV[eeU#zͪ3 <x']=_2{E eZyGZbvU-r(+mA?f]LuFV6V֜7eotDҺٻkbCMNjT$?~fXka[/X/g/7H5)/ԗĿLqZ 7ZI2ʹi=HR]v]rIcیf|ӭO+]]5|KRg}L:+iҦeٌ%A"Sh{eT7l֧/G},;*Ӧruq/D~TO%U)ކ G}+VCF 868H ~ >jl0n1lˌTٷYE'Sj=A>l?됬ޭel=:|*ku xP-k]wyJ -eeZkoմ:IrZZ"(Ŭ#YZk(NմϖUѻ%:ſփD*I^MOMG۩v:z~eۗw0Hd|Q$#$I-RHqY(Y -YX?0SSFJrKN427ZnS7>AF;>uߴƍ&4Uce|Л/Lc@^ckzF?d=~jˣ6}Kp2n ғ BJO5ұm0hK>K6"ܫN|צQyMf}$t5uWZr%)9-CHjRTZr#e5I ?xI\8JxjԖgI0pX|'ZHoX?*C}m0ffWVͤyfG ͤf1K>5e0%Ajgg_5',YVVeg(%7[o[ۍ$雗dkPz: A #zzӸ:b12Qu:!6OYdّC֜_ʮ_нSK'K>/m7Gޯo]= d 9dt8LV`OdM=nm&5u_LGהw,(s46Qf\5{'h\Igxƅ{';m']Ĺmv[ݶd'0QV#H,N~L_0ZK^/MYPviͥ uyc"㵽IwnҖyY-)͙]~RcH`L`XBh`\ ?+)0WI]E*F$c$o}`s`B>MN"R&{SłZjzDMr4햴|lK ["$W785ɝ_Lps#nh q+fSΒ\/p 7L򖻫524Z4EaDM`K-5Q"Y#4m4]w?2AMʎ>DkNq-<ʔ'3œef -hu;6os]g9SL˂g%wR$g3I4OR}ȉ9KNOHݮ^Rk--6ÖXj#e"+zc -\HZa{Ͽ?&\oD=' -%sM%5^QVWk JI]*k܄r$eIE;I]}ͮ4OS[j)NW߯")gX{vGkv+ }FPِ*"ÝEs&krmckkTl(Yhurfw5HvHV'tSdw! doi;+ϝG3-R\>u9X ?<&[ }bJts?=`Wp0ּ #a*ei͋׀?U`5KFY:p `%xRh\I9"֓$#gQ4|HrA-UG.|K?$L -VX@yEK h)S\:,ԩ\PK''']S%I!T0iYQNخh5 p=>WZvڡ9vkjli\>jG^u«){l /Y;%U*7-G)h~fo(L}x ?E)F^ۂo4nhl8YƺQ+ѲQr{$b#.ԷQ*~qZ?}Fh.w]_յ74זd^G*}7w*~aXpѾˮ 5iECS7/Ňj|Y|~uv)t~gr O˩]i -dZ.4SWeO ذIW0ﮗ~ -ܯe).B3;3m.ќTĎ(I +6 >nq 6{)6\IH؟˝F&:IiXJj;Xk.):+?e>'uc \s[-89:gwR}<،yY4mv"Ť -wshZSվ3XyQz'^4{#9ߧ[j5tp Éaf!y)&'SK#dzjTn $8+\F'AҖr ?H f{v?Jg:W2ڟЊGq询WG60ɜˮVoRK5syrqWӇ'}Rc|G|;=HnhkfKz3Qb* ~P?y6{멥_l?ɛHy*.4z -38O30gGGگ"w+ 5{Pcm=ؚ_T?ݹUoπGߢx'8:?_>y>!| -esS~H ŤH x ̅ b^%) {(1,.$ I - yz:^x2y.s*rJsW ;XCg':G-p6[c-Bk 9R647E2\ f`+qw#^5{['HoL#PV cX&:M`Sy X{U1QP>H,dJb9IOzwן6rZ -A4mZgl5.X(^coS{~nGSH,oG~=N. !w)c載.$ I - yz:bꚂsx5*@]n<\7H>I?>2:;? -rVr:÷!HCl( YKpp%MoDDZߍ{'Hފ5|pG" "ɆU1  1$r^j5zF~;΃ 6YF޶E6 ;C٫4'3p+; <;ug(Vs(ʞ=a={z ֳ'gOXϞ=x;Og-kh%7(|III ehkM>Yy)\`V{Ÿ@~ZS.[f7R29ry՜9\~F@ L#=>_\X gYm˓.|*'"1Tb=LOZ|KX|E-xba>EJuƣ$ ՑERJ9\tca u~]GON/>[tպ>=鷶hӺj_=< -ΤrՎ1c5\Zh툥vD ".D@ّpzI=zcGH?{#D@NNJHnk_E\4_TM;NY -ﵨxS 7mQvPTGӅ_OW8zK޷`: :8XW/DEn*1ہh]<"v[X(E^J+V`gZOyHwLm)jl~n43.CyqLBop2-SҨ,^_Fӕ( 'ЙX$,᫽5$E-=5JguYﭮ}xc P*ߚΗعC?^tfAͩv ;ԛȡ7ӫc7$i!RDO'$ʻ;ӺS15Tws~W.6{zr)q^ϩXC|xxͭq;6+=C]?}ppg.`^:)/뭠 oM$D`.Zw|3ۏR *<ڿMjquQ)l$Z>CLŤ1W _?ܓX;knw:"G~ܫ~Xh_b/]J: -~IK9jpй/FŁNTŤV^aq< -ɏ+>(~S:N&' |{xѧY!~RHwP#Սu|62)]$Eމ(ZK]X~ֽ)> -,eۏܧv{|[UNQ^V<ʆ:*sԦ~ӱPBZզ=E]cꃵiUy)m|;oc? "ԯQFœ>wsg%5dZ'9ZJN+ sp$Sud NM0|xlj|q`CC䶁d$O羫ciߘPU4S?ܭ:^ҙ輪UKGNrbHKzxۦ|M1T1{r7$Oي jvqOtbcJ!hobr3%1]{VJcw+_3R/OV;yCO6/(oquw#y gg~yPD8 |W%փ.5VwƓ^2Zm?-|_ IܣU`ʞC>~4$l@>JѬ/@'o,P4" %[kkEP{ |]d zhkj~v>|.uӏoi'a%B\wGELQ=dD@H!(( QP2DVE]f"bYWŜ * -*FT _;,w;w'.P^`͐Z hACH}5;ZW`@|"&俁7¼xcρ6j|-kP '08|`'|,? R'T]!93K W(N`G -@OK -W*$ h*C&ZM{ïƈ@V`C #O ڳ×г -U! Lݭp7އH(m#NԘTjh-Uhb[+B`Z#ڌHtFt 2HF!#a1hxrtf*r@f[?~"5t:DZ"M=§ 'w -|1b 3wt! -"66%M;l%`׀-KNJD;R>GR2)IҒ4c4:9-6Ղ}ރAE,|?} O71x"VUkfͬF3+(G̲FmrA' -@!(šd&hZZ4 )~oPLNW06BZ8qaW$; g"]@ӰeycWմ|BUP&*U GB}T1z  F1h8@P6EnZ -P1*C{;*T{NY%%R^JAM2R CnpeHLch+}R JNBMr -2i{"KJ$g ,p$I$Q}R%J.CIeB_,o!r Dr]@憀M -JZO䖀m;.w\ y P@䑀H R- X@F@䉀SgHs"u""/"Kmy- F@䭀;@佀a|i$ F&.\ P BH -DGD@DJH"RTT?@n{[NeR)@D@D@D#"R "V "Q "U "S "m#"W "m@Dj1RC2R#2V+1pi_L\BRz%"V"DDlDlD"v""""qqqq qq$ Y120bt& ] C,n-w[ (^=Q -cQSY^<xiMc+ */.AmrBQUL4b(k鞲ʚ(kz鑲5/+quփM^ -?kQE-Q色EO-zlQEϕ-zlke-zlA@'0Fbt Lk߷hF'3Ld+ruF37H ;mTz~z[%wY]QzWgSҮ+sPz7*4[+[T6ˣ>^D|asJһ)J{Gh1o,^Mg9VRF\kĶf-X+֚eXuaXۓcؾlFQl;&S7a)'ؔN!1n^XvŮS$ST$tgHgH \x>Ry4bix9«jH"7MHo[P \K>ކx;ގ x?ޏa|qdOPk|_D*M|6}dpO?ϑu~_"kF6 ~lF8Cvăx {҅tAIq'ć 'G3'ȅ J %#L#72 E5I 3N.$"OA2P2F]82u#DԝL&QMFd,2 9d%9$ydEȟ,"PoOQYB@~DVYEVd YR`RLQ)!%h -%.4!{P rE$9"r !y4\&Q$J(r\GtdWrE!ycœgJ u%5Fޑw(4F44&4 ?P2R #AMF3ڌ62(iɴDCe2& `,h w_Bcke1-1vh<8 pWƉqBMb74tBS.LtcLD0h:DLf2L]m;Sm'Wm/қ(a KP.ʪy:ڬ6Z`[!k& cYs϶eۢl;Zڰ6h)۞m#Z:hۑVhەV^Z77}>h-Bv ;cpd#QƢ l"6Il*fG#&([`[aEx^ z\w}>Oo[~kp- i@ҏ MII!#/$J֑d Fv=9BNI9oа!H5yJ^W-HakI -c&͙H&ITǪReX=ր5f6v`;]Pv0;aTzilM&Mài*]T^IATAdWjK,:&6.R %}ХKKKFK@AL@Z"ژژXXڴi jcjԦ==#: ppp - (@gPPOP.]At - -(?(@oPP@P P>tv`g!P`@`h0t0t004   - >F1Xc1|L>>&G)T`7 -c숝;</KJ^7x/>uǗu\1~Əw/ !a$D82$tIƒ l Vj>bK49G.4In>z}G?c/?71| >>>>j02X9X -w0 `f8p399 ܌nF7c8fȖ: lH4Yy,$&Xj2L/J%|@ _PB0JJk1f"IJoқT7MMTށGWTq!DHLJ>E Rn':H{]O!xvd\ItZ"~ӣcpkOO@!~E~` g>^D744_7Q| O"B &xOӟ3OWwo"x% -RIT$)r!dtzrFU~3EqAQ *Dr5N!5؈ .gD*bJA0׏kc\z1}P Eo-(e]yTFVmz /&]uIwV"V9e-X,uis~}bZé+[+"]cx -+,l`aIir-NJǥ[s|LE`RlFڨL3$z9gʧc]?CR3SzuZT9M99򐛲eاoy;uWR fA\\:t w kY*/(8>ctRl<-h -D4^&PU\1~x9O6{/xC#}nx~% Ϛ;R{99{~QWT?O2܈iqnK>I"?z{'=|ۏ³$a`mθ5~lmkYOK+6$[:݊*¤i21a_צUzhsG7#f]uaٟcÊN[ڻྻ{?AiS7eT)"3h=)Q5om?Sn*fc!KN˧}e/5nپNM.`zx16#!g?9Ħ8Hc3~FtY0FJID$R 9ǜxP1cRr&˷ -~"$G\.MI&u=FW/G{"_z9^k~L/ 5ـi%VZռ*sWQx17|^vtomOɞyHvZe FGl6<5.fNǪ⦴p҄>|S"oӸDWݟz䡷y"vn8xỖiVZ*_56zV{-3+=hF z2n/q m鯮ӆm13pn\0EQD"Z.4…s - ;pdm}gN][gk{΅;$Dۻvc:$ػ9c8Ww7ڵv釉utpBfʅ*G%J HX#HYnDo I`GEv$Wz8x΢Cu Ӯ~ZW_mi,٭-_TM|${H^o8avyv "?,:; +^fsq1*Ս+u*zp^A"{U'|2uw*!DG{9^{ӰǼ#d9>UӲHMWl@J:|ɺia%CeqCxʵ1oG58%/F|]U i{z_7&ޭW,fk?\$Lu켷vq"C}Lr-&RU/r{B Ҩ8ЎJJHΌ7K水,3ss;9ݝ9 NSga5Yefc.*.bZvʜjױǃ=,ofe˷z0$wn#WJ|kp/.osR唻\m-5X1*Mo#[:Mʨpr nю$;jeTv t-7s>t.ghY[YZ7fzDPh-qۻOk1o=HGkX׎rG5D\{^{~H| 4ye~ӠzbeBG NQ&-W'KvUtjeQi<ݲ *lk -F7ZQ-'muVɂYUhY/Η.*>뿯e :y  ib~f*Lxx)J{ .|եu{xcjqƺ_^t*U~| }M6Rp8tv}+ˋʫؖIVQ{*ckҟGvqUo޽~xǾ mgUKLV}Y[^[0lk3ێLYiɸ!"ŏ9Ȋ YB{t|glԯ%=Thwl{-y~(cfUW.18y?Ϥ<#.=_i0BC_ZvFt>)AlVe\}\~>}E-h7^^(,ޱ٧uާmHG~|k9ĽOszYTv]o{h:gMI]ҚU&DGu *Qr[2rjO6=*[Ä|\N_|.J -6npdSuyxqŽ#=+߫fgE##:mn$\RUc_iIO.P~S~7HT]9w^pR&oxoU^ϲoAm4_]x543Ӯ YܢW~.ϖh6j,k}s߾O4:,ς֭=n\ꕡۮP)!9/Opٌ+O}ڕ3?[횆/X|7[ebҝK'~N78.!v6 Kk3S ?Oۨ۴~0+8{X}xfke/(* ^[Kw9'#p*sRV@v̑)KGpC0'%f@ 3ݾV=ධU&%Ǿ{U2r6ׯ!>[<~soB6M֌](N?dzY}kW%ڟ"&f]%FN/G=g}cL Y}-N:~躣u~U1Fp+pQKƵ;z>xOi֮NO.q1fq16 Wڸ0cbyN1nP;cw'x}q뾠#-uFy9KΝegcr5-:Cή0.ݸ49֯M7.dឳ׎ޕVw; :i8%s Wԉ{o4_e屻Ɔݲ`/FѩXZhiu[ףFQ|l_&}bKr#nZ{㚮G]MB)Q,qn_?6!rStMX6BMǑ\kڂ ,O7lJyccj z]\Ӌ : m7i|uqfHk}21FcUiDz4NooEUw]̝&C+CƧqSVK9os-[ǾMG4' 'im*'2GJ֍ʑ׮54~_${ynL^\-ۊ&53WX;ɮ[&M]~k۴;bn/Vmܜ3heY#e[/28}7ܭ‰qVs/ z<G[]xcȗ?QmS/:2Ӟꑷѭ)g2 5 -endstream endobj 309 0 obj <> endobj 310 0 obj [250 0 0 0 0 1000 0 0 333 333 500 0 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 0 0 0 0 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400] endobj 307 0 obj <> endobj 308 0 obj [250 0 0 500 0 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 0 480 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400 0 300 0 0 576 0 0 0 0 310 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 0 0 444 444 0 0 0 0 0 0 0 0 0 0 500 0 500 0 0 0 0 0 500] endobj 305 0 obj <> endobj 306 0 obj [278] endobj 303 0 obj <> endobj 304 0 obj [250 0 0 0 0 0 0 0 333 333 0 0 250 0 250 0 500 500 500 500 500 500 500 500 500 500 333 0 0 0 0 0 0 667 667 667 722 667 667 722 0 389 0 0 611 889 722 0 611 0 667 556 611 0 0 889 0 0 0 0 0 0 0 0 0 500 500 444 500 444 333 500 556 278 0 500 278 778 556 500 500 0 389 389 278 556 444 667 500 444 389] endobj 294 0 obj <> endobj 10 0 obj <> endobj 327 0 obj <> endobj 328 0 obj <> endobj 165 0 obj <> endobj 168 0 obj <> endobj 166 0 obj <> endobj 167 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 162 0 obj <> endobj 160 0 obj <> endobj 161 0 obj <> endobj 171 0 obj <> endobj 174 0 obj <> endobj 177 0 obj <> endobj 180 0 obj <> endobj 183 0 obj <> endobj 186 0 obj <> endobj 189 0 obj <> endobj 192 0 obj <> endobj 195 0 obj <> endobj 284 0 obj <> endobj 287 0 obj <> endobj 285 0 obj <> endobj 286 0 obj <> endobj 196 0 obj <> endobj 197 0 obj <> endobj 329 0 obj <> endobj 202 0 obj <> endobj 205 0 obj <> endobj 210 0 obj <> endobj 215 0 obj <> endobj 220 0 obj <> endobj 223 0 obj <> endobj 228 0 obj <> endobj 233 0 obj <> endobj 238 0 obj <> endobj 241 0 obj <> endobj 246 0 obj <> endobj 251 0 obj <> endobj 254 0 obj <> endobj 259 0 obj <> endobj 264 0 obj <> endobj 268 0 obj <> endobj 273 0 obj <> endobj 278 0 obj <> endobj 283 0 obj <> endobj 279 0 obj <> endobj 280 0 obj <> endobj 281 0 obj <> endobj 282 0 obj <> endobj 274 0 obj <> endobj 275 0 obj <> endobj 276 0 obj <> endobj 277 0 obj <> endobj 269 0 obj <> endobj 270 0 obj <> endobj 271 0 obj <> endobj 272 0 obj <> endobj 265 0 obj <> endobj 266 0 obj <> endobj 267 0 obj <> endobj 260 0 obj <> endobj 261 0 obj <> endobj 262 0 obj <> endobj 263 0 obj <> endobj 255 0 obj <> endobj 256 0 obj <> endobj 257 0 obj <> endobj 258 0 obj <> endobj 252 0 obj <> endobj 253 0 obj <> endobj 247 0 obj <> endobj 248 0 obj <> endobj 249 0 obj <> endobj 250 0 obj <> endobj 242 0 obj <> endobj 243 0 obj <> endobj 244 0 obj <> endobj 245 0 obj <> endobj 239 0 obj <> endobj 240 0 obj <> endobj 234 0 obj <> endobj 235 0 obj <> endobj 236 0 obj <> endobj 237 0 obj <> endobj 229 0 obj <> endobj 230 0 obj <> endobj 231 0 obj <> endobj 232 0 obj <> endobj 224 0 obj <> endobj 225 0 obj <> endobj 226 0 obj <> endobj 227 0 obj <> endobj 221 0 obj <> endobj 222 0 obj <> endobj 216 0 obj <> endobj 217 0 obj <> endobj 218 0 obj <> endobj 219 0 obj <> endobj 211 0 obj <> endobj 212 0 obj <> endobj 213 0 obj <> endobj 214 0 obj <> endobj 206 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 209 0 obj <> endobj 203 0 obj <> endobj 204 0 obj <> endobj 198 0 obj <> endobj 199 0 obj <> endobj 200 0 obj <> endobj 201 0 obj <> endobj 193 0 obj <> endobj 194 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 187 0 obj <> endobj 188 0 obj <> endobj 184 0 obj <> endobj 185 0 obj <> endobj 181 0 obj <> endobj 182 0 obj <> endobj 178 0 obj <> endobj 179 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <> endobj 330 0 obj <> endobj 331 0 obj <> endobj 291 0 obj <> endobj 292 0 obj <> endobj 290 0 obj <> endobj 4 0 obj <> endobj xref -0 332 -0000000000 65535 f -0000000016 00000 n -0000000122 00000 n -0000003654 00000 n -0000184799 00000 n -0000003737 00000 n -0000013088 00000 n -0000003836 00000 n -0000003884 00000 n -0000005156 00000 n -0000175985 00000 n -0000005406 00000 n -0000005454 00000 n -0000005501 00000 n -0000005549 00000 n -0000005597 00000 n -0000005648 00000 n -0000005695 00000 n -0000005746 00000 n -0000005799 00000 n -0000005851 00000 n -0000005907 00000 n -0000005959 00000 n -0000006011 00000 n -0000006073 00000 n -0000006125 00000 n -0000006184 00000 n -0000006236 00000 n -0000006284 00000 n -0000006332 00000 n -0000006381 00000 n -0000006430 00000 n -0000006479 00000 n -0000006528 00000 n -0000006580 00000 n -0000006629 00000 n -0000006678 00000 n -0000006730 00000 n -0000006779 00000 n -0000006828 00000 n -0000006880 00000 n -0000006929 00000 n -0000006982 00000 n -0000007034 00000 n -0000007083 00000 n -0000007132 00000 n -0000007184 00000 n -0000007233 00000 n -0000007282 00000 n -0000007334 00000 n -0000007383 00000 n -0000007432 00000 n -0000007484 00000 n -0000007533 00000 n -0000007586 00000 n -0000007638 00000 n -0000007687 00000 n -0000007736 00000 n -0000007788 00000 n -0000007837 00000 n -0000007908 00000 n -0000007957 00000 n -0000008006 00000 n -0000008055 00000 n -0000008104 00000 n -0000008153 00000 n -0000008202 00000 n -0000008254 00000 n -0000008303 00000 n -0000008352 00000 n -0000008404 00000 n -0000008453 00000 n -0000008502 00000 n -0000008551 00000 n -0000008600 00000 n -0000008652 00000 n -0000008701 00000 n -0000008750 00000 n -0000008799 00000 n -0000008848 00000 n -0000008900 00000 n -0000008949 00000 n -0000008998 00000 n -0000009047 00000 n -0000009096 00000 n -0000009148 00000 n -0000009197 00000 n -0000009246 00000 n -0000009298 00000 n -0000009347 00000 n -0000009396 00000 n -0000009445 00000 n -0000009495 00000 n -0000009548 00000 n -0000009598 00000 n -0000009648 00000 n -0000009698 00000 n -0000009748 00000 n -0000009801 00000 n -0000009851 00000 n -0000009901 00000 n -0000009952 00000 n -0000010003 00000 n -0000010057 00000 n -0000010108 00000 n -0000010159 00000 n -0000010213 00000 n -0000010264 00000 n -0000010315 00000 n -0000010366 00000 n -0000010417 00000 n -0000010471 00000 n -0000010522 00000 n -0000010573 00000 n -0000010624 00000 n -0000010675 00000 n -0000010729 00000 n -0000010780 00000 n -0000010831 00000 n -0000010885 00000 n -0000010936 00000 n -0000010987 00000 n -0000011038 00000 n -0000011089 00000 n -0000011143 00000 n -0000011194 00000 n -0000011245 00000 n -0000011296 00000 n -0000011347 00000 n -0000011401 00000 n -0000011452 00000 n -0000011503 00000 n -0000011554 00000 n -0000011608 00000 n -0000011659 00000 n -0000011710 00000 n -0000011761 00000 n -0000011812 00000 n -0000011866 00000 n -0000011917 00000 n -0000011968 00000 n -0000012019 00000 n -0000012070 00000 n -0000012124 00000 n -0000012175 00000 n -0000012226 00000 n -0000012277 00000 n -0000012328 00000 n -0000012382 00000 n -0000012433 00000 n -0000012487 00000 n -0000012538 00000 n -0000012589 00000 n -0000012643 00000 n -0000012694 00000 n -0000012745 00000 n -0000012800 00000 n -0000012851 00000 n -0000012906 00000 n -0000012961 00000 n -0000176676 00000 n -0000176731 00000 n -0000176604 00000 n -0000176478 00000 n -0000176541 00000 n -0000176208 00000 n -0000176352 00000 n -0000176415 00000 n -0000176280 00000 n -0000184250 00000 n -0000184305 00000 n -0000176786 00000 n -0000184140 00000 n -0000184195 00000 n -0000176858 00000 n -0000184030 00000 n -0000184085 00000 n -0000176930 00000 n -0000183920 00000 n -0000183975 00000 n -0000177002 00000 n -0000183810 00000 n -0000183865 00000 n -0000177074 00000 n -0000183700 00000 n -0000183755 00000 n -0000177146 00000 n -0000183590 00000 n -0000183645 00000 n -0000177218 00000 n -0000183480 00000 n -0000183535 00000 n -0000177290 00000 n -0000183370 00000 n -0000183425 00000 n -0000177362 00000 n -0000177692 00000 n -0000177747 00000 n -0000183150 00000 n -0000183205 00000 n -0000183260 00000 n -0000183315 00000 n -0000178037 00000 n -0000183040 00000 n -0000183095 00000 n -0000178125 00000 n -0000182820 00000 n -0000182875 00000 n -0000182930 00000 n -0000182985 00000 n -0000178197 00000 n -0000182600 00000 n -0000182655 00000 n -0000182710 00000 n -0000182765 00000 n -0000178285 00000 n -0000182380 00000 n -0000182435 00000 n -0000182490 00000 n -0000182545 00000 n -0000178373 00000 n -0000182270 00000 n -0000182325 00000 n -0000178461 00000 n -0000182050 00000 n -0000182105 00000 n -0000182160 00000 n -0000182215 00000 n -0000178533 00000 n -0000181830 00000 n -0000181885 00000 n -0000181940 00000 n -0000181995 00000 n -0000178621 00000 n -0000181608 00000 n -0000181663 00000 n -0000181718 00000 n -0000181774 00000 n -0000178709 00000 n -0000181496 00000 n -0000181552 00000 n -0000178798 00000 n -0000181272 00000 n -0000181328 00000 n -0000181384 00000 n -0000181440 00000 n -0000178871 00000 n -0000181048 00000 n -0000181104 00000 n -0000181160 00000 n -0000181216 00000 n -0000178960 00000 n -0000180936 00000 n -0000180992 00000 n -0000179049 00000 n -0000180712 00000 n -0000180768 00000 n -0000180824 00000 n -0000180880 00000 n -0000179122 00000 n -0000180488 00000 n -0000180544 00000 n -0000180600 00000 n -0000180656 00000 n -0000179211 00000 n -0000180320 00000 n -0000180376 00000 n -0000180432 00000 n -0000179300 00000 n -0000180096 00000 n -0000180152 00000 n -0000180208 00000 n -0000180264 00000 n -0000179381 00000 n -0000179872 00000 n -0000179928 00000 n -0000179984 00000 n -0000180040 00000 n -0000179470 00000 n -0000179648 00000 n -0000179704 00000 n -0000179760 00000 n -0000179816 00000 n -0000179559 00000 n -0000177434 00000 n -0000177580 00000 n -0000177636 00000 n -0000177507 00000 n -0000184375 00000 n -0000184431 00000 n -0000184743 00000 n -0000184631 00000 n -0000184687 00000 n -0000013015 00000 n -0000175838 00000 n -0000013389 00000 n -0000022426 00000 n -0000022612 00000 n -0000022784 00000 n -0000022959 00000 n -0000023139 00000 n -0000023281 00000 n -0000023442 00000 n -0000175275 00000 n -0000175525 00000 n -0000175018 00000 n -0000175252 00000 n -0000174130 00000 n -0000174365 00000 n -0000173431 00000 n -0000173671 00000 n -0000105492 00000 n -0000105519 00000 n -0000105040 00000 n -0000105261 00000 n -0000023579 00000 n -0000023606 00000 n -0000024052 00000 n -0000024218 00000 n -0000024288 00000 n -0000024541 00000 n -0000025072 00000 n -0000105814 00000 n -0000105985 00000 n -0000106055 00000 n -0000106313 00000 n -0000106658 00000 n -0000176083 00000 n -0000176141 00000 n -0000177833 00000 n -0000184512 00000 n -0000184567 00000 n -trailer -<]>> -startxref -184992 -%%EOF diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/77 Pirimicarb_RAR_08_Volume_3CA_B-6_2017-12-04_Page11.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/77 Pirimicarb_RAR_08_Volume_3CA_B-6_2017-12-04_Page11.pdf deleted file mode 100644 index b9cf39fe..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/77 Pirimicarb_RAR_08_Volume_3CA_B-6_2017-12-04_Page11.pdf +++ /dev/null @@ -1,673 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/Metadata 2 0 R/Pages 3 0 R/StructTreeRoot 5 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - 2023-04-26T16:18:01+02:00 - 2023-04-26T16:18:01+02:00 - 2023-04-26T16:18:01+02:00 - Microsoft® Word 2010 - application/pdf - - - Pirimicarb_DAR_08_Volume_3CA_B-6_2016-mm-dd combined_final_18_10_2017 - - - - - l.riffaut - - - uuid:6a36fb28-cd8b-4915-94c2-ff1ae114395b - uuid:d9195e6b-e986-4d7b-acee-65a42a31368f - Microsoft® Word 2010 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 5 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 10 0 obj <> endobj 6 0 obj <>/MediaBox[0 0 595.32 841.92]/Parent 3 0 R/Resources<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/Page>> endobj 232 0 obj <>stream -x][~0/fkfw;8Qb(y펤Gڍv$xmlIAybXX$W_^//r9\:l]=WO/Oo/|7>|pXl6O_<| 6 ~0$7O_?|l^Ÿ>xyũbBa϶Ov{$NtaHm>O:li_V#doTϜ;1?H7Gݶ=귟A6§la{/!7M͍._/2|ש@4Ϭ&a? YeW/Ẽ vMU=>|1/6X\\1rܾr?nB@KhaFDIߴ㾓]FH>0 noƅ^`7Te$LǢz4z Jz<Ǒۯƶh:yf+Y4R&K Ù}^[xYb7 d03ڂ\6J7 ~89 齮dM䞱@;4KZ>bIvrϗT[׻a{\!#ӀYw=UJ"M|V%uKi~?Zٻ1k`7Cmh. MK`~s6tUhnܳ|ʙ\A2&!qJ!?v"76"F(=e,dT4 b -QjF102!=#m:*:2Ey BBI?y|LG͈8&$XGMJ諚ƽ"ndbiXhGE%Sr7%D: -c:$'&a&G+ژG Cmf4W8ozl~چ~"xmi{cI kEuTKӬ{~;Q_@eP=(sꕠ)0^GZ;mz)Q$Fz%1ՎVtbkh;yR0t4f}'Kjs2842?ݾ0?R"ژbgGRs0֌PQGt^)=iؙ{1&78#-T E69cF̨5਋2zi (i -khvu#K٘:`g0l8MRD'KPN聲+.(xqߏlj5h$ - ,QK/(:2E#i?GZ'j:jB0 a( -aJA1Ef wЊŊm*_4T e{ٲwݴW`5a7@xv$ZD^ V Ukխn߸k;.E`[ -,VkjB}5%CDttWLi\2mxԳF\y0mk{\Z[vH6#܏-[ގ;b]y-CS~-,ub^M< IHe0+LlA|l+c>"ʉ`3$Țr,o4f+`e`2P)^$̡̕Ŭz'J2*!0@N?-L -)@d F$Y)BD. -M2gf""\R -kBr^fLWCbdٲ1Jփ:E)2F\#B!sVS(՚:E@`rQ -*EğE tz2Y/y *ktae22Wʔ^\ *Sz*P!XȊ -BP%U`2ʤaӂlW|l+j>%`%3-d}SĬp1^~붇;)םpSЩW,#+9eIYS"jM*k)h [lF_)uM -j5Qp`+o %5~ѫډ4"kF{ZCm}-Z4Pd -I/(ڄ5<@X~U %}:Az߲B+[[vnԮK!VF?u%18W?jX?PRzrXXH%X`a!`![]KTxsRSn|^+ BH$̥~G~BGSVS2{򵂈Z8\BJJ/@J ))),d+KO#WC+{ -Zi*KBJҰd3ؾ3`3XQ( VTl+ aZ=>e9lh#.Sl~B浏No\9v~%B(-z%/`%MzgH.]a}zaOGNc`W0Є"52X<ӋJ^^:9D "`(U0.5 n$ާ7nM+W1~20׎m>db\Li 靤ZU:F*Dll'i+DVQ淐K̃ZJ/Z j)j,e++hL/ZF𠖭.ܨ <*KZ0~M7=ŧSGF|:IM7BbӍ|y? U~R>¢~~l~RVrd!`oDE޴t;s-%"a$E׏Jo"jJNᵄJ -*d2bKNᕔ7t,X4bkIVW+b`ՄJ -kDz5VS7Pk 7t,h$),{CUz=pW ]MՔZ-+J0ז&l8pdk0ѤLP`aWQV`I/Ǡ8B8V[uik6,[ma9p -V(N, !a S8 -vB$\YHNl5$&^Y -.Cī_y%=aZg;ѻjѮQ e!EEU7c˗s]|,`cPRil^3č}퓼9vʋϊ{ G"se,uU5ʨF!:U i=<ށ@\{B3{{ѝ^ITӔFr[+w2H+ W czb xS@/TjԶdMIMoН V y Wy~C!|_5@Q;d7P~{^>9`4@\t;xP< @{f:t X - ܘa~nސb+Zx|Ă>^sc+U3o|Pf& >v7uZ\?18BGi Ie߱4~6o}`ҋ%~" íp\?ZSƗkl$aƒ1"*q*!e>m]ӿ5v8KzFEHLJs4J0T,QqUO霨3F>`d@IȽ' -BKUx** ZטSl?؏A: G{SE! T9Gxz$kp|PaMXu,YAz8zdx.+0,~}23hsTxB ՋcWBH1!3: W~/giy>KAb崉~BYl:6+}bBx9x#9bd%6/eA`J.静@'pw>'Vnz3 kK[z+7576f5Yף~6NѤDϳM fy@]xS\KQ`to -U=871MC}ux똋Pi!iFM#<~ߎxdI)A ^гv[+5Q`L4PZ|jkY*؜](-F- 8rAc4RZSZ9?(8R|A7 ٗ2 -ʫ_u\*6yd5!O HN#}y=4=vc8V5C ;K$Ih^> ၙh>84qa?Z;AL -"gFI#Ut7+pFES,:VaѸB`NF.Ekc4Ʒ"G : xET?(g#UHҗt( %5&q J?gb:s֧m" P0Q""5xn ttP[(9QN-,'0V2Nyiy:`*;6oFcTx*s3 -ŇnM"(tZ0@b(zêjaĆi -~]C !ܵpR6YeCw'5cg&qMY&YL@Qƈd1"g v ip+Cr#OZ*Ma<Ī,`/(I&T`/(K@QrY)#|E\^T$6KzuΈ Wy3;t^}X[8٪ï4D}>7Әh,3$;ϔЦ 1gL9;фlװ*o_-7xPavSһMg )i-4FXd)JYP(Tce@YL4˹lHd јkLs#F"#@+pg!::mg27{'qi e@ +b0=A2 ߟiى$Q柍LP[Γ3.j֤Vv]$ %ivR?j,eS5$*76ݒ`!Ʊ؉ڱY(BUckg \:kY͍9GfyxjgfH  ?_‘1؜ּ9|' -Tjb(p/0e)B5FɊ1)a?tKgXrÓHǰVV:Մ鿿l^tЮ+@"9ˣS1Z'VbphMx i.`tM&o]P~$_\g߰}e}:;Ng ~RAW"X/J78sR͇ГRacٚjIZo5IqGW=yeӀKZE W'pԠ.eP-cm_t$;JAG Z/1hfPD3rV=u{Z7jA;#qygԯK-{wxyz,<,>􋦑-2}#2uw0,EizgpP'iϺ>RmQq2)CH6׃x W -1jӄJ G_w}̆.^?ۊ 2UuGv:fөP)e)Oj\Pө4ht -a-(l:ػIg 4tW:3#w=P5"F?jGT햲=ɇimn$Gtyw=c  7p"3AEiO%͜VSJ }=d_^R2PM`dFVHm aWՙhtCab X&VvT31cA TOEӥ_ig<徚lp'Zqxɱq 3w,ŹTM 30wYKQ>ݒpCTpQ*APzJFP?ͺт#N8Cr#*攄"aUː+(CC3f]~<ݱ` ]E5]jӸX:<Ÿ5ʧ9 Ή;н܁f ?fNsZ6#?vA"IF`s~QPGaUaP៽S;72ѩ+Y?a@ǃ95=4-mB=#c@ޅɉ>A〈.nwePVc+Bgtlľ~i'oO|~?'(/[Ɔ~'c\\*x;wIX U,:8 *zxH? XȮݾ?lE (+t;p_LhpԽ - "eOZ?DТ{:a^, /'+0 xg -.[,.6c_+~ *? 'iTsqd` ll˜n~>.[d_@ %U+b[qP?*uF?,| 8+Mg/g@w̬9 Vzdjgcb|(/yv |6qAhu&6d}q&X nT/vt+05iNIKQ\P!pI@UL@Tx*d"sCVڐ=*g+!2eVeyM3X gEλ(Gx^x-,Г^٨jxiZ@?u|\'cb0Q0@m9 S=vS(n=4`:wčLb{7w!KLz3EF2ćNN;lP62?sc/3x %7oص/ZN&Jw4s2E̻)9\w}"FZf}i` 6{`C8x4VzNVyQ'q> endobj 234 0 obj <> endobj 235 0 obj <> endobj 236 0 obj <> endobj 237 0 obj <> endobj 246 0 obj <> endobj 247 0 obj [250 0 0 0 0 833 778 0 333 333 500 0 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 0 0 0 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 0 611 500 556 722 611 833 0 556 556 0 0 0 0 0 0 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389] endobj 244 0 obj [248 0 R] endobj 245 0 obj <>stream -x]Aj0 E>3q 6ŴiJjhl8ܾ3L>O|Ivs]N `ra#0PXgM,: - OA4 nv8=0Y7Hp.Tmă:A[_s|.ZaLFmQ4W W+|k'RmVݡjU؛+O#ӕX9x?Z 1Sq -endstream endobj 248 0 obj <> endobj 249 0 obj <> endobj 250 0 obj <> endobj 251 0 obj [0[778]3[250]8[1000 833]11[333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333]32[570]36[722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722]62[333]64[333]68[500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444]131[400]138[747]151[576]177[500]193[500]] endobj 252 0 obj <>stream -x |յh͒,#Y& r8NbkL'NlYL6! (Z --PZB )JYqKi)MM -mta;Jqcح{۹wΌF{4 QT~‹ 0 J-~ ۖ:7'SojQ{G  Κye󗶗D3Rp.w\Ļ86v?z皋{*3~O1W|? cz.x=>@E=[߆8t+{۔pOP~W =,/.u=kn #VQ`=mWܳءm(ݿie[>?|NK?G2\ї-=+|; `dDm2o%pZ ƊVY#za&?-h̵< ޻C0XI<j%p.śqA?z 'MnmEAV0#p#;Z2m.HՋɞJ3%7JK!~C4rH-Q\ -оQWsEnTTތlgɜdGD}BeX.TŚЎ)"da ؗ -. mh7XSmؿ˥dNfLԾ2׏>νF[a K1_6uފ&0pXnrbN}+cZcZe8Q}vܮLVwA2Ont>K5&HÖ@Α霏`0 c,]'gڇɢ_ c& Ivd0 `0 `0 `~`g8<-q hQ.mؗW+55iy˜;K/v/vڷ$[#噚w7)'33qL`;2@SyqƁWv`0W)t!Ԃq0K|:Уjc0Q5BUK}Rjk=p v p7j&2Qf/! O5٨9 ; 9yDG@PÐYP+A"%TKaV8 PPZ%4(P+ :j%΅r*HQsP@%j5J 1ZKÂğQ b 6q QSmQX Qى (,EX^-T;Xz.,M Q6.XQG}VBpTWy?B7t@jk`ZX P{^UPuF kP/F}ZK.Jz,o ۨnMc -WԫcpiUeV 'p9u z* -|>zjԛ?f؁z -&~QC @/>q>Ed 7`p#]p|P? 7Muܚ8mX܎Sv>5|@D}>E I -E}F}apOe -|½1qqBEXU"KO_G=2TW/S(3T@0%|AA ~= g?CN'Q{Qcx*3OgPH~ -#X|? *n .ԟ=ԗ/ó$ïᇨ9CTÏP?N>WOP?M^?G=ᗨo7EԷ?c2Woï տoPE;!p=x}Z!ߣk:k5sήYήl ^`ZiЁ 4zTwU*zYuFө4V/1i5hԊ"m5ZJғjJ!PO*cҏߣN?#1~gȘi H [92 V4IlHlE[Z[qbTtۖ~]b+ƿfi H [92 S>[Y [iIlzTlӥb+NJ0ҙt'b+s1[ڔc+ض=Yg# MS0& oʜi H [92 KC*5"-&PEJ(j5d@:Q#Qg4zެcXD#ERTF2NH>98)'RVm )WYg# Sҟ[g`02ѧOc+\EJ{le4[uzb8[$R4[Ƕ؊qZBl? c]`0 #-,bL N`m.0 F`04:A2 &Hɐ 0Z1qVMR3mKKM[Mn3[5g]`0 #-lȘ&yPޠ֨QjI=l6-fl-X2L&ɔz^AsAm!00ʚ7VRVm )WYwi-MMʹ `Vi0*a`Tk1@E L b6K`5-YMb-d0 z@b++'X(krXIVضS` -&I"83`0ia ̘&ܥvh8@fGEz7*Yfjح&꒬|LР5Ik7M&N4Fbԝ(6DQD+` aa -ayq!Kg`0~1Mx+p:٢iE(:]`mtN:;@GD>&hԙ,"fXѠcMʉclz|5QlŞ!4L!>/8oL`0 FZo3*$ zŪkE(z=]`:Nݖ[vepJ6tt2K&ɤH"%$ z0'Uضw&b+Fj۩MDU5.0 Ui(p DF1ӕr9nAt.9].zImfd:Ma`\erXIYǶ_JVF[9Nm˜$*l]`0 #-qJu*VV;`le[Oɚwg:is:%i˴&[<ƶ9Z&؝]F[NgE3`0iaw1M;`0q ts~R/;+; $gWd|l%.nvf1p9Ñp4ԝ(yl{"Ck(=CiW2OgpL`0 FZ&w78%+C`4ZpY+h1\X,t -\!9yCLl) t8<m!q,nW 5*m޴&Ltwe"FqQߩMDSr]`0 #-0|0<+ Vg̞QV B| PP4+e2$l -}i/8g`0 -cVݏR۳En p~8**reWBEa?T`?%g:d.KtB_VoM%Eƶ_׎'&]:}^qhʹ `erba0NI'g.Z|8е5.0 `N/" 8}NWxJj~sbp휶eso?|.ŹŹpW/}➏ǶOLH4yӲęK3`0ia ̘&V7%*V.ٕY<,l[0wasyyusխDqYaY,S.l-+.++ e E>%5m+Ok=nB6/10/Vڄ1I+g`0~1M}v x<\Ek@ :0뛛.ɏ_ؼdJlY z)Z9rVN-VVTFώFgMʉT2*ut\} F7]p80}v]`0 #-췁ӇJ>hYa1 ocI9X.8.`7<qw?GFDv=hG o_{Ns2-%@50:y~v -*5dHVp=^_V6 /( Gf-]^1rnռP 1ohlZ|ŭK-[qιuv8;Ofc>3@up\7'2ŘG,VwNGzyUs+.UZR\4+., s~9;]Nf,fѠ׉ZZ%j 6uyqU^ԃ=3;Ǧmnj?2,cIب%'YƠ?|C?̭X։[]J;iل@qo|@cwN7hfހE` hw5V Щxf1 6Bncx۲o U4+կ C.nPkZ7pp- =]dn!D'w0+ 47Iu`|α]]8spӷAli:I?W[l$-q].~`c7>4qX~e@̌IF@Gg0z|X~'S4kP&ْ*Mc FhR#g 'AܧJ"*a`M%!]GdC\W= Uv2>ΕwπoғjJ)dTx$)}Y$?fx mOWU @<7`5V:u?*+tn3ry?3:;gWsF[ {8tK[7tmKIdh_w -^>Uœr1t\'ag%mMq9]@`(r3^9>ItXǷtПׄWi{g8ѿ:藂{|!#:xfo.܉\<  ƸWt~cGs|}w]`:K[VRpx+H{bWEh}0M&6<;:>yUhaqh\*P_J*cZi&*1M,6elK2ۘ:bO"(KlC.w4~:R*+b:ΥvVhOJ[n%Xaau19.\2*kCXca8c4J0Ĕ5bvc:Lllb֫G.*{E%Qa)TZP -l$P#T\)(%}_)|S2T2Y -EUG1*Pq, -ǾuN,GZ$nM`bj%І0#xDxv`q,!!9*Qc$nTc!{5b)!muB~  <cgDE@+[ -?$\^jbNnE   -WS¥0&%* -_$Ɛ@{Cѧ p# G%[@ &'C:StgQ"G5&Tp{_! ׂt*L -Q^a|b.qכjV9煩ʢxϐXTeViy^ϟe/Sp^2pPeUt%L6+v-4)yU?OaDʹ9zJ -!+*yZEF,sᛃ|#:$_+DEnLqL*|h8 -iEݭ& -8 /5YPvLtvcⱽЍ3`]Baԏi7L0iaP)BR~LqL0𱚅~>Drxw;ajz*sgEc)@ӭR]Lצ$_'FmUf1?*ja:I}5 kRa_¾CG[}L0 PZZj5? _]J^#1IfG!OftU߅S)w$&c!@lV$CsUr7bSZk1*1TZ/̮!x 77s"ɍJZ6$3Q _Z ϕp,Uz1;wHgqOJ8=( rȦzrWf #JR=C})=e̾cv{fWz`K)L -<~Ҏm v:4EFGN&;!֭'a o(VoY&p'%o07AÍÂ/סdJ p|.pC'87x>Z@/jl6p!Kࣨ~﹵Nz$TaqcfQ! !" # .3l .``\Qs}ʧ0àϙ7gts2~,sVs9sVGHvjJ<$^C>s;[PJ2Wl%ȏ  `$a8xn:C7$w L|Zr%Gd%> c>ȇQn7{WGn`dz'Mt&RuC 8 3MYp+G{m8/҇(=R{;/_i}9}.K}QPLлe$||~z&C"z% -APa1` 4hRZOGIt9+=0=3Da79xWY}4x}QDϳ!jI+դ dY:Z=gyJ!GPGɗ*/;CK>@G^*LzTrXx~O~G5 ~5ZN[0\zM1Πw{.<>/ϜY". Vsk]'|osB0E!#<-<#t [1#~+zi kWRNGD/<Wt=h]ȽO.~,E F2^O޺#"]N߮zF#5rDwߒÇi n#uЯDwS!?*E_ -i9B_%HL]Mv ;1Wr}YtE@>{GԟɗW($ȟ@-YGc+$~Cv"#>LO+Ͷ ,mAs=Ec0V8j";0|!GdYGse4ǽȃ$w ~m -gurg[pkIi0o(6EJnRn0AHpܨGmGB~I=dgjrP#, 7jr3qI/f@]ފ)C1]G'p61n&%oY{O[1|H227|~I@Hat v❫I!)E= &h X}A9#UMHĹ~bXO'c҈;BL"][[&'Ÿ\ýN̆&1.Œ#Mp0bM`fpP?N3هdAnk%&$&jRcK`Y5>ݪ>ԫeilXt_tlACGaYLFzqsdqWՕO W ?:<NϽ--@9!0f!rL;ZMϊ ;&ڍ[3V1a5F+;";ό;(g,{IHfhb*(7ץݓ`慑JO `ogN6RVAU 9]PztR{&1IA1#5zF| >c)w"1 -߷lo݃Fpy^zo# tJaWV <g0/r-WHEt95csVr~`;ME6۝F"=Co{ϡ7^kt E6 ܟ' [}oA}eNQyɚ#k9o?̑#~~ӖIAx=Nc_ 2*l=ھmK5Ra{!v 4/2sL\eeeU+6TWVp*)(Eqo% 74wD@_ Z{`?J4l =K>EkWM!. Pf6_ycsZZitWMb4f/WEto'MGKST|=6Vz~|g"aBXe:|#t7Kb.Z!hXsgdۤG~xϣ_muOtg.*mg'4Lh(k2y`'wiv}J(ūL{t>Nj&h3 8n؛-Ud{)9ECUjuI#zVIVD#F,2ήnUY{e%̭hoxߎ[ϳCj?0*{6AR%TϯV3fQQ>Q:JORYF3 cRf^U0Uȋ3xZds2+NuGޞQfUP0QRAK%cHbg= _YMȧ]4/Hx~r,@{{dPm]PA/(գTH]0ca1~.'pxyEhlXdO #U%!F([JʗT-4977/S+Ԗ,rj'Z9ૣ'hvUS}mm2HfY!z2ag:i#L].44-$Cw7'R@x'&JT,M5l&tӉۉ`OXs#|'.K&dv˙ݍro.-{< Ok77TxJE[;t{g{g^ ;rٓӇUnb - hU5bA=)YW7k$;a//6,-\ DN=+* *EN|]N,(N)=JKHB2z.z#\dIWAp@ p<0.̏]IssےWlil(.636FP mG~ԳOVϯXձ-*a$(mi6. Z$ +HLW1$by%ɍ9Gɛ֟XSG̾ZJC'솊sdgoӗ4P2e c4wPߢDChp9yUZxQLHjt¼1|DJZ\,<z.9&ܳ]%zx4Vz=)nn$AX>ͫ ӋVؒ` c%'T.,xSk{U7ݒ }qtck"]1ڃt{8xS#k|57W4O4q7$P:b$wᩤ Q$E&`G-kFɫpyʊA`$YC5rZXo橙/)5"1#iVVbZMk*lM[WU$xf9$-IYKp&]b魷f{irܜsԅ23N1JIΣ+>G v{N//cs\~!\e?&.+"?Ł@xo6):Fm' F*e٬4ވ||]BL!O8^"Iz0 "0{=)|SbxB9Uq.fڠ7f7g{}%*Sw;5$Z_:p گ[qĸ,"'ձ]2R.x5k]$hc{XO1Xʔbڣjxb3}E#9q<4K))Lyǥ(1|^pּ;R|q+z(mAЕfec\q( o Ǖdh+ŜY vؒ+kwM#d4{솗E K9̥!!&$;E[[2ˢQ-.8OLfRk.30hQXDVuc5rapc^c^\pD;O(n3q|y\UhliZO9,+?{,`KRoEU.`XimLrjI>| ,koq~[_7紐=qO_ͻǻE# #&)/2U*;9o]'Y}tﲩijn|HݴOf)pWvLanQߌݫq^6hk3w |Fp(H8ajU f]ljGPC- 3\yWAy;k155,Qrb40B3bZ Ek&_Ra@ S[FLVпWg޼U6}0y?P+uWzk -⭉xAA/xzs׷f~Ş'Ǖ8M۲#o׍lEjaj":z3ס-;}a#n2b.wJMkt\<ַWvGɆFjS??L&#Q~L`sF&Eg6)pP*<2ȸ٘4||Yh=U?X1\1d!Ӧ^랚xϟDb8V߶PtDQ R.` -{;ZCH"P<Y"yqx2q,=ji S -:ޯs~ND?$!a0 [d"i8HMfdL`-@"yg8h1WPiY:Vcvs?,'aP*6?,9v,v2&FX bҺQ]rIcn5Qaew!)JnVY'}8Dc= ̷/$9R߇GZVgRhq gk:&?໡}}N\1X55Ѩ~_HFrզm|-GHLG}} - .-uPpD*uáwIWU~:[?,5hA$7PCh!!R-`1c/FHGiFՐL^$ORfK3\ؾ=O6_s⹿ntpp2ץ/zew*>5 \c&$S,\cY68&)'&7f |Dc-/0?XS%lo+;RL21$v^eRTXgԫ BbWd,6*KqNNvx&XJYb&QG(z{t*eI  C20gvfXNݯNzAwMmoeh4:6m]'x |. 6A;O,-+BQJhi Y\'vn֊5܃vanAc;]'CJrLr '8&}Bv]0 kR wBէ q,_ %0 CvP3aw89rVK`pPFh6cN!D3Gj;2ќ#.TBKvwwrN$ɿ xjCu~pWׂJ)垞;tR_?v4i Wp~ߑ]rZ! {أ;ʱs4[o&:ʛ"^^bԆM|o‡k/ʎ:L!,I0:]vC -kW}} tJVWƅ#(:c>f Ս-ҭԙֽſ;ßѝt&5~G(ʵq̬ 3֯!/€? -k$)F t4D!}*ͦ"5 IƄ~OQVP,b7ٍ()FCS^P,ľB*O7eQ ZTF:VMg3~[3:y6chx6iZ#ýFN;m2"w͂W= Dᕷїk?P$ή}ճkv< ^`f4حz @b{X<ϮH7`ivk\uf E׵kfG5 eڲb|Ԃ y;d;d̾AD\]~^,ъ -4ۍMl&ò VTz*1*BMgYcNѐ4s}]^v0nSAڡц\o' 5FLc^  3 &^c?L44tvC]׶-o0]C(!!>0EZ&HMZ";C>ij82N@x(~t`Mͽ<>//"_O .6=hڤ2;7 pi,RmK&?VYH˔5 $Z".#vhWl"zz }tEB>'?ycu!EG  e}Ү΋-ƖPSne{oo8t݌E*m;4x.i}GABԉa]"iW,Zz| ~͹s~1<Ҿ* " r -T|j@r.rv'v`"iڊ -ҫ0Ҝb&!v( `GwK4Z% q,~eܞgQ[<9ۢI>\GқnWhG}H47|h hh.#5L`;ajM$VbeJ1.wn]d8`K`qذMy՘+B<$c-a5({myل`Abx%8v00c4O^e( :[x\~lr.\yi;,hU5o$No﹚i$ȕ%+) sدLhpǃϧܩ:H4J9۰Zj@E-VAu'3tT4ڥa)Q&4 IY!:R'tnCv# !xl`?&fqVa#b\ǫQ\^$;Εdy;ݱ+NcU[M!~ v;Yc.x!3=2vou{~ipOd??BkåӤ/MBp F>Qnjdw5ӭ;J KKݘ t'aX/m ׬keQyj⢍r!IvqsUsh\knY $ ZݏMkjq%}X-% 1|-]; nuㅚ=au5nU7a ˼|1KukN'af@`3..hX\?&헺\e`-V=ȭL#dAU Rn)!rVDv -"-@󩤛&~a)Dk{nzZsUW6-uީ^yxW퉽70ktξ{J@!6Q#;*N"Ϳt_:7Xޅ6X^=tnt7]vٙ<7B3,k~Tdz_/>SIjP!YqNE•/03mƂ"!A]|+B -87\\ȤCj. ^^i,5' ->Q6wHvuy<.!|EB6!=y2_Q&zn^\k%ĎeEHi0eX|,̕ڢTmn6uzJ^4B{)Ľ=1?/Du>JCBrsQ/~rYT4ysu-A\?i/f/=KF2 -Q ɵR<3YvNs%:G -Ǻ?ѾX`5E) 9\P`c]1wu@ݴeP43SJ:tE+&h YI -GIknN}X#TrAwxtF.H&FDExo[@!T0VZSI"ȚM:eW6 b]̙3:9iY Z3'Mdԯ-9^˧pR.Iݐi1zʞZ7J#!VZ̢-z4]7W[\_PS]\v#t֞\ģB[=kNJCގvDAD}J/fMvt)3Mx"IR$@7!Dbaݤ?-[YBŻE]{Y&dc}A.:iܑ|Xi=IW~V3DUYZ Oܔ"%c”H&f ?!Ac>(&b("69K6Ds cX#%6)IigfzUrhpB"ոK^ j5',(&+ 1@AIyJ'W4ILbZc% `&J|I t3/O4N#y\gz2U fL%,0jH־tbG]!rH 5mdUq"rJ=uBI{kp׃aOФv8@x7CܧrnX`=V$bKCwGRxM h߁7|&ː&K'<'-F{rSs83Wa~)._ߟ,s%zi=> +EГB? _l1߄__{O~*DcJ jk'djcKH_1/ /FAVfyҤvL/Y߲lt -eo#r'N-=̬er< neZF#B`Y|ExFo7$ OhWʟaSDbZnH ܐ(>[|h0;s_->RfQ<]]N}d4d;Kn$ !?%v2L4$';f+3aЯ(frRv}|=lVu%@S \`lFIDHX/Z<`15TZE]˺Џ Gt_{, 2h[&*JuMDLLFSu!v6乧 GF֙!8-n'CUϜu[xHj~;\iHW 9(K\HslZ"6)$=YIbp6CK g Դc ' CWhŠ LGॲ^tY%zY>iap}mĬgo[=ˌ Eڻvne9CXӚ}Kl7\ӎU<{Wdƞ[g NPΞ6XhAsK^ c8=J`zޠ^ͅ˃8!S cúC]//L8;?"E#5^#&)ĵ1ي(`hN`8K}fi&Ӏuߜx|Ҵ}7B_-!+2 -N"'!a>H٩nln4)tɸ`S[/ [%Ī}ҟ"\4YpZ.iیh9t%h[/t[h(g{jHsq>*ʠVQ/՝Wo(W3 *7u/\~{imk53 WJjxٟ/CxTϻ;,}d<|ҡ6CΧGGF1:F0\JqWE]A93shpR@6=\ 27œ> \glV@! -·~aHQdOUeB(ҎTՏ:QH_a'(S!~tZU2<=uL&-dބ$Jٓ3]HH@։G%A#e9yٳ,dn=nxXk uؿXC[[jKag/{ KbxLZk7\n|~崕VGak$VRJ9&}7`;`b@;5`"xa\G.zYJ`c%=Wv\*43w#Qx;صO[=_yCcywx SMkBe -Uf/ (3pfbH͸iA _)G*gF saRMaukcK9|dB-# XFPQ/(?5? ScOF8EWLSw:b8 --=3.ӆGW - -WތWC3R[D2n  ~K|_oI8[E>($5hZabkYQR-\"n\,J(㥴K?.n{ ;Kff)bdH$`KqUqkMmToU"znmIxǷ^@Twz{ƣLيֲbnHی5õr3m'sON3S KC%8wJL?[*t.m 5b0~^Rmv8 -aPƒaQKO2JԠƽjCOτ3gm#cu&vB!, f50UE?B խLp34>Ik'iL/Y*[%HQRI8tAMgJ Xa5`km 6E겦I!ܞM -?xi\ZiCubKӲ. GaNJK'JqHdE4k5Ŗ&FOZm~MFi]d׏aF/\gK7ߙ?rW蒞߲xr춾}9ots_lj$D^ݶxcB~VP깥иgot0R8g7W.^<{Z `jV䃣<{EK|SKч,&9`Ns`s"xkR Nksb$G_ Aaˍ!w6BkUSjE%Y=gWz]VoiWҮ$빒#?:N$PBHZ iH -)4mG9$-W{4 bJywȏ<+.zP -3mιsؚ+X$I6I\nλϻQnGߠ(&\_ EF`Wvks\N8 -2M)| -c豈KMQH[GpSRk$VNK (fSoHOA)>@OSuC+a_oh9Q$>r{2[' DaN4{cb PFjk*P8;wklB6Դ(ǹgדT=g{bVUs,x{Xۼ:6*nm([oYK`0k+mwj>TY@`2Pej(~U?\bfN{\6+0\ZX| -/F#LTvƘtLb"K OzlPojA -?}&W+WS7wIba} >gO.l3*]Ha3^0,Q" %LJ//}Ex]iqilֱY,t_"s\B"S Dd2#3JQ|;bHքBC(eIfx}6oCɗz<{, m>Kf#_$9Gmz0JDw1jG1g7jùVXY+p5[L's/54z/w޴v~;r5%K}9fN@^8u2&||Xl2ǕrZe\_  p^_Exk0(4 t!!LZL5 E8S’  # Y6&zSM*m/#T|G"aIr@B*ۜl}7*$ËGVeEQ2\P~Xm +9Ex#q#a9H$e@جsv'AUUzl.ۊg : -F8OM !WIlDf2@!cciS:#g_0L'N NfAl0 ,OOecP…O68# W dm aݍDxQfǗr:nuKPXGjSW=ewG(Z j?׶0 AmRsUWvWd/Z,/U 6t1ޭU%Ω[Qrj|E Ty6le**9oI63Il(H/Sݔݶ>O {K2ѷoXx'ePx<|dX'HȋċċzK+${hm΋ɋɋ"|<ಁ=>7<b|I > XhJ6@|xW@$x؝?gU˱0 {|@)!Bֻ !}Cs( nB)sɾλZLx!\ RO5%/ZXN`\\Vmm76 Y|A2L@8L:a%V MS]̖90CFUHj]mʖǔ -I(FAMZWQHЏQCk5ٝe6"L#i<Ӿ)yyd8̰* pN1vf}=,lfr q۹]~ r@A a|q#vk^E׼7uR!&Ak_37|4=_88A y>=-AO0U_`B]A !BjCŸ5JV*R俥 }aCCJ~$2˘|PP(ϷݗY,PT!vP~YbP?f!k(%RҩF`qC>C 44KD6I9:$`>‰iMaemmҶ䶜rq[`(e(-%n[;;wR\Z)^1irJLyrc  |4?xyaqOsۊϴ*JR}e"A|k_#qK_Tw;-T׻oE3`  @泺(Ge7IDDhCJiT\M͹&srxe8,K6KT!X4B1f"|dɢE -`CZQ L,a~”RYŖM,2~&cxd2I&`R%4lj -Dܧ>3C;/mےC-  - -NbڜS4b1sXx҈6k -p` הQeΖEם奫]E'eTR]yу[p䍭mp*_$|#Ž믿tfy $[aE;o0RfQaHF`|k=%z|foΒ,#ħ|D;r (*Ѵ(fN=nq#hA)b p>a?r8CA.tDg4}/č}GBQ^8J̒SzC@P%1Kh=Xa3".V]hYb9"' -vnZl"u/n9^g\. - -P -V!~o8H'p6q5آxGZ#i#zŧO'_?i>i[37)UFك -Ki%g,w2m]O?erஐ ) 'AY %uS硸c"5tU$؀re(z\8\h˗`N%q :hŃ)_#\ ,G,rヰBo-Q0'[,YoS q[cQCzL>b A\^p ;B龲Yzr Eo#3Q;$I\Mh -T@_|!0AC-ki ^HK*ZNE4\5MrQqˉ܁ .'ƪÀDmb|`r`#GŒ"QbKҙl\9CN<~;vag|7@f]ku?"/1>(GUj33즊Ѱm[2c&2ͻM z mm%q8 dMbX@9D;Iu $1HcT` 8D`xdgSBNmHwjCSRdajCCrL_%5uH%UQOCfvlvΆl4:| Ew@s9:)g@Y24Rsuc9~2_%0l@!dxW9(6MkhSiR-Ϛ:p-TNHS;&T}\D/DCr[=( B4K؏IHf |"/ wwCl_>ZfGN7pD8 -{9^8j [ΰ&B#noH>B<tf l}~sӹ~o[` dzPg#եeTY\c~=H~l>COŗMN iҗÏسn8g?-cT#VB,ɻ5;\yP,W -7|G3C.D&kNr `\l!afSr6*ó.lTYElamk7Lјa傎w"@ ʣ H_rGA)36뤕*ZukQrqd8h`Aa|,&Oa4 4d Cβ:uА-χLi@iF_ @x-bԥjj7uJS$>,О -/6)WۥȎ6)f ?8.-Z^aYA>BxL&8[0@3]ɫpw?"wd0wp\]y@ԇɁwVe*MHQT/ r=nLJw!k8Za7L+fѬQWTXa{v K!RNn$_!&ih~K#vN٨^v/8I ~|f -vqc㛎{O;!:VOmL9]dI'zY(xb`ctK`nβgk9dlZbd^: $K28L+6nnq,qX8qSkgZPjArKg7a.-5!zǼǨ9|{z?A}ؚ2؄7Z9lAխ~H`7o~v k(ͬb`$}rXuR{(R˔>cl 6p@&=jc3۬N66~}>!SE\hr.$oilĵ`X|o9aXp - `O < l3$U^i[} mͧ;雙sOw}z_?ݵK&bOq\Xo[?L~) -7 KrZR53&`6Vmr[wf/{c4D[6]K-[;Ԙtb+kt\iw#QҝjG -[AH+<5FzŢ֔֊Ds:T*攺_I8vu X[-b_?@pw/{'H,.;ѹp5%'ȄUA~\$>`,~X{"T5y}D҃Ϣ8JjX[V`FXM̈́77ЦYͪR&U:i`< -4~0L?{q//hڳ`#/XSrwW!>%V }݃Lh> -= ?2˽{{/H {jC/ 5`E*DV3oӟ9k9/7m@isaU+ƫpsr{=cvʅ5">!dɚ¯,i✖E?`if]-ge_sљg/(lϭz>8oM<2vHw5nlĻ`FxMbp?_@B/".uwt=l˝/w1]s<$mw xNj'sG sLsZW'CCyW1H杷53~UUg:<,ZaХm]UzhsFE8 }(9rbq:xrt#<!GKw\I{]ܪdnEsnѕTV7qٰq` +}MOT''_C6QvUȎÕ;\uU!ůl֠xB#k;1 dȓZ#ij 44f j5`tkks'앍:v%obGgo{ VIL2f6lյMe-jWگݬJ7R,] -Z6|.S(v;uk|KE-t ]7G˴4[J6WQVj^E[J&s BګZҋ[MK;3Mݹ<lwl!=aܶ?[ ?OܡaS=װC,ixqQu{ Al|, kN -RtAS']L g0yJ»?"([7H?aisn771czs'ߺ'Q?zOcr7'>O݃߁O6J\71?((jbe₪$QƢQU:q@ wʬĬN3D ((s !cワA?xׂ8__=zV3\<qV3OhIZjٳJ;Ònԏ9+mI|qnǜ Ok|XXH/R_MwV.z} w杖N5 -(#,?Fq<|)pn,Ȼw]ʠ/FȨt+tFQwb4yqjCS%e.~3W([,.o^>kEɶJ{{%ױseԢ|&~L)3eS/?fLX>h3e̔2SfL)3e̔2SrL)3e((a8AOCz9N0urmiɃHS0m\iH;&#V'B:ϯtixAH9ipaG̅iULWOgkf{g{g{[]V0*H]W< ދL%LULs5a? +WgзU!88nGUɗ aL -+<=w{> #pL:`ψp;`݇"|Yt졊EY#S}_޾:LZjIȘ`1,˲2+B&eY%-t~~ 0aY a9^(-GeB0&KV! -!~UJj0 >{꫺-0eL2mdҲ lT-ﱧu 70⇐LL - -&|KXeﳞFV~&V~=Old&S$NItR2|kQ7Y*b&&dDИ`-)A\rtQp&Ip}(]Sk- -$IDyA*R)XMhRdk%S5A#ԿQp&N92dN\jI*ge(XMeLfX~mF$? IUF:ggRfe8SeXeXeXeXeX?Ys - ?YVd>ɦJ }tSEΤ`5)U1*ru[ dݦP}t }tn)XMN0nYIHG9=Qr`3f_DE"xu$+ԊT7 ɲ {qe Q ix@ޅ6}J{G#*3Rg7jGQ x=`%NTŌFģIXdh|҃~hd ؼ7M5BkO{bc2bLb'͵۔w%u2+׊ȞDzŨթHXȒ9kVMŶ4kqzY${iBqA-*N*û+ /Z-vz;VKs``x%XVtI`kt -B&Ioᩝ5lvѹR0tZ nSJSXԝfC鰙1AňQ`X .L_d0MnECA\C{O5!2XlowvXߥMdtbމYVlmMJʪ ׊P:S0]Թ1mXbO9;Z}W%WxWUGT?e:Exnvp>q7>`o '[knr_$? -;r`'v^yo}o=D+ϫTC]^^k;78CWΧwܫOl3z'gZυ$ y'¥R{eJ|rey-7؟I-)/.V|#$ , pwLT|?o9/mP9IwUA*DxUXuR;-R;"Wxԛ^5ӼO3_3xM2mok1Z F>pMZةun`6NxmBծ^pD3+m%*t3!9L7Qez8)9D^!p~/?Q'' ?k=NQww=l6>Odwr&.'/gQLϩG$J -.jPN4癜gQ{fѴ[ۈah7ūݤf'VvVV+HCo[)w9img6UIuU2Uqj`摧bb+3Y ]<+==ثY9JKN\VNe,f%?k`- K'7 gjK&ᗯg42 ϒǾqP= \MkM$F֑Md+Av}9BN"Jn;油\WUp\ٹ6n'rǸS9[ Ph:\OoUɞ2̓;5\r]oQܻˉN=ha6ZY -:ڦ -nVrm<g;nt`C=81yna숬Xlk%c9SěɜYSbh,'r~!¿8h)J > c,W6)4cTX팼O2fUh,ǔ~wqm|_xvJ9 %' l"/bXnR%DIu4Ώ=e{5}FT)yvA]igT غ@'7[㼓j4X&>#.jŝ;sʚf}ĺ?u]D}җ5Ϗ1 -4#mF")y,FcR; }Bs6k1z䬼G..}t ϳ'k:Y;zJ 6]/d.QF`4SMi/Q -%I>( 8kF(=_Mzv~&cgLl\Bo'8ӾGfhq53lv:;gqz^5gRt"8sOܫ)|WsϹk~}.~ǫvj;hfn֮upLc_qU?ol #|wK'V/-7iԕ |#>G_vkQnu/]Jۦ QABJ^M>(ގ1WPTڛg'׫oޭh? QQ DcBz3Ԑ~&kqbF+irgQNGT.Y]z=8sn؆Xۀnڮvݶڀ..خ[kN.ZN؎Ywvm[mg@{l^m֠u2N&`5mvYF6k6Pe -j= [t*Q>m6c鷵wkmYm@6{,հ NI&]S7O#qN b@, r1Yru!Vˬ8zi -lPR*T*W*PǨNFP dV0r5C!] vuwWuۚkl:42jn3~=( cel`| Hy9I?XY,,,و$GxDog!.ϲ6j,e7y^љ< E#Kb](Ig#'V]GZNg"ZԵd eeW񿃦w,,"V[KTȽZ!2P'?O?.wHpj.+ʹrg<~)˯ ~nTU~U&E]UzڨR4kLBm֣*~s+4Ó1[ҹt[tgt723Odg]z>__/}O˳ٖ'rJsr9{sFrur.5 -ӻr'GoɕqM}xJ'!J\&FoѻsFo[eN`Ԣ)zW-CWћrt%7`{_r~GMf7͸k>? 457p3&)(< -U|=1d0神'P= z x67<ѳl_iv)VCסdz1 Z}>VAM>M=2AsA/>03˳Õp%,,{ r6BZWg8}]>.Х+F*h>q#o@VfAy` o}Omfb: -@s7/<45Р B'H>}_F}k { d5y؀:4Rj 9۾ן!C6iC0r#š5y aO1C0-RBQH9 - G!8ARG'/ -@Rb~xug,6=7gfz>Τw 5TJ$)z7s0Շ=v0UͿ:WEj-`|k_߈|lBݍ %5@EXL@5HiƿoaD>Hnh 4 ƴQǨ>6Ϭ9<;=BH{`Ͽ=)_ *f5HE|fi(eۀSԫ@&Gd>r-zůtƓ嗰Wf> _a-380v'8Gc>d-KAb8[Q W Iލ凌k la=t5Ր&I6|}H`e5M`J$- "@B>#@E)eD>wj&$%v@ C7E>o3믁SC RAf9`5fsЋƟCf|H -1䌸jiZ45ބ6/-ފvh%Q˹ڀ\mv/Bh^f d9@zd*kwU4̣Fx3{I[mm5͔ƯbBqq|%Q;bKطS{=il*~daD4y儘^5|ic+@j1 Ż[ZA>2n N&+אB-Ȋ=Ayh0'_(+`~`@@5V ݔTUVmt% a6#\혽Cj*^17V!]CT[ j+Zb1^:ot<<fZ@ivIڌ%~~Ȭ>уQZ}B=$f9x¨O)', 6+>7Sޡ3F<[' 6cu0neoIRyq>vY 4*;^3#dn (tϢDCdIeW&7[17*q=p5~#f]3Lۢe!+;r -_c ^C5zTvNI @~ҿD^6GK^OyMfO64"Mﮐ㌑G~BKd - - -yOGoߒﹻd#y8d5g9~?ϐL27B~?|>y%KKU/"%5._W櫰$ſב*o KFodwzw6xO ҆3|/YIO7Ab&D@.QK4! !]dm #J_hvO:n7tJᆪ_Z^|9ӃnE7ZBOf6 84Ҿ+ j wd1@>.Y?oΖma1N21S+TF׶{N_ ;ZRGT0{oIwDrxkQFG/KjqX˓̎ ;ْ`,p ERбշ@9>-:b%nj{|+kj~|fǐA8k>v~ _|9ҐO96H7} Z/q\mBm_tq׷<};!otI}UA/r}+}G?.=(/LV.Fs3|7SoX*iI־W(ݑs%~"y~-ʰXP𗎗aZR:P_-˥c6UD;X_# 'L+aVKtp],,gGg863m -y:UbS -1nFۄ)4 RaįZG3\5MiRR)xJdGw9N[:]̫- O~xrS'8{:3)ur)Ν nxɄ\=&;2~fD; d`9 Kq'Ӂ|%Bx\D:Xؤs^ ,n28o,rˣwOW.rT .mCK3+P!K3`j?Ez&G/ͮ-tkKu1|5_^Sr,ӝC{Ht$=3]{9訐Os K'OØ<ф8rL9k5WYt=6 -#ϋ?pJb=CX3Z̈N营 mdXn{6yGr -*4JLU^gKnS=61Ź+LXj]bv w<nȗU34\=eĨBc"gEyI -$b3S}bW]`cl1%Vmi `>m :{c \`l8 p9|='X6 ܷBJP BhhD|g:t&Փ:=yK\WM=3C[c`_#k$q "N 'Ix I,8%7JC-tL )?xV% -oW'RbC]/3SWӱ/C ȧALb2q`!7jKÃMKŲ^l; CDŽv1|u,ŪaX$q]b]Tʻ12kܐNj"FDu(b6y Wr^)?9-HHo$>yĻ0)y\8җ<--.loZp峭|M?gUvJVDv>rVeop9@[[mL^E{MNcr97W^t 4Ms~$wH;=#' ]lǘ"}I^ C ;Jgky_U>g~5)MSR -I@ܟ"m.Fkb)J0QD1RH FJiDA)0"""Fd\BA?ٟ:k{>8u+_9 4[ʹ[ݦWzRxbPTCt镛4ڳ Yu-6jqӞ*h̺cy ;J֞W`Oiȩkhȫ;\0>߆ o$~fqaF``ybe?bWY.1;ɿq>m.~,@ bU1Q|lN|I<#9b -,ZDT|WsExO|J?ϋ_%q]∿W(kEQyOrARc賴ZVTQ˻r+eUUYW*V"wl(Q[Jvi@y=Gi?jY|ٹZZ_t/;7_u6ˇo8qwG;ˏ9)?ߙ+9->*9#:L/ڔϧ|UnLIURS廩#SG'S?MO͗BRDwB# F!(١Q1Đ;M f"PM64  dX]>#9GFSΕsEϊ4L#|,>>&ka$Mia%u/O0ywL%Je?.fٟ?!{cw]^l/Q1>]|\{֋"JQ%Bh%8C)388mgqzƹg\3fHlPF(+3`(/46 -顙١hh^hAhahqhYhEhUhMh]hchKh{hghwho] -NBgBBBWCCOwAJŏ(=%S*Us1I\4^f/%g}}Ph%c]9 Br'&9Es -#LBn9h!`ZtҨ4͊!׆_G驌:Xf~tV^k6rcq省˗rSLדMrm0^"n!gŶccVfz6'm}00fو^e3lgslYl"]:ȍ'gx~Y_stm?0`qfCʹaMl_}3Ƅk6Z2cmE7 'Ux-Lqm1VEKe#͑H^6bK{+q'̧~1%q+jthv2ch3h#7⧱E]\{msnF` #"zIy8fLD E_[,حdEqGŒxZE]hob_XYm"kbQuyг1 % =`>3 6펭썭{w@lX?Cus5q"~>Fvkȥ؁ءX{Vhpĺ*bg*2c*g-ȍ]ڿ4^x<ѿ&&:"Dk7Oy/Jܓ_+uJ؇8 -z^ͷ|A_H%F?~_7&&!& dyn0}Oz8h__<ދ݋my\: 80ވ gcxf]5j1cIhWzuOūyU/m:sWtǗ :/1}=:KZ+Y_?_k4=ueՋZIM|xB$O ]N,oGmXUч(sSCw x OP ET?Q'm5YL/i.S`I[ɑ%'KN+Xr[mw;˝suŔ{{{{{{{{{{{{{{{}}E|N( <$`8* u4#'^ݔJp?'NGrDx-- -??ʁQ&Lʛ4vkR1S2)8i:qgNM):iޤOZ6i]#b*ʙ46'wyJp)YD/b(d$T1RN>.J) 3ҏY"|."FRJFG)P(iJxŵb"3S剸{*==5rOgg4z6x6{yvxFx={<=]'=mBqW4s$us顒 M5jO<6O\No7Zt\K,4xs<#ۡ;${!SNdRdAbk+ոIQoxj)6ꑟ z{f=;;Ad Cٶ ިwRy1j.`F+h@]H|PC]]FqS[,=9z*:Dmx7zx;4L,`(Ȼ'o;>oj&<_u<+,kv{w6Mp{w{f8@F3whB)]{|Tzg< 4Wȇ.y<1-KeEC_ot`c`/?=3;7p p(88Lr 3 %Iw5Fƛ+_AG0#9aZ`6|uM05hl&L0ͳ۵ɿٿmۿÿՄtL}w5F{?Nkכ???9?M`Uwkk+j^HZ{ͮ&lRYetn -z@g[`J >aL`&Jfx ,,+(M*_5@^[|om6ǭwTi_||-}V OﰯwIpwLq\?`mnzRR4sOb‡ ?Yި?'{8ikyUk<{(V2ο_o77xzhޤh68:OPXXO'O{J)jo>TR] ƮkP,XNsJ:C0ALwӡNsY]I\NyJfoN{,:mu:Mrttfjܯc rpmM;.Ѧa1ؘMaf8fs{uyNZBue::%֧ܓdZBIhMh{ oGQ?](1 ue5-CݦS۝S͆agݞ O';17Sz[/1ohC;`W4']r]16n]!~C`=Judɗ=L2m-7Ţ!{xp=^nSƙ7wz`8ÌJh|$>X7Qc$Ozu4m2Kz}٦~ɈEgg9W+ch_חo7N_~Be>a#7+={MeWHQ҄_AA&A6AVQ> _GR^D0]7]>4S^F9y\3T,"XBP_k le uබzv%^~h?ߕ&KWߢtj!GAZAfA6]]--PYA~AQoԂe񂪂ESs,-˿T2C Vל #nxo.[79L;& O xodolS E1NKOO7sAq$&n$7Êor'ܩxG1xoś:F^1xǓx oz[ hdi\4]5_ eNJ5$n$JCO)SX[@1Kć9zM>$>ddxS,;a+uF`}<2% ]I' Ibk_~j2KJS{*TtRișSxtdVes/^~!'>ԟ{COR)*S amXA|,\;AZOFe^<[m8O -'l\p:?Hv~y\|A::_ݳ+Jr-"}SC;d`e l-kUîd^6<Ӟ1{xٰ+îU9g2Nd2fSi[2r.dܢHp iv|q6seL''+c8.?I5[$wK3l36s`lɾ!}mTnip?YoFlWƂ9'2q̦DPG2dy$gI*)F// HrV8+*:%q.iϋx7Uf'H}E>"eF7&Q|aFA8P4\X1/P4'hIov<Ot'<= LTBAVqo#b˵`"jyRurՊסVF}vx݇Lcxv<ϰdݱ6hФ@&ضnZIÍbi5d=H 3o>5қh 5Gq*JK"e= H;؞4K괤ݩԖkIm+ i# ppЧ@IOaTeSZ'yEx=MbfPd3y+ Z:9՛:p(,RxEթ[MKRRWN]KH!{!kN5XO9ęLeukm&lJ -ܔc*璿IpjZD*$}KlIkr+J[ 8*c)#Cn ~J7:M1ɺXϗ -V![ˬ^k9ApUjY3K|5ZUFe[MHt'Li ɬq@_t=,8MTS ]y^,Ӕt!tbQ_[sA{ғ4^z:Vk:jmYJSeI'|eJ,ITRoI@Q-,7'u&IZbmAiCusS~f(mjgϿhf<7PT:0=ָJ^/ _SyXPIrk)FYCF5RYr -uB~RT'~}5 ۦ^.#jl[=޾ztgޔ^/g,|?`69&wM²qEzeJ7c9ڲ?0+(:'npv΁L~o-hKa,m{SiKlWzm1;s:o%x>qFFⴡ%匥v |AcWWz@knr(8DvQpSAx h`-V18c?펁%c#MVUvtĩE>OLS # $hY\\ -m.85@-1Vz@G@73V%( - -<͠WLZі%i ϑn£:4#VƐ֫5:pƀ3ku䓵/:++q/i |ږ4c9 -Zr1仡[5>vG -d|vTC*V^dlCaH%24cuC[$4˶1ʩ\Jv>^tn]˳okb*7+ӘhC{ɗix0t!B̑sl- ƩέnGU:S-0T_ٗ_Z9f9Zqpj ٭aD}>Ѝ1,Tb䗃q&ƌcd Q;'CR3;߃ᠻO 8)1B۰:? g/χL"X\DY9y|F'.[幦6JjZJe/;#߶ue j0L1QS=ǺV#dcȥ6Y9v[B}%mıL+G/e\WЯ#? Hk~Mȼv\GF}#<ڻ -4?3mEU_$O7#fC$CY}߇?\Ex{ UPW~+m'pm|m9 3rYK_3_cσ#,<S3-c[k>4r&o ȳ6C?$o&,h4!ߙXK 70ndI7X]aӋmp<ɐCY|22oCrtc1 O {/>djU_!ר[TY٪~ _ރV!p"Q*xV'I7o8?P Iu7/[ D}Ur+0Q e7iRmdbtTTi<8e;,J#$W^Vu -OAϴ,LKcyW@ %啯+?}+ CKg'IQe(#?`hX3t45rrOJWIp.c: BwУ fw=ڞ?% ~ K |pErY^|i>es(} [2|0$y y { TU OGqLVlZi>\I*Ͼ`߳XU -օ ^pw{^eukF k~1!5ذ)o<[T^T jѿ=Q:N݄ [BeE-8sg:mئ7"~;ؿ^~]SuYOᄀw9J+,q" 8tH ]>8y~ͧy`9qﻬ0^ n'8S{cp)$ݳ}4GTH6 >kUB&@,w -hPsx/nB>yX06aY;TAO k]:8u߄5yT(AwE.k|S1nmev5{n.͂s$ղ?%~ '[szHuƖ-/oǘ3[R'9KŬͽiY,:@3*Q=q<:p E1r/[@r)뷔2m b;#,?Oa>r 뀧,[T/lp:+;0&6S9/ş g<|9SJh@ (m?82m :Oݑ |J|-f>9ߊ| -m 4āi'e5N}j+bv.r<.ƺ cxN-QQ -WX2 -CqHXL@%BjOmgls[mo@>#`;Ok CkI,߅VCO? %i.ӎ͓T֣N؁d_ -jQ+=vR_üDZ1¸w;y{oDb ~E.Q^c%Rk'Ohn7 DĶ5afЋ?D]:o#b=ћq_6c_{]Xп{ýy˧Nb2N%d,8px&Pp@ڨM

:7yd q B?@Ѷ-<ÝZx9|[9M/Ƶz=y&}K8CfZr08U/0v#wCzǢ8y'Y/I݀RMF@[K -Z {` mYAWֿ!W3 '+[Z 3΃ 8 O]9z~OA䏀a*T m?3 x ptj3r}ǣiB鿁mB',>L?`u; bGh^X|Xh [CRm$\ $YWck>@*^5C~O-J#_c8*8r0mi,/ZX_g=<:ǡk? 8%8ICPh`hWZlC[wUd}{PQA1!QP1+ (3:fEGgLu9;<3*0_w}{o_{ԩSꜮjZP$8u@78_ ͰP z9D'll5: -ք IM~ d>#8@;}Q -= 4tNSg$~XSS2[AhQ VL؀6@-O ->z'7F/ /wBwNHb3HB3Ō2:6q.)%WpT8t@8I[A^nt/ t&辐Nepy50Ph h~ -r`R}|:ˀ@Q/_fX(t"{%6  sukBڤ@&?B2H|tj#(m zJX`k8N ZE1V&7xU- -~/ !Ia5?ݎ;! ogfW|RTR<+MXnJ-Ve| V&Cꊕ!/}5NƉ X kB &,ĚkB &,ĚkB ]L[yjb,ζ<$3  9(Uй@/pj -}9E$ZWC!hy-M `mY;H@8S7㰚2 {a=2qmNJ@Epנ*{Yїa_B0TЕt;i .3I r[A@4왪\UB x1)hЇ!s ~g_K yK5̂Xux*6$$ ѻ:_x8c᠈Ilsz`BԒEr#Yx,< -K 8Oe1X @Hj`{9(h1REi#fY^'Ϸ Lb ~h3f;N8)3ļADQeW;1v}XkR zJGBĻ6Ӝh]kҲz$X ,1 6$!\-Д.8:fUлͱh+B MHs✴ <9|'~XvfBC ḟg4_Efa;T*# gȷDXUx_y(swh"80]76i+]Ȧvq2ZEs<@BU2PȲAng%9zS }( t?8h~3$/һ*V 49eOz"thH^K`@*%+hG"COp@=Mv TlzyX`dwY JgoE(ۃL G`g`:20Y>QzX(FAE-7tV\ˎho&`t0^4ZG_BD[rƃS3Α$#%{QQLd<1=s 8m%haފHk.<+B'8,t2zB'B?΅i%0Tq乢Gh)\+$!!z|h0|'wsy>ZlZ,)NZR>~"6/Ʈ%7ZsL#+ 0Iz2MmEab1CCm -:^9!bCl 9 -1{ ɶ?G!t=/݄U!1 -֛D-h!c. -33fVGB*wPkӄ&D p ̋uO-w t bqgy<&mĪ=Xw+_CҟY/Nzjjx!vJ /Z Z}VvАL=3SGnJ8v3EphZ pw|k_y8W-lN⽯{p*\>?rUp C@NqfjH΁zB!!$VW~bg8hKhE@L0N!=h;#uK^TxIpp.-Br?f@q0uwj #COx :C4?Ӄm^ЬZ/eh'[@@GHX` xk 2 h3p0 -%%^Z!o#xo# w(۩r6~Yzh2dL𰌑e5") ͢TAQ/69ؑn&x7F 0`4π`O>N񦇡?F6LC"GX, ahrbxx[am>#|z6to%S; ĩ><ݧ[wQb -mBWhPձ8$$%!$D.'I"d(1'?E^K+=~5/ɓ/ Vhu5XoׯGvuV9L,wޠp@pҊWX1 Rm&w .6iLH$DbIFldYDud3MSI5/UfB[p]c܊Z6\jNuq'kp]k܍:"^k އj~\xuC\z{Vx5c5:q.xZǥOx -5ӸY@\ru}A$s*y3t\=sIe*㯺~Gn{ۺG#wu{7#<=PHGGyxd#Kɚ鑧Gy{G^#uϘ7gy{=f?u"#5D GL1ɚGLLIZFI-wėL -4OG\|RCd>*_G26:߂ -P-,Tj +|ቚ/Qj|#2Rz2Vɑ΀RtZSU*%CŕYnP+YI Bh6Ms8:ҩtE<.+*fa =EK*I߹)}N_*̛c X#ք5eY ֒fQ֙ugqRX:Ȇl$ưl<&);6d\=[ Ol[ֳd{Av`g9v]fmv=`sc*D*8+erJRYTS+RC+uJ#UQt 6l6֪ꠖT˨TZERUuՆjmhET{}$D<-/Dh5> -iu>~ԏ0Z$ -IG#EGC+:%t<Old:t -Blt>~vt&Iѹt. R@ 'q+ -Di>)AWդ$]KגRt=]O񗈥6.R =DWz#IzgYF/ҋĝ^WAo -o7R>I%>"T3R/UH5>7>O|XC֐Ƭ11BX3֌PJj0FX 5Y$$X{֞N bX7,XCj@>|R%dR4ReLҀ fIC6 'X"Y6&Mh6Cqli& 9&PrI 6M%alFZl g,J|mDyli cy-[HuŖ$bH;UҞmb7l3L:𹻃td{ҙ`Hv!]qvtciҝegIv'1|f_&F-vdij>I`#ҋ=cHo"-{K#>$I -%b$ɊbCRbJ1WHҔRJ)VJ Uq%Ńd*'(D)U*[K"oś Q|2T1+f2LWp%@ # %d)dR_OJC2Ji4&.J2F 9JO')idzdFd-dodTF&VUmU[2E-'Sj ZZ-M+dZQHfdZUJfjdj {ZW ڄdRmI5J"ooڙvW85,U{25QM$վj_G$zP/j5D9t>]D&{Azg+No{J_ZȺY?֟ `߲al [ZmcnfS^bWMv -SaX")bRz(.JR+ݕ8VUVMګNꢺRkj35LP#j'&ɼ)l̀&!Q4!k)WF+5 򒊼ddT yy8#R 䥒KJ#/A^*䂌䊌T<;MdOd6m*#TAllS ٦:/yy2@2@-d@d d`du"C !2@#dMB"4Ch   %2@82@+dd|uPA,EF"fшvo]]=1Xc'1xxxLDċj>[{G8"z )C96 o4|?a<4| Ca42\Ha,H mFYjJۧ: -߽s+oZx&& Ѿ'Kox -!0<;D$t~N_^xv/^k_$mلh[>yo߆9ůe_jrSR*l$%۴^3ܪUu tk$%-ǯE.%)i1)~::<2%%íр)iߚ˕5j;?kr&_'W8J71{efvit4F엒aʰ -fwͰ2_wJ̵iȜm0Z``fη anl<`kc#M?;IGƾ+hk$_{NUbeĀMwbPj/ݷPl#sOnsOn8V}hʕL -: *.90vFdh1^nt6cJUq{}}s$/ xg%̟nWnZ;L;}ſi;fi|*+W=ھ6xL77D5G7W ˑsȏ{ފ`ZQV֊O]ƌG.\2nqVCs1aYff/fWKN'\Oek_\=1mϒfQ\Ly|:T̈!kUzyjgD3l>ciG-Jjr'EؿpWq!+BYG]tjW˭:ٓ髦 έ7Π~ƭKVߍUtxv{{V%hmOj7a-;r~yIƷݹͭS/M+h9h] Sa.qSu|ǤvΜE7zoW61d3uӪ$ݗzղSY2xsLcb #:3 '@H8~摣fçܪu/_gyǦiˣoM*} ^]Y$K]S;vmO\J?Ծ뛚s@\Fo(>|8BAkm,x -W -ӾҔSw}QT`̀u͹6vdکsںm&<~ɝCh)+4Z!!՘o6x]OW?+%~]c׾>uN>rCr{iדU'[8ӢTܾbkw'l<0W2${7E7gzksiIi}>Zgdc+U -Nl~%' CynFэFw3#y]y)`DܾZ6TcccX;!_%ʔ fo o3eUu59|\RIr$ ໐&߯i jF~Q<nRjңw5b?om5Iw[9isg?ZvleSL͞$m7ck_M.8־Gvmpڹn_xZgdެ3ocj,@Gvބ}:6e*/v\06L~kZ}wHcW+v-fXZ>CyʄY.RVR.m^{rmxeϢzHMy[>g9(4vg~}kʮZ7_ĠTR\H̤5JҊݚ?.u|,CSxQH+g_o{zkҷOm(e|Z35zvpo+ؾn3o7j|%pWή~>]%类:~:2-z]a9=K-5Py.qa V͝]mcjёqkz7||~hٖ"򅒝4"l?zfR[XvIa ~8ݗU]r[??P{Q莜WCpse&#AcvP:'@48 yр"x܆|ȲRgd︷IShO˾W4@ce@A!!!!AH |X"CPdU%/TkPVK* Ӌ 2*&&FoCM22*EΣ CV27ݣs}˧ n -ҞP3-C4<{<όYݾciV?3OXm)j[:㦻yMɜ!u?YڼIw"iڳY:$pH²ns.9v!W y_G&.{>Qy氀 -6uz#Set{cw/6Y$o$'6&&$z%RuCX ȍe a5֩F&fQWkWF~|^~ -D|cbpH,uZ7oh> endobj 243 0 obj [250 0 0 0 0 1000 833 0 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 0 570 0 0 0 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 0 333 0 333 0 0 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 747 0 400 0 0 0 0 576] endobj 240 0 obj [253 0 R] endobj 241 0 obj <>stream -xen0E -/E+@DbчJRKXYǁ%ޙqoF -C7= $QB`JgCH`<ُ(hn3T|< ^5-n>7 IYRmܩnmp[fZϯcV@cȇa#Iu t'@ОG{JԯSc'W\aRk}u vah"e1RzRx:xZc00_6LG<ʐ߁nev`Z!a}~5*rꦞ -endstream endobj 253 0 obj <> endobj 254 0 obj <> endobj 255 0 obj <> endobj 256 0 obj [0[600]32[549 549]35[549]69[549]80[576]100[549]110[603]112[603 400]116[549]120[460]166[713]] endobj 257 0 obj <>stream -x| \[UoIB !/})K(ЍB+(!eRZֺUGǪN]ZPZMj23:c2 #8]\ܗQ}~}9w9{߽I(D@[ʹ t=wgVRϯi| WWT7li| /]5ǶD}2V!H޶ ş1{ :l؞sǏ=~Z{KvNTbjC4/oA>˺EY",jgt쵣JP˴ʔHFey__P[8i}owK?xRӊ(tcE(N.P|P!i»B5qsOk҃R (V@&BKngd{Ww;=Y' ^>e.8!L|\Dr*Zeh<4ĵ@<^%SO}^ӟ: ;{ -*P.K~aB녞g. c0|`;ΓS7ic|oIj{$eqNi7 -'qATQ*D5E/!x b B b!C0bCZ"b?w*!1"o!" KA@@ԃ1b `8C !Q< I Ɉ) -H4t@̀LL K< ِ9+]|n;;_"w! _!k #{w^>~ "D| ķ!8x߂A|  F7a!QQ8x#8`GQģ?$wp <%iħ8Hgg79xy=G? X'? /!/# A *H*#C!ހH#_&[* @+{C  |!a||1|* gJ|.ÿ_ ~%0[3LH[¯?X8x -Np3 g[o;o_=HρK0)EBڎ{kRNvonoKғO]N~vnrSA r](9 ^_7?`W{cbnT׹?S]XB݀G1 7#2'l8W >>5Ŵ4&+s!@0 76x`W - -P 2/6(IH5cۜW N[A0B3jO{T£{ _ɋ\XBݺfV3 nm Oc6( =QfԔ<0z6{'J`A݆@w>ڣЌ .h]6x'/ -B! *5fEP茚v wf)K]Jm ΤΞ fԔ u pfɋ;?%tNH$>$4 N,=? ^rңq-{+csbs-O^w=s< 3jHic҃>{|\0yQ hCq'H$+I8fNӔ Z'eRԕ_;Ȑ K"OB3jJqsژ )1RtAyt3%'ϞRgԔ<4i*pJ|O^AϿDF*OBY3jfP33;yka}]! ., |'(dic*x'-O Ե49f% -[wPLΣP0iJ|EA׷ ܿ󾗤<A?{E$T9J -y~bz/"':@'~ &-]}N<2axb#QO\t^cS|{^2K\T2h^a~^nNvVfFzZjJrRbB|!V/DGEF´!A?_J飐xeU5 &`X$ -l--c$1a%[HiI0dӄJ`{ ڋ(%ZEF'ʰ -FJۢʦ -loD,7[i0T!Bʦ5"x/je 7TTt -4V^PY7HlB$R76YM.u#tPsa$R-kj}b6fXl<:v2Cu힋k |_4ރ^7%*}C%-i(| Cpl‡lP;?n<*P}Ao+04*"GavpTgtkF4Nǎ;a(IRUӞ%T#R`P4e FOZpD:l>MCbZN0t0 _.1Jd@I'ӱS-5ՖBCD^c:.;SfxCJ8ݯnfdl;/np4Gcfji5'jBVњS5ӏ70K;ĦH l/P/g}U BP˷U8g:e *o`#DR-ia4m\ӓsmu\!Sf`h'>*'اpNOɇGm"p|8C>*Ƀ -OV( -L)({TiMQ$ZPfe` bv U͂LN8a!VAU0ۼ*\V+5Kmnx}Bknp!t44pA@Ѣ -ԙꞪVc1:*ENKtX*RiXCQJQdq]w l7 v6 ˆkANhj6ӻb;bT، -almP1*F-ʌeSEQ!#){guwTwG!4ߢ4&Sh5{=Vk5RtW6(`a#Nv>ʨ8Mƅׇx?Sڧ/^*,Va*?uU혯x<`qa!nNiʎ -z&GC19ol~9JklQ7arN"Xr&.2x&i`f 'Mwׂ!N {sE\xç -k1@K񰕎Gp=!^g< _oimXY9_ۂ+j8|uצ6<9ox93 JofY&GΙ Rk4J%53%G 8J蕝88''yiq >T aP 98QIQ.YjΌ9Ơqeg؄<ʃeX{uBlafVϔeg665?|应(+0?n{9`k+K˕땝J(D}xP0S!RʂJaX6JI$ RxtX9V>\GpQuNsj,||< =>^ZRRRnH7XD3'/)Yl A@rx=a?^9;+@bΚ&0jYKƀB~1e㦎e;Ө`'(Íʀ"V1Ɗq}op^L8:EF*wyI@z%7|R.;8e74 B0"q ArP% Q*HB!3;!<.**"2*\GGEJUzȒXA.SOH>595.}4~kcT1I,+g PmhnNaqy}+;+&O/YhK9gI]ʒ Mש]~=a & 08?둽Q ogȼ67DuX5h !k7?L!,#3NzFmXVm&jC f t&CKX]Xh7NՆ 1K(5eG~WFTZ*>Uc^RBQKT$yf.=AOi!|!_OЅX,dN-a"WfM&e Y/ٙ&.42~eDC4n1)yB;`mNb Mzi\ތo(1FAWJbsR!RDƺ$]~/rt*/5x~NN@CfH|V\=?I$uSIqxCwdBix8R|И;O/&Aˉ'0C<ʏ'B<:jJ~%&XZ?h Nnb#o  ,P \@ÉR%$N/ZJפW\{o/Ӓe9% )E[)5?=}O;9իs뭯ve쭈푾ڸj.P?K!ɩlylonzJ g74GAr " Q5 FUzfn^i}Juc|)V5%%)ʛ2:l"Z. S:$>)hQ Ğq}jݶLcvcZݐ^hl[~YJki]] yywŸ{/Y8ic\:Ē7Ci)aXehPN,3FFY UDe|mT %)Ivr/tcD]..?"1i>kΌkSp7adt҄>(t..]~^eNXKU&4W-ki}<}u2Thƨ#c.eouܿ5+6:gٵk{.k4YS`L(Ldz6qumނJQ! WS5E+8K↓J>d;񣳓nq04c!dE NMJW'hIt0B*!&0*}2蜌 [P-%qNYswryg_Ω!2]``]-_0 {Wnz`}NL*ژ+_;Ϊ\f{c%wV:|ll}#{_z|{a9 ؙ( urEGPp?3 W+rٙQ}ӗ&f-3pL4?;<|}%n { w{4yFucC-Bl}| Ad 6nAN֮ ~2J3CdvR,T/3*?*b*N -FNs.5͋[ \Td2y~憂6$!t5$qe$ݿ?M}+7WO~"zF݀H7}kϼRQPeLKSfG=qJ@nc>n$&^:ƥBE`)q$C*A*@G|UA|Hh Bsf!nGykyƩ´b;8j׆W]~.ÇkE-pjcp('c}>]`k;=%(> -yRI7ܸ*LƇ]\wſ3AOfEuFt_йߥ;HמJ[ߍu앢^gf6n?WS~rF9瘷OdʜM8@Nr{yp`$}}Y.c9,?r*uQ ! ; !+K0F9]N֏NNIR=tóhfM]Sq2tD(rn04_tvpH0jywd~0sImݎH&qJR[fO>64و SWO׎ eߜ-++N)r|O;yawhèVUCNh52 .ڗc]d4\D I $Z./hDhCu;EPy.?Yc]4&CE@?}`!V2FYVAEUe|"]WD+l?רKڭ܏NP%:@DɇH~pҡn:ٻ$:BfL';Mh;n:+W]ZZMfp@o==V,{z{L֎nӜ!T&oBeBmG[_[,-Sru]=B񀥯fgf I澞Vkrmso:?#+Hut_hO[}н"Ttt +Z[;ЌyEBkOU0#:.KPc"t}&l:Swٳg6[҄֎}gq,n6[7;-Y>aK]0a'T*tl;ںʹY-}Xһ]oVvvSlE3a 3@m@#-=}2S}Wo'Z{|J|G]:~+JZ$g[ř[lr2[lvufvY Z#bRH͊/]Q#X$,_Z^YSW)-U*PcftǠ]dZaZp%+W-/H޾f+K{Ywt;7賖N쀺7P{;dLi{JڣJx Q (k_'nm͗4H^.::ז-ݝ=&NQiSU CGǞV2@gʴ[:{Xu$)ىw;j L 0\3 _|lD37u`{7 A {';>($0oތwU]-֬.)ʥ{%4ay$!`I'>TTn[*Z,iç/q[PvA_5WUg]ҐdwҐ=Be_B12։QbET* -QZx%ZlḦy{:3r-u_\9f`ȼp@3×# IPS`$UDfT$-j}@ c{Ŷh<͢ EIr#Q QۑXEȜO$6JQX. x6@A5F(~0@ []KE?3 {A$%)xdp x -g0#ϡwΦ $#9+`ϡ!Ӑh`y.y읆}rGT^ "@X&4g7{!HwY0YH'*b#}k @VAq hK-. K܊@mNosoe̙K#Dj,ZA/9_ z\;'6 VuC ~ClXp=-+!?v>ddz ? pdZ4"D¯T$G*;qYs| E%~WF>:Up ;#Wz,wo:, -zT+ațkCp.;oWʶ4;1,>jUpAr6īiGz$͌i#hBF8F?3 3&(eWp8n g lX#l=X3 wU\ؿV aQp)BOO#ȁ2X8_*12|j<SFt-K} չ84AX31G6O>^N8F FA o -f8&v:;ϟTbJ@Llxi4#bS+ֳSW$MU4PQǬ HBpW\P%F!H@bp7Ud/)4 -J0zŹHt -A;%xKJ8R a$cť8HE'|/t =[?_7uut Csuw%̇$J -j' PARe R@D]gdzP&ZqU\(,-&*j>_ο=4)zͤk~5ͺ%{/;)\`0f$0#BWƂ6_s,5QY;Hԧ 1s靷i\ven;zm $ha6{!=4,7Rܣ-#,ָX9ɻYD8gzІ[_Pe|`i_Q2{F>mK|%G ]ʚ `IU&`] <Ʃ@ʐLB'. -aܩp1 -ȉ8^0hd-- e,=N"!'Gbif!*'h°,@C<% ͟op4MQe0P&xް%f2KvR=C{xU}\,Fk:XWQFcTUj{âqe$Q{MO}ר6:QOn/xCƔ##VN Vj.>?#d07=Iڐ&[ (Tl? -۵?{Gåm"K#F.~uz?Q{VDnН2G/{mȕr*ʡ5>?Q%41H[ *|btH^>~@M<, "*[>˵\#RlcUyRj-E8! 1!)-$1teYJ FzD&~0%1]Nu:^61ӯBݼz{lޓ :]_H8]V^wjMpf֓͗2--ǜ7pY6*$5BY* . ,ߤgnͨt@uVE*![G4+I~廟! Qwl8̹nQԈyup~;I-}i24t}}[Ӂ1lˏB?h+T/5VXg^[q l8,ĉ̆aT=jqӏĶe-6W! DMX-<$˞,,AZަ.aatE$= ,JDD%pRVO7qQɈ[4yxmyl z/v4ɭsD9+o.3F~P韝ն\VSz ]HŰppUŠ]5RMv.e;x$r/7$Kl]>ys[QʔnGʾ ;/hISQ@yD%֬1^;a??里/H1qŧMkqfaqP%J|nB%Ȇ"h';8onn1TH{%Po4cKh'Ѣ^trN -5:|iy#U,F_h12Z_̍:bR͵9aI-fJqKez߭ҍ%)bKd':$G]JC-ux2rsk.w 4@_d4Յr *7z QVqqx"6}2n5 -{X@R_XvXW׸^ ^Vȷ?ov73VYӴ.IG"sv=2%m*V\GlQFJ<(җ ?&[9\JW?sQAyoPs˲ J!+ -@}d=c,H>R8n?tBhn] -5Qaɥ L c$w﷡(?ݡoY3[WKD>܄upƱ۔nP7RVĢ=7?T&VuV(nhl,XsGQUcQeNi[eVR|ڗA MNk }~')g(Z*%7]*7eړ_E)iYA۷{rhJ~Ln ->cg/Jц >]#4 jv+-u34M T{n[HG ½ڜp|_)Td$}3_J 鿪 O38)J4TN>aVdPſ&F]Hۑ5bِp=ySbK|;OOX,,u>k쐁'ߪQBҢ(mYמJ.Q"`C~A"YeP/~xe^\w{􊛌 u9r}RYu4^ܰNÂNn0,yګ]:C%0qwl,+HUMr!7,gw΁-> endobj 239 0 obj [250 0 0 500 0 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 0 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 760 0 400 549 0 0 0 576 0 0 0 0 0 0 0 750 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 0 0 0 0 0 0 444 0 0 0 278] endobj 229 0 obj <> endobj 230 0 obj <> endobj 231 0 obj <> endobj 201 0 obj <> endobj 204 0 obj <> endobj 207 0 obj <> endobj 210 0 obj <> endobj 213 0 obj <> endobj 216 0 obj <> endobj 219 0 obj <> endobj 222 0 obj <> endobj 225 0 obj <> endobj 228 0 obj <> endobj 226 0 obj <> endobj 227 0 obj <> endobj 223 0 obj <> endobj 224 0 obj <> endobj 220 0 obj <> endobj 221 0 obj <> endobj 217 0 obj <> endobj 218 0 obj <> endobj 214 0 obj <> endobj 215 0 obj <> endobj 211 0 obj <> endobj 212 0 obj <> endobj 208 0 obj <> endobj 209 0 obj <> endobj 205 0 obj <> endobj 206 0 obj <> endobj 202 0 obj <> endobj 203 0 obj <> endobj 199 0 obj <> endobj 200 0 obj <> endobj 198 0 obj <> endobj 196 0 obj <> endobj 197 0 obj <> endobj 132 0 obj <> endobj 139 0 obj <> endobj 147 0 obj <> endobj 155 0 obj <> endobj 163 0 obj <> endobj 171 0 obj <> endobj 179 0 obj <> endobj 187 0 obj <> endobj 195 0 obj <> endobj 188 0 obj <> endobj 189 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 192 0 obj <> endobj 193 0 obj <> endobj 194 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 182 0 obj <> endobj 183 0 obj <> endobj 184 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> endobj 174 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 177 0 obj <> endobj 178 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <> endobj 166 0 obj <> endobj 167 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 160 0 obj <> endobj 161 0 obj <> endobj 162 0 obj <> endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 140 0 obj <> endobj 141 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 4 0 obj <> endobj xref -0 258 -0000000000 65535 f -0000000016 00000 n -0000000122 00000 n -0000003708 00000 n -0000115380 00000 n -0000003791 00000 n -0000011056 00000 n -0000003890 00000 n -0000003938 00000 n -0000004814 00000 n -0000010876 00000 n -0000005064 00000 n -0000005111 00000 n -0000005158 00000 n -0000005206 00000 n -0000005254 00000 n -0000005302 00000 n -0000005350 00000 n -0000005401 00000 n -0000005449 00000 n -0000005497 00000 n -0000005545 00000 n -0000005594 00000 n -0000005643 00000 n -0000005692 00000 n -0000005744 00000 n -0000005793 00000 n -0000005842 00000 n -0000005891 00000 n -0000005940 00000 n -0000005989 00000 n -0000006038 00000 n -0000006087 00000 n -0000006139 00000 n -0000006188 00000 n -0000006237 00000 n -0000006286 00000 n -0000006335 00000 n -0000006384 00000 n -0000006433 00000 n -0000006482 00000 n -0000006534 00000 n -0000006583 00000 n -0000006632 00000 n -0000006681 00000 n -0000006730 00000 n -0000006779 00000 n -0000006828 00000 n -0000006877 00000 n -0000006929 00000 n -0000006978 00000 n -0000007027 00000 n -0000007076 00000 n -0000007125 00000 n -0000007174 00000 n -0000007223 00000 n -0000007272 00000 n -0000007324 00000 n -0000007373 00000 n -0000007422 00000 n -0000007471 00000 n -0000007520 00000 n -0000007569 00000 n -0000007618 00000 n -0000007667 00000 n -0000007719 00000 n -0000007768 00000 n -0000007817 00000 n -0000007866 00000 n -0000007915 00000 n -0000007964 00000 n -0000008013 00000 n -0000008062 00000 n -0000008114 00000 n -0000008163 00000 n -0000008212 00000 n -0000008261 00000 n -0000008310 00000 n -0000008359 00000 n -0000008408 00000 n -0000008457 00000 n -0000008509 00000 n -0000008557 00000 n -0000008605 00000 n -0000008653 00000 n -0000008701 00000 n -0000008749 00000 n -0000008797 00000 n -0000008845 00000 n -0000008893 00000 n -0000008942 00000 n -0000008991 00000 n -0000009043 00000 n -0000009091 00000 n -0000009140 00000 n -0000009189 00000 n -0000009241 00000 n -0000009290 00000 n -0000009339 00000 n -0000009391 00000 n -0000009440 00000 n -0000009490 00000 n -0000009543 00000 n -0000009593 00000 n -0000009643 00000 n -0000009696 00000 n -0000009746 00000 n -0000009796 00000 n -0000009849 00000 n -0000009899 00000 n -0000009949 00000 n -0000010002 00000 n -0000010053 00000 n -0000010104 00000 n -0000010158 00000 n -0000010209 00000 n -0000010260 00000 n -0000010314 00000 n -0000010365 00000 n -0000010416 00000 n -0000010470 00000 n -0000010521 00000 n -0000010572 00000 n -0000010626 00000 n -0000010676 00000 n -0000010726 00000 n -0000010776 00000 n -0000010826 00000 n -0000115160 00000 n -0000115215 00000 n -0000115270 00000 n -0000115325 00000 n -0000111159 00000 n -0000114830 00000 n -0000114885 00000 n -0000114940 00000 n -0000114995 00000 n -0000115050 00000 n -0000115105 00000 n -0000111247 00000 n -0000114445 00000 n -0000114500 00000 n -0000114555 00000 n -0000114610 00000 n -0000114665 00000 n -0000114720 00000 n -0000114775 00000 n -0000111351 00000 n -0000114060 00000 n -0000114115 00000 n -0000114170 00000 n -0000114225 00000 n -0000114280 00000 n -0000114335 00000 n -0000114390 00000 n -0000111463 00000 n -0000113675 00000 n -0000113730 00000 n -0000113785 00000 n -0000113840 00000 n -0000113895 00000 n -0000113950 00000 n -0000114005 00000 n -0000111575 00000 n -0000113290 00000 n -0000113345 00000 n -0000113400 00000 n -0000113455 00000 n -0000113510 00000 n -0000113565 00000 n -0000113620 00000 n -0000111687 00000 n -0000112905 00000 n -0000112960 00000 n -0000113015 00000 n -0000113070 00000 n -0000113125 00000 n -0000113180 00000 n -0000113235 00000 n -0000111799 00000 n -0000112520 00000 n -0000112575 00000 n -0000112630 00000 n -0000112685 00000 n -0000112740 00000 n -0000112795 00000 n -0000112850 00000 n -0000111911 00000 n -0000112135 00000 n -0000112190 00000 n -0000112245 00000 n -0000112300 00000 n -0000112355 00000 n -0000112410 00000 n -0000112465 00000 n -0000112023 00000 n -0000111049 00000 n -0000111104 00000 n -0000110977 00000 n -0000110867 00000 n -0000110922 00000 n -0000109134 00000 n -0000110757 00000 n -0000110812 00000 n -0000109206 00000 n -0000110646 00000 n -0000110701 00000 n -0000109278 00000 n -0000110534 00000 n -0000110590 00000 n -0000109351 00000 n -0000110422 00000 n -0000110478 00000 n -0000109424 00000 n -0000110310 00000 n -0000110366 00000 n -0000109497 00000 n -0000110198 00000 n -0000110254 00000 n -0000109570 00000 n -0000110086 00000 n -0000110142 00000 n -0000109643 00000 n -0000109974 00000 n -0000110030 00000 n -0000109716 00000 n -0000109862 00000 n -0000109918 00000 n -0000109789 00000 n -0000108822 00000 n -0000108945 00000 n -0000109003 00000 n -0000011335 00000 n -0000020867 00000 n -0000021042 00000 n -0000021166 00000 n -0000021346 00000 n -0000021488 00000 n -0000107974 00000 n -0000108209 00000 n -0000092470 00000 n -0000092497 00000 n -0000091749 00000 n -0000091989 00000 n -0000022265 00000 n -0000022292 00000 n -0000021670 00000 n -0000021916 00000 n -0000022594 00000 n -0000022765 00000 n -0000022835 00000 n -0000023093 00000 n -0000023491 00000 n -0000092865 00000 n -0000093018 00000 n -0000093088 00000 n -0000093315 00000 n -0000093425 00000 n -trailer -<]>> -startxref -115627 -%%EOF diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/81 Pirimicarb_RAR_20_Volume_3CP_A10788A (_Pirimor_)_B-9_2017-12-04_Page54.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/81 Pirimicarb_RAR_20_Volume_3CP_A10788A (_Pirimor_)_B-9_2017-12-04_Page54.pdf deleted file mode 100644 index 35343f69..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/81 Pirimicarb_RAR_20_Volume_3CP_A10788A (_Pirimor_)_B-9_2017-12-04_Page54.pdf +++ /dev/null @@ -1,1013 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/Metadata 2 0 R/Pages 3 0 R/StructTreeRoot 5 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - 2023-04-24T16:50:26+02:00 - 2023-04-24T16:50:26+02:00 - 2023-04-24T16:50:26+02:00 - Microsoft® Word 2010 - application/pdf - - - Pirimicarb_RAR_21_Volume_3CP_A10788A ('Pirimor')_B-9_2016-mm-dd - - - - - l.riffaut - - - uuid:4471c0f9-1eca-4f08-a9b5-fae52ed64237 - uuid:d501c872-9a25-4f46-a39e-74787edd5bc6 - Microsoft® Word 2010 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 5 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 141 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <> endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 155 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 160 0 obj <> endobj 161 0 obj <> endobj 162 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <> endobj 166 0 obj <> endobj 167 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 171 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> endobj 174 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 177 0 obj <> endobj 178 0 obj <> endobj 179 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 182 0 obj <> endobj 183 0 obj <> endobj 184 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 358 0 obj <> endobj 6 0 obj <>/MediaBox[0 0 595.32 841.92]/Parent 3 0 R/Resources<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/Page>> endobj 360 0 obj <>stream -x]mna@f!`9Q.wg9 |AVj։"UQĖ5ŪE6y/yo/7n˷/N/???/LJWvۯz ݽ}WfW]WuCw(ۏ_U޻~~9?/7<~c<3;eǛc[?_ۿoy*Лkj^v!eSF U7}\;f<:SmNetTEs(fmqmQۛUfC~G -de{l~ekCMI+Ԕع|׍=9v¹z:}ջ_O;w}{_1`* `CG - i]bC?B7n~8zjQšREa.-,Je`䣲3 `-I7 8֤Xm[IHhE0f4ph[$4,y&UefY܄*In:`CivdFrBe+dmY(ߣۿ[Ҿ\3|sHeg_A'Y 回`LrmpcINvoiѳYT0 G;~pf7gmʲkt軲}Y pG50H;MRbJNa]j -!:ZU0bmcU;%t}%t"{Y RC2nC -4b$8{x8-B )%iRGJAKYG\rp/XjR`7V'K'.D\F,q>c>L"ӛE26sC15 )L0!㘚`u'69)%)eWk3u|y:9r/Q\ea- A߸a[?)ip<=p ӳ#E<ЦW-ۃw[@sr N-fTBŊA -! H.@A.[.], bE$م))ڳjOSEY~`" GE_D'<_@",2BZw_H&` Id/Z7&^C0Z;L{wGRnn'?yH3B'cv_供g9"[s$:9 Dc$:44IYN"@B I$'Xɜv ^In8xwYƑ 8PKT8*QVUfla0Iw[@Ei(bN-![H@xucܢ,)tznAi:r59@n9Pp[->  bE$EYSnAs g-՞ԧrvhEn "q 4ṅ#6-F',@[H@"len!Y -p;-$LH0ṅ$Fp2]-][tͬM"ɍ4?V}}s9agi%,!-/S|t#8r?t[B -|F,̡XJa@SOg1Z6QYU0b44i gci:Ҙ59@9Иo!FC ƬHB1]1k 4f]q;_ap: ڙERKf0H#:GjԀ@j yR#Y*tUH&ʑIdNj>iWP3Fw=Wxմ-Ro-qiߏ3~yG/JCtG`dcc~# p \"ήU pg8+0$]UE|e kd$+j2g$b.A _$ 'Y$$bFUøI 8%%(HC`%xY{Ur%ZB N ΑћҾG+ UZ{I!&6ۮvv]]bb]v.LLKngb]f$v] G:il41 Im0'c`%7J9+ۄ5Le?}~䞸ۿ9L8It:RELP'P*fԈSck0R yfic=P][w竉<[8XDw"<OԞ:w@駏4TMڊ S(fj>,OBiQM7"<W՞g鷭'%˳,C=Dx~\[) !ZW% i"m"MfNML&~_Wx51oOpaL R@ba.S9:R=ړe#R -D)byRx R"n2")("ҽFy/ٜm,wNuXɓIķ>EpAKӓBz4t\NWc[UIoBS O8,# Ôcķ\v~2"g`Dsz{F$֛>``!#"hE`DkrsHL}"FD)>2I@FIoro#"XF³_PV{R~ˆ,1XeDB`D(L<##ADjdFcTcMr[k1ěm[[D7X#͜mˆ$ҭƾpbi?N w!,3s-xI/~f*2l؆޹}y#?ҽňO=BtCƊ9<;ҽz}$kib5C%PiҠ-F|Y -'zמth+>lo{Ɂ14IGj1ad"δm)%1_L’U'$55yM.0f$윍l)6윍&Jr3g(M톯EW5GwҹPMl[k`šP -Dve \lí{K*KjK橋)!yҶҶy"JgȘB@_ԅJ,'2Fhi9;$; -U L]}~]0_G󛢨hW/zƼjݿko^ݿzѸ󵯼U*W/LmP\KogSkXt~c -..]Շo?fS7~R<.E$k%#<ω F~ -ŲK55&NttpRV9Ci> -5Y@61S8!VN.Њ4*1S8#,]"BO=V|R.aN/9M2A@PTȃ&6ɻ[𔈇Ixh|Ã9U܍|{ӹL›>^;O'onN '2L*ˬi*NOγ.X9t$ߣ>Ϻ:bW70 6 -){%u_>w} irpN5ůrF5/ Xv/@{krPMcҽ!9Az(#SPV4*nttowe͡gdOT4 |ݶفKANU♢u#&xmY6UZe^ -Djm0ֲ-@uģ]m~/|%ywrl}OR{"-ƝJi{1](hUXV97ڇ%uǏpAX -ujNq4b 7iaY[Z)?.[+v산z/#zxno״p5؇yy2W ڿy|j'>z=eWê}L)y[ik `2~nb,]/z #FV8#l:>jems]6"kUeU]YtCDI h4{Pw&Mm5 /;npnᱰ=+} MӳtwGfnp»n.) B, nz [xwal*q)סK~'l̑o9d]%ׅLyẀvD[ (W]9=(6;[̿+_.Vt@PQrm -f/1a`U[BsNLPzٖ&$&g6oJ LIz\,ó;Vp"rGH*w標k-|W~t -tw}:_4q^ -tf 7".=۲nGOBv}@5-(;SzG$bR9+JYOtWFC{/10YͅQA *K,;NDǡt:CӪ6༈`"N ^..]&.HɺHvt*0vSE1M.ʸB]V.J=)6`M,m!`eHh3.j+l;н nWn~燿9Y1$`X -'7\x4VAip=~2+|%dޜHƆ0 "H$R^@MC6ȕxA̻@ ȼ|tPK  Тhk[o]/*HQYꨐFe.*-2$H5 -RFߏz*e'jЊ2゘Y fV H3GT3kC:6 hlLA *`:3ÂQhZ oeNsI3r^ qIi/'kf$ұqf\H'/F- '7XP ӖN`&p$!+3hH۫&#?Qi-B -jE-4QHlIB~Rzn459HSkGnflV4ՌƯ <^"}!5eO#,8ߝx9' ҇_ْ7:g[mq*wWb8™uؑPT yB't175U7ulV*`eۢY|oB)`#JlExjAv_̊96-3[Z1HWl -h3JM0/zYT/>9DŢYBәz5AQh3삁ʝ3J!NzQ^Ԛ7O{&nHɺEv'2PLitKuK-M}^6?{hVwlwWIh$$X2 &!#I=5T~z͗6c}T.3u[ޔrMwZrk<5JIѩ|Am8No7[T^^چ\wJ?=?j}K/wJ/Gz}ƠHx1NFG'+yWPX7*=ųwe8 -mWj33,QÁ/qЛd4'NyYÍn$ d '8(1DOq#IpWJp'Va7e5;6+;W;$LhL0#:wB6Qf))B\?˸E%?"}G)‹-C5S>~3ҫ'|q;[au&-Ȍma*w(%5̀^ -XɌyA.(m 307 ;y&Y !&A+J-<6UAV='<*zChMʃ8]R$'Huǡ/ljG vX^֔&Sы(F(؅X ] -uQe(:Ӛή.pDw<$/ɬV&I̮č<"Qyd\%3, ^v\@+QyL<)o)yY~|[f^eI)W4_4np=|&vwCO/g͗~LXyVMlԹ')(&B dP 鳬 UqX ?upP$@4ފĕ!/ƀЎ҄oP3#,Ր!q=dEP~:ʀ-d;. WEVdEɪq^u4Ewڐ(P -h\SԐXX -EL=),E*`"jK*`*UD*I "YȮV@R-{ -Z%I*WUJ*'V`Gk%Y5,i% h",hdD6Tg gbTύZ]oHر^eZ]?9(:>g~«kk.8r!q=knCwm!xrzpFmS,u?ZHbű&/aMKjrTb2[򺀰>y SBr-ulNPTUaOתܠ0k&Bn5z+,.q]@0k4{6#UU_+Rċ~ġlPP얮qIAI BNuhN2rMKiMgEy&<2o"O[&I'9W OJ'O> endobj 362 0 obj <> endobj 363 0 obj <> endobj 364 0 obj <> endobj 365 0 obj <> endobj 374 0 obj <> endobj 375 0 obj [250 0 0 500 0 833 778 0 333 333 500 0 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 0 675 675 0 0 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 0 0 556 389 0 389 0 500 0 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400 0 0 0 0 576] endobj 372 0 obj [376 0 R] endobj 373 0 obj <>stream -x}Sn0+|yHQ$AʡTF*N_{7*ٝ]kΊyo0uj }l刘M5W۲s\l n$a ޳ѴnW丯ݨ }Ζ/w] [PN֦sٽ[`.ěa?69gǾ& jjk軲] 8 7_ʒRT}?dOQ5璣Ose<&u"9#2"2'rAdd(͉ M9xć^ɧr$q7eUQhH E;ihbR>>ZfT4DL ޥȨ'r"C"w)$^ÈHZWbc~_Vh_i׫fi~n^_v6 X -endstream endobj 376 0 obj <> endobj 377 0 obj <> endobj 378 0 obj <> endobj 379 0 obj [0[778]3[250]5[408 500]8[833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444]36[722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333]64[333]66[500]68[444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444]97[541]103[722]106[444]112[444 444]115[444]124[500]129[500]131[400]134[500 350]137[500 760]147[549 549 549]151[576]177[500]179[444 444 333 333]238[564]240[300]242[750]302[524]386[750 750]] endobj 380 0 obj <>stream -x `jծծӖdY/$'2spB)Bi(%(-P@Q6=9‘J Gz@Hrl|\4^<pFsfo-͇? ivcSju) @sI߭~?>{8?uۚ%x;Κ=mqK-yTUȧ_\^ikl;%b{炆ym/^q4S4~JxW[,[W?UoIby),Z*\W,Ķ6Leub̿,*жXLHC~.^  _1Zssֽk O@ L2U3Ȩ -ǠjjՆ+.pz7E5|Q!B́jP 5j?BAj1䣖@A(B2(B-ZIPZ UT'Ay} SNP2wU50u:Z:o0΂j(Ԡ֡z0 =hY!Bu -sPA# ͨa6 %.,A+0/,QRmu, Q]POŨg@[(SQ;a j,E]vհ u z&꛰QϢz6@'Ѕy2:lUݰ|Xz?a-TP/PT/sQQ _MT/n|Q_p+p!!*\z\5ԃp5\z |군)~KQPoz#ln+P_A՛Jԭ -V\ߦz\z;\z\}CN.up߇oލnFnACG-mp;@}j ^ u'lC}0|/ -<G >uqgTQw// -~kE-@}v> >Eix8GP> }>xEKu<< /P_V + TB:7ߢ'Ax<*<?gP_Pߠ&<o^ԣm]x /;ԿR}^F= ~>!O'_pTP?WOT Q?#qx=['OwOOO?J}QӏR~ԧ>(GOOO7O7O7O7OשOשO#ԧ>GO?L}aS~רOרOWOWOCԧ>釨O?H}AR~ԧ>ѧ+|~Sԧ>}?OWOWOOOQ/Q/Q"/R"/R/P/P}ԧ>Q}ԧ>}/{OK}^ӟ>yӟ>yӟ>9ӟ>9ӟ>Yӟ>Yӟ>}{OC}P=ԧ?C}P=ԧ?M}ԧ?M}ԧ?E}Sԧ?E}Sԧ?9|z1̧OWȧ?|^krS$V+~hY^/Պz(ՈI Z:NyjHOn:Z钅T(Nvji 3CrP tIWWCǏ>H bdwpFx`0 FZ~rd02NV[Vz^(Jz$iu$IzIDI4bu2qƑȐ b+%{M`0 #-,bjpPl%JZAK$V$[a@єN0IfI2ȑbLVnz[ḁU7Sڻ&b+D`ac+59H>wl%Vh0c[Fb#CXl5.hx`0 FZXl%,92$0˼ HtR?:`hpdMd202U@b+I (`Hu(aYKNDxBV<0.$}pw Il1% Fd<~衱䌷 `%'G#3ly -4hU!0݀JðiɲhlTe3XcJS.Dk%YpLqYH930M4 a_8kmAuB Fl2gD H bdHO=46`0؊1J8T[jzI ~d2"EUQLوG6b" c+I!`T`ЋѠQcB042b+<簟kA4$:a7)mle&5XleLHCO=xGx`0 FZFЌ  L`iEdDAoGcXeZb%XdVU&I4*&JƉNb!aY%SB0424V=݁ey%wrkN XwcAkfK4mA SY1m`0iai%|S׋38ZI(&Y6bUQm6ͦM(3d@eNIl2 zPmh9!0;Rs%_r4+NҾC`=H bdH7eM`0 #-{WDVV -]ZAQV*Ӳ9n0-^]Ts8,$R $%E'8LҠSo$c+# -VNZsmULVi!*h3[ΑȐ b+Y1fՌ `VQ"(e|ѨXE(Hj%{ZrerY]rl?`VaPIR%FIQ\BDJ7T" - T#Xܩs{^09H1J"!yic,2#1!lC `e,n͘4$c+,HfStV(Yn:\m'Š؊bCb2I.U%QT"Jr"b+ ,8g`l5ܞAsV6<`" Fd[9Ί 6T?&0 [1F,$ יL6d ~$Pӿy}F |r|>')IdIU"e2lVբBŁzohe#M肌ۇ\D:+NxҾC 3XebȐ 6~衋o HX|cBR€lq@8(l491n}l+;ˬf{"ٮl˛!PnuXedtBNá&=a#(; ޏ]9p`kt].Wrc!jP'\@ '/-|şFc0)# b7vVL8tEmm`0iai%ʖd /WTפdW?&!b C!o( -CA -)N48.j]ΠIo%VooHEB# -0V4fx<~-D]| \i!^Ù- b+#</Ί P|M`0 #-;-D|eoϵp[1dt Fd[̈PzM`0 #-c%; ɔsl8}PZ(YlլQl7懲-`E~~v~nV(?*??D.Y>|XݫqV|d'%|?`i -,><'369u'\@V٠BafK4Ө‘wI3vVL8So HX|cBRsa)(ŕ )6EGQC -B0gRQQ(?.*ZT&eټY8T)8K~͓R{>^vIheTl blr;vO0;$(l=(A Y1\8&0 u `oI`}9P]er:CyŖӏՖ奥voy~mEE4RPQ1t"Ǚ l9I9ז*IKOTK_Gk4zu_$!\' YCn /K ?cQ#1!l6`0ō[jfsg <6G^?GQQQ&WVN)+<œ5aʔ)ES6ORF6ܡ<|#=Fyyɑ\<%xzPT^B04@dpϵAА:a+73[A w+& R-m`0iai%[/\MQ_P9\E\y0zjmUYm?T[9vj٤~C/R_a]UAWaaMa6uU$rZ+zSB4tolϵr#W9)`b+cH bdHt@n0 NKpl O8G>NL/wѠ- fsy9ky8 @ΰxb2V'fXor+~uҏc<Ckm9P?%*1PBcMs;]7 -=p% z_8·n؉׸~hp!̉V'(&٬pϟr 7_PXT\RZV^qReդSVO^;c&4g̙:S/Xhq۩Kw,;mxyF>6N ય5=@jnM|6'Ï j }7^9?-:k5ӪN<Ғ‚Hn8' dg}^۬U1&ANk8(i -7wcy1m^k@Eg,U̓Ă[pp(}V|-۶}`khGD;{.4[:c)ִ&9/kí z:k6(^ߖ,q\6+5'/EIEMgu[ my#Qx:~LMd.mD}z_ 6ΖvB8/~a)|<} L=<Ӵ-1 jkFg6tt7 p.onL^5_ׁObW/m sW/^}\ޫ4 ;r}W3ՐZRIZ9|WjD߷+ -ji=^Su$T봉(#O>5@X7ʻw'_U@'_bYǤ_TüHC_SU8і”DagQi:ä 1jgAY:+82P830i agn^]?`5Tl V'[iTBFz\ݨ{1t 6?1݈ALZPP1'5v~;yWP1mt#&-.Ᏸ}ِc㷂ki~7^̿٘I~WvImoo%[އ-xLo&/@]̷{j]61U`ⱴK[q鶒%.=+1_q. ҝ.O6\Kq/ŕWRbӦTM>& l>pU*x+)u߈Nc1_E 6rױ? /;E+g=ƟKɪd /D\!}5;%]ӛȱ9uf~|쨹&ajĤWO"D́5k/i+9JX [RN[,*@m/o_+x]_|w -l&6c̸۸ר !ᘠ -BTX t -f&a $ܤtj +Q.mWҘ`%J|U\_A L+ T#^,\G -S -*7*iYSwUoI!LjZ3!ci.x$㑌j>F U xZw |>oHwbh1'%c5GwrBn[!wS!UWAZ++"+ -VܣPhggEf̺G[.ߣ @AyӮa[\QIx+*u5Yzxci&AԀ}kV`{A $H]HfP;Oޚust&什i} 쿍PScxtp˨[oe -Lݘt<sXJfF ` &- Kq~$*o"uƄ귨^Cuܨy\gsX`&s[::y~\X'l.qPrP=jI !2Ώ]Ycj$Bu.ռ1 6 / Sr١j6UQ) -HqF- 4⽵u}[;މzko7|fǹ0, ̂0aj"47s -5^+pȑ?k#O>;_nE7|Iy$\or%%}"6O=؁þ%ki=al]ߎqoljl(W=9Z'5 Ӱs{>bJα@1/LM9u꣚ɠ-____җ,_o*EhEQF?-& *-Q--BlNƷjZs1k+Ǧbŭ1qi;8x -c?UB<56D4k645t}%MH=ƎnnPK2m'n+_U_{;޳&+ ܬ @ 1!ȮEL@1Sħqq!D!#ȸ 88F'*:/3LH;uZV9u;U*}AasZ4^8ޫW8&d^4Cyʛ DY<]݁BrI@'<?5<`d U`sAj.CV.phxox`!ef9 Gʟ˖-[a,p(זzlɡCrSe=pvyU̐M'KΔЖΒ=%ϔ+Vؓ3>k:}{|$1kdo> 㫪RsX_'XyxpŌ2.gN,s1O,b?c'f܎`~sYzca%>ArzsFb={p=mp]5i.)q`}4W[fDq,o0Yd9,Ga_FOr^, /06{p9CK'lAR CAek+x};Ż1ג$JFa|>ru#}S#dI&B69MN!CWGƑ3CVHM?z#^$!W;Ar"m ҇Qs b>Ud)FEѯ!wF(- OpL#OӐ=EdTwӯ&%1wN0zy#zLZ}&MF19`k"Y%~y{ȣ`SO_Ж;m wS4U]C*25X P< ^OAuHG~ttALo_ ?z+jҁ+߇}lȦv)0\}d/CB )x"Ѹ5U4JR \"1Y8g`>\H9Cq7Y63zmN>עFa4BfB~\=M^"T#/o"m>GO{oSkbzwib4L0:a'98G%ES ;d -;x$R2,@܆Ծ8yVB:}:VbzMS$%r1P!V' -!23|}0|VƮaNv{^h -AȒњF?p]!FH!<ŸZl%wK%'='_^\BfMp7Ix^3aE h)t>݄>zOϳx6LvQZb6qjjY֥ԡO"$\y1U*\ \f\({1=xB"(kPQGiHC8t5&DZLa& 0Cla#l LG8SPbP4D3iTLi D=}YXv6kei.AB) ۅ3‡E1IӒ[ʓIg%Cwu]UT@z/IeJg`'J?Epf)&kMnq|<le 裬~Z:z|,I,f]$ -gt~%X5U`Dq*.GORL)2 )wçn6}B>ELSӅt!BVXz'w j'j!@ "$h%K~" O8T:D PneZRAj:-=/e% AS!KP!Ĵ*Dw 89bPaid*" MRC I.67"OD6 :DK;텍 q@ԯ[ux]B"S6L70WzN|L;!'crڜ?.RIpDVÑʓ;ț@:\X:a<""BQh_'  -m1HtFӢ#&dXOBbڣ?6#ģ87Oѻ+ÇjF+On&EgHndVh>%SI% 7!>ODĞ(E&̣YbL:KCxϏ#'vS8A_@lSѓ(eD8Ւx)aB4n BP$`ġRm%,f9 䒇$"J)~^AAr}8&zJ#\q<DNOz{ل3e!Z$ta`p[9@JJM_fgA󄡺,WcƩ/%_REff$,3gGRVY:^ 5y\e᣽ל陾7}?Yy=߃K&l8XFcTzj7 (+q5B ߛ岛7 L`䎿ϻh5F. osdC%ahm nڀحʭSFGg,EB[~zZ!yYZ\}a4xLv9@&Ip4Y}$AG-aOt /@1XHڱ,jF#M6]B $ڏMU\J)U c 0e4~"U~q_3FmЊ)-U(504`B ż -bY^ +@I6ic>.H ec(1)ز '&%Kx 3s4EazqjqHX Ƃtrs0Sk=i@O{Y}5nrsWBAȱ_ -.\>t_9ymչmdkR/'>Le\?=× >w/Lro=mBablg_;dOܿxTg\nD?/,dc2y$5}5TRƭbg4.2%|[r?&ZNKsCY5fUS|SJSܫ,#^o[9e)zM^}cƎgBZFzV -rSXKF](_lʳLKeiͤzHUP aPA^v`(HM31ҵ0\X{uHKv=](|gO\C:e Err/2܌{z2:lN~h#:ZMD_PG5șu֬oLwo"oD`I/mWpn[dXIWOѩg\nP3X/,ΝK0L%qeqqiWUMrOjt7Vr,_Vj;7Ul˱3]p[qp7 -=S&T 9y+JN$ -rmXH*X+酣?6oZ! Y *xSU{lPiwg$h JQ#jԗ -ŁϾ*(,s^QVF -2rUp2´r7|ܼU5鉉Ʀ\EY@5C/IpRRMcԬIHOO^DlL9Ts&ӓ f;VJLK.XU`ڜʚj3e; cqz3DϷ %:GveLQ{4B&)SBZtRJvM!*"Zuab54l4 /XQhR%6t'<4o>:؀|O)a -U1皽V#1:?#ƩϒAE^#v2MzK679:JXr$Vb5ae^HuIF#5:?8 - s["Jj/P aX2URq5;#|u&NS]q~7_43abG"KF v@ PsC-B, Qq"?|F:-HX'cF.ȥأyFC5jЊ2:!VʌLߗEX{F,Qg8Jqh+uIre&u>&}S腖OEv3a1tlZ: \=ώ $g= E+ W/X M`_PF҂{'B8Hnhh0q`ѯd/JPIw'L];$Ir5C\ lzl%j,bMfb񓻖Xnh6sUdWLr\Ew-ڇ|_*j-X\R\?>>y9EŋEw?I(:в,U"#Eb6';]>@$wSfPtzLiGOcu :r TCAԨ es~ݸeNq # L4֖(5s)" -G5lv7,ZJfEhhVpʅWmt" hBj}$.iǃDX oP9tEvGUy '/6[D5Au@%ɞ녙3c*A'c^_8g? `Z!Apn'8TΡKssnwzT'vS IE^e[ k4rC^+M =^T e>liX-TE<Ú<]qP qNzҿQ5u&anje50ЊykxS'5g44ևG Pg9;>dI\RK96| {*CFUr`> Kn 8?CYՂN/?c齑lu̷;'y&[_4y}9PBZ,to\3:aTYAm=@e3Td# -F@ DIo@cU8JfJҫI 'a" "H$EAN5̓u P(*P9cСC%@OK2LCm%"03Hȥ6FZ7'\;w4]do$'`.EjՌJ%^H+ >qab.'%lOP|ZttkkqMo$~PLj2N*Nj&Wx]xr"^x-I"#MsB?z+;c=סr B9oS?*GL ^~YM]&jrByS"?E@#s٬H.? lh6Áqb YXh1q4AlG'KU ?-]c/YP6M8e٪-~W(fn~#w.>*6y׼WF.3(2\SWhVjo٠9: I ֱj&P%唘]YĎ# Ftζ8ȝ2sT9ʩM]}BsE,&ǒe-;,]řr E -tj@:-QiMlB|b<C0#Bdmc=ħǂt:`a˸}s^lrA.2΍]mo_ֶ/ ;:w-w N 9}Y=pGf UnYycA-:1"Dz,S-l8 TM9 M.:>}$)d.F3|s>^xHtNx'~%`dNDy%яНG -\r 6 1^^rqQ( # 8?C7N= Rlkͺ&7A ;IǟxEyۊ$A &妆ZrW:tW{C#5ckGhDe˺ 6тd.Mf@L 6 1cH1Ԑ0]DB:?( w L[)tθN.a>؇lO}:9)*&TL`tX&zWHP -]%1WCBq]sM&/S9)+/_? u u@e;; La < <'35莫!-.dĢE h";7Ls:lZ9ׂWگ<[.)[ixctPQG/t*ȾU^9o^G~v7ߴ!8uƓjw/sҼ7W^6M^xy 2#_UmZ!MAMxeNBsׄΉ΅*qzU[<Է[ug -Co!Ā@TqC ?Cˆ$k2-I"gOu׳v;188xĚb=,"))LNiJJKRcړZu?30 ~8`a*W;YmM?d6#1v2c$(&T083 89@MNU{[ּ{?yhnlwԗ5f+ :zxہ/~Y~=an-ץ⑝w3'ija~g2QЍ.+>2=r+i˕wy_ZfY9١;lR>*Aq=~2Gv{/b|Gj8|]ql(;07j0/p$oy_s;y<@p~O - f p,y?w }h!;qHtTuQ@@$aeU:6,$$1NbTg 8qtb凙"T9sr -P)g"-b! -"(tubH2ť"E-R4.ۈQ:+FS-RDY*`jÁK <# .Аˁi`Ԩ."4X - yo%E3}I'QݎT#dQ ?f!h<B"gI$"&Y C0&Y$ÇkO/F)6KJ.4(QO T -@&" -@"[*.]6Faذ?B)=Hʐ`9R6:V>d|v?ըKĺ8dҡZ|C#i%ɞ͑}Oz;r{lƃtn2?MnWL܍y%opma^y{~X>:('I97r!Aa_D$*"a&Yg!#>W9>p{=nrn({!TpC``y,keC ʡ;\{{e O WpuNhדѥ&C;!PpiZqǑ.?͊ -:i+ӊB}(U:ZµP<$qvvHظTf &k?ډOkﴧSh&YW'ik^ 禶@7O-3ĂG[ؐjꠐ %t0o@Zmw Lhh^O/0/,`+-nz[R--o*,^`)UWT)$Xfl}ҥ՟I~KcIٌh,-%]m'Wax)ooJ9H帉66`@P[<8qxu:Cp&/۔J-"ElU #݋醏$e ;E -E k͚vg%/Ӣ ŒL ^Hd]:%e -@7 -(.Pʷf[/n!9? SհWKTWj-jw-' ^zϷ'/?pa*_eׇhW-XѻYl0GuZs^ ^ݶô}v.[~oɌ_G~c搭Nh\fnp{N2ZzoF-Ay]&Jw<˻ -!jq ͜`?DOܿ:輑Z hq'*"xӴEܜ#5zQpڋ}f3'N}zNI_HC 47[@Q9Wpz'N}^֦aGq *$Ĝcz[Q&{kWzΟVWN?_ym$on^Z)/ Uww/{t>?t%Ḳve쑻+!V_f|` ^i֢HcɩjPI\NLnm@5C0 C#sPǺ8dA4z8I!7nJrH-%oZxuq(~FrAʣ*ɜ׼I !Z"neabֳz6%:uK -Mpd<>OW&M k+Z7{ENk_-q*(LjuϦC@6h&mw~({(Z]ُLΚڬ=:~se1جuQ!4D),N,Y\wʊTu?@œTO4洖J%?A*12=SfŢ0/~#G']i.IWLNFdd{)/fHe}yUe0 5 e9͉E~i}_g;5 &]W 2ÇΤ)H(?:I7|1+Ze֍jP51z;z3+5y)nfT( yhѼy#Wm7wJs{L?4o69퇛,瘀/!iW:fYEv`˄ȲYfrB\'&! >b@ # 6x5IVZ+d峄Ukt?jV2E!n AVqƘ>Bl\bexw˟g3Qx tr|C7Z7^>h:ַ~W*Hj`65,j7WNh9}'73xq{!MnFM10(mh#Zqh!c~A0<bD_bC#' 01Xh""ѕGWrՊ6t>J$ra.lT[DoO%~+nԳ3)GbL6;""XQrjl"MPcPljܣHGAiG'҄v54+xbЈc1鱞أ#1KlF?eS0e+uaq䅿WgGUS0JPp]m"H^nj?vdu^A72>~m288|Dw$DD~\R5 ~s\{/K/V TecJJDG5ҥнU$DEXP*[ ndY1Y,%A`Yz:.`aK&1H ;4}gѡbDXQ*>Q!fʗ'FJW@WWupߑTĞənD81n{{@O.a,@ *"D~1@kxaxh`iF 7:هiY:kGgXK1vQ %dcOhCqz8^k4:uZŎ|H9B8`I8 -Vbp'L,ho?˂j} -$<9E8|Tk~1d"^wCk\/2 -nk\+եۛ_r7S@0M!l3 n06í^>ס¡&` Z[@vj_lrXlҋ`+usKEk-#湘*OGt):%hLRJKAl>_% { #íQ8ɂ+RZN/M&(RJ+HE\N/ -F&RNLuE),N4OҩES@`Nq^rAW11[ǍKS[Z2`J ,s -L.]ϛ͠ Cp0N9?7AT\ 9{,5gOtZ~Ť@+I-GS ->ܮEN\23Q;hui:SK!}!V{(ܡz.cX󅆉.7uwugq߅Y;lQoihl2(*S:,tU멠I6fIw7Ɛ炸l8G״*K -%k.Hͦ-ꊳ' -4 a/Mw\Xnc*RjX}nZZE?!u$'\Agpu&ƃ.q9X"ޜ_->OODSEb>EzJLE428%PK޴Z)7RĻԃ. ѦMo^7:xTcϨ/յ`Z`r~. -5*f!Rc9bENbx5/ a:.FA -E zޫ=/AP0V(]OY: \,UUwW-v 4sQ΍3I#^bty|1U .H  x -y^QJ^G.|Ye+C#G[n T+1@"Dpۀ<|F:JZ{]3SNZG~>;s+*uV+#)&ol<-F>EdWR)1cM@ !A -6xzVyd7b? -3$Mn+ŏ;OU8CA$`F`zF2 t>AZ ->uj2a1[nlV!(d@Uک|jp07@8Pl{9~ٹW N#kBȓP2>mQʂ_(Cއ`>GkTSXn UT{)#) ĀX)%ۑ`aA7~\ds LWyyfRJA˯"3`eśn1]:K[b+~R$hƣmE0CmhĈ?]V[&k^V~V/N4 On$ 6/N~3:6gB -| R`Y2@2B=!shZrGrsGrt +A"VXސUqUӷp&Y$q"Un]@XL Y0ZRФx\NǙbrtbBՆ>Ї1,,_0p?{%obȒYk*+?UViƞ۟8b}΃3L7Y,K4}D}䦏ho{iA]yq)Kqju5Q`ԗ()OFD@(Z%s-1pCWxeb*УM@J5:_52{4a|Y9"A3vlUD_&qh:_͘TTJS+K8~M=  [_y;ZC*+/5mn];{v~s#_ɌX8 -pNS)Mev!08<9DK|bv]T - - -JGQz=nsu'7iYgYt"H1R¥ST*LCaLzPuEWǗ:ug9g2(P*(%S v5.eh˸'y6$bow_{-{tKXZg@2l8KRd"S n"pyWQ2%d0ҍt<+cE|s17)r`#9Rڌ)%#srќ)LdhMfw˾3xpoV[^,qh6{fZ:I'SK[@\irslނe'h4s틝7gq KV5v+t\9)?!ZOuuh]F"9Ӛ=8o섏^֌?0$0iIU?\zl "d~Pi~Bb ~Ǭz1N)Xu6OP2/ϗM!#vlѷ.Ptc'#k//c犈ZAs2%tu@GAPպLZvD %Η"cL7_Yy32Q(nr< gUsŽ|Q']m p1mi\iY͙j7&'vL -n[ߒVW5U(RPՑ'(4G~ -jih܇'HGV+k8ʬ@ -Yd׋}C+A_5N~+JzGqݤ+Q(af03u~g$S%@M?2V1 cs IfJͩ6p*qYsvh(`K$Y$LU;`c3IINp [udp 6Pn#x^Vq6+c2#DOف. "k-J'a'ѡZOvXZ,[oO;Ҟt(#եS͖rO\̰O:-s9lmcNhxe̾$DZZXiZiYɬq ֆWEoe^_ohjs5tN)SB;]"O2{lC}音E>N_A_Ҹj+-+_k0.3W*S3.ivj`:عvP6|]842eh9'B Z$6UJ؁-,H[ ɨìj #%,eA y%O:oofwf̾ɾd7I&MJ4mچ&A8`Pz h=KhCIAQKGǣB"9VnMvoyVZ*hA$h4l.-L&łm3~sD_UʏgyZG} e'\7.w w.9eELTqԕN{,0,<^DDJ]5cc#5@PҙJ%5u -G޳.8 ,jj=߸3MmX~ -cuisَt[He*KtXUlFxw3&;mzG1JNpUnUQn#XV6I#чcDž''O<{>|s՗/J/UAGNQ)z!Kr[*SXMgug2#;s9]2ƏɌ1y6T{RÕE&{2K)9 $Q",'_7%p\{ -Be\e0t/sIR.+)Yh\X4DzzP#FRlK-П;A?1@UYg:AJ#t`mY t$;RZF -遌bD@i4y ~4{A$$s7& ރU~m]S䶖EPkؘp%pnx= - SW no]̔HįmA_:lQ"/2/meW?`Ow2 ڄ&Mstp3''MY^ &`3 k׳l5\X1 -()9fSAV(c9g9du >v1zT6N -, 8.za2@XF֘) a.%4CF.!9y 2s$1ն~dP?; pBrn?'j7Ru*PZI86I` б&F7211B#Mcvn\@O[oJ8j@ ɤ(LO6+(ZC nrqxHO%%uIqT—=굋F KI%cz?h -_7Q$T.T+_sqL[uno׆}ZQ{>9]ַV0>SuM -rJ)BM¥a؉uD$Q! -0բre,Y;*$v) 3e -a% [i6"Ɠ&ơ8jz@ 9<Bu3&iStCLVNW-+Wt\~zA㽦{Ͷ{ծ3g3(3Z-<_,.~h0+_VD$1M=@ vJ)6 L+²~7AE&NːMҳ{MO8ÿfUx5S/Lt< &hFhkm[}ͤ5#YSƊ[U|bH3R#9Y3hB <ԢZ~;tL=ƟN>rfzB/m~|\/@ޱ;^V0E1w?A)݉ WN VM@aVusZX9-T5≰lM8`X]Z5i &uD>E1>T 5q|&C"X@DjrP8^LK%-:nx@zpez;A^2Yv;j8jE\(NmޫAu>lT͇ƠFbtOx2|s8|m;q+ [QՒnB]͆'&&jUkҪ\"IZcXki@9ܘo 7_&׮ -ls8cG"$d“R)W<& Ik+Y0uLXsĆ+}Ǐ~fŰu Ifg-x]L9\or: ׿q3T*Z_c7;+1&nc4fmHj$'@{GJogӑ- )w^~[s~=nJ maq@!) $N0@؇%D?|Z0W&J` VfdyES 2#׏!->D*h iȠ:!8>܃zL9h߷R,F! o2JteKm蟘XWh- ۝NfɝA -!ڈ^_ R# M!^/FShPG 2PjSaAD[sWMWJ&oOP7ۈ/;r3)D OR'kSMYhIpӎzDe#R$buJꑿժZ}2SZ-JײkziUKbeX=cS|Nx}%noQ 5Zko5#F[>=?Ozəde87Z&M]]D1xm]M/8}ѫ6{wD>ǣL`Xkyc -&0BuM`G4< -@*&[F` )K u[f'ʓ0dƦڣpj jj - 1)\`j6VJeR/RmK,V'ƍ&4gB6Ӥ'& T"Cl$3Lft3 =APh1s6L?~@+IJTT2dWԙD 3纥 1mZ=V$_q&!dAk5#ՔWk:npWjc.sV?rvOz훻$1,Vչp-xu6;MzM{L^p_T{fNQqBE& N1bBh"'aoElP||7gI` Gci$Kv8eX|qxByb0J`#`d ߲:UuG)Jn-5G|;A'GP([RuIsVQ7GlXb\/G -80u늤-whm&iլ_Z)_{yŷR(9Y#2V㴇OU[|->K\THFmYEx"L[E%Vm^XkGLOgnLMQZ +4ּ7bKHqs b@ -Z%Ag8cqNӴ6*3|q/K[@H7$zpMoqM4m$o}١Z/6۬lGw~yW$:ڿ~TYM8r;ٱq+_l<ǀҬ S7dCbW.E\>Gh"4 f}'x+|+[8.9儊qU8̜S֭44Xh )'\Ynq;fG\&"My=<;]^2^b,+BvT:{ܲmċTw;;r|S058DF w)ugy4£ ~y=ܳFljeA~F& _V~kDȮCLgv1R"1mN^}t0ߠyx$`q^!{)^}H3ثMJ ~mq` 6N;U} N3rNb`l(U%vmvR4Na'C@v)_~G;L| ~aWo(K=ܺMAwOn =0ʌd buȎpq,X,§V%tӂB3DKX5Z]fNɉ~;xDB`)duKuw;`]'Ο݃apA6:888ե|-P䞗U z,[v~: s3~'b]`;;G3A| młfǰR-5h{S;9:ڛ^Wǔp~Ǻ}nwG{ MCj)mD]b-̱:=Wȋ^>{\KhRQI7ex9ߎ&v FF虡!!zwyC0: .}H& *" Lj =mD, ڢZ}ՈQ>OP뼄X9{sk4Hhd#֝wpSbj[_rv^.Y M;jY/ g|-c[ۨugόcF54zڒl1x'I!q@@!$1 $@ %h!N_< -%@{)|[NOmX{y|u2fFkkծ`!O哭kG쾭~ӥ!_ݔ7* tѓZ ?>g)R&0>/MuF]NW bZa*+Cʦʾ%GѡPT4Qc7'jˬnL#@^1BnvuLq-~g[?~|n^O=boV_B=eM'dKCp};׊ -4fD<2Ri۫hnװUgpU*iUyLd!ka Xka@"ip?{Bx*gێg?} b;dqܼntXn=XGzTs ޫ?A TxU Ӡ1lϩFOI<$Ua@Lwflemmٯ0?}u. 7ic(0T*-z wx [GIQt^IHz&YrE}9ʍs9Jb^PUPx pO3FؘuX^60끥\(LHP9t$Z֮Jl -ysD<"AJ+f>c9ԛ3'a1&Zt:$P.woђT{:XWNIeŋמrcuclrWޞ~x?AUEɵˮ=?6/D4O&, x!JʤS7)i.d!.8lqMEe ޹ ,М"lErlE2JR9 UIʑFn<ԁ]T֮rPř2ilRmlMجlܥ|=mʷ#ߌ=cG'B?WәO2jF^σ'r=qA ZoXADcŵdY] (Q0 -0CM ȗ}o|8חmN"LmLPt GɆ-%R@"T4\P6}(xXWgΙ⍜INLىRiIJ_dwN}m߿qO]4^w?!T5)x+NsƘ< -%+kJbi: S~mhF6QlG1b_Jș+I(vF}N)䠠zYоr %aۍd $+|R(؂EXQFG+xh5=)VY 46Bo'y4;h -FZAi9l/:?U@Kh&Bp0E6hXa|D4UO% U jQGӏ̮2mc ű隻348}͸Hu..'|/W8/8o93Du?y_VXM_QP- !e)P^rC^ \)s*@T?<H1w-f,`lV#hFM -vd1Pl$"H:+1^gVD[6yY-ZHj[k#_M6$-<_jWbt^jo'$M8y+ī+alVΒ7l^Î5ɇƥhiSidK@5vAu II Aì]ֲ7g^j܇2\杈X5e_ky=΄(W r:Vߟg*$4Rښޚz,~{ꃐ#ʹENByx1? *E%AQ7^_[D1wi^Dž%Z},^}DD'iFy &}= G3( -l Ԇ+9 `DMi1!8J9h%vio |p0jcv^ee"c&QUp[mQw,i&D-e bG>]cm!O r˹ϷO`|" ʐՆ/$}8pRFٝR*$܂f@j⍭:R-UVq!WfXs,S68z{"| Xͪ"j2J N>Nt }kllp+]j.Js }͗_FG{-lX,\[;܂_\W*_tp -Xt=+ ]]W~fq )t;`>xpՃ2O3ZӜW$43YQ0p$9fadc { -~f ԃhéfEFxOOl;` P{ۃ vX(h#+~R//F:!h⨣B'4 ^>"ۀW)ǐbLe+CB>@9ec,=0뮿!Ѥ]DXMf8Ga&(,7p(,T5u$Lq %"*678Ӿ_`-e){t?uShI5^[IgWvMݑOHY: - Y[ԛޒE.2|.MJ ҢVފļP0ӚiM^ ptdx/ac$K)|mY%h@oIݼ{6_ӴzQ((~33ELuh`5]͏c7?>LUkʁ.xS׽c|zmGXd8MV+M2v3ѩ/'.Km̢D446.NN%<.֎ ǴciMG mt6eMW}B{rR^aG߭N؝]I44`cHg#Ϲ"|TDY0 -<0$-26%)o:ҠE2 щKpx"Qd$d\:ӰEQё@ 6 @^%HtYx ql"pЦz58Z53![Pݗ(<X-$|; 0Freey8HG()av8i*մ>>>Gsi(4z676<eiJP -m͔ VĬOv,O*bꀙ{fkD\&a_B>2m=D{a,y==jᣧ}xLѠoÔh*1Sqq8 Dz{#^+^ -b[VU:fgxWOxB3CDHMs^ȁ9PrbU~5Lft$9sU5<مB\m*Bgi}q{{]{ݻ JUIN'cPw_A{-B+ٛrwd yajlt_*_ uovwwa&܏JǓx7 -Qw4ҁB7'tdt u7cu.An*B>Y8ȣɇ|ThBwi}%a z\GIBdR.U4q -~Gx<1#NA\j)tZ/ o{{T,&lT4_׋%Tr_^bBR(GVC D!~8hT9E"a!s&*UP1Cod@| J |J^0Q+D&ǤE=VkО1^9ڢƛ6$ j;_4ʀWg|(vlzB*>4&2ә_oZSe54Ea"T[{^o ʥY^$ n0]KVH~D(PsB# te&=mǝ$ZDFf6UlBL(L+E:vw|rup]v+&߬|)5#?D<>|3s8U51I&mmF2O2(V /f2gZaV9& K" &ހV/īa(2B xMnQvpt Zμã *ɂB7KfRq6ƖN6O͜!FҙL#p3;3gFYZnpjWPcq Ȓ&Occ/vm?)Y('2HzuB-O8a7QbNyQGUzUZ`, M(5ΘjvtR?%9ZONY)b[`uTo_R>};U@`L~|7a -ӔwS& -g7IGX@@ҍxh8"0I pHw<\(5Bk0}3=F|ȠS4y5G}M~{ߚ?Zw_ͯ/G^k+r(q$$ @rn$B"ߚ"[OB!CJR0äjnGCfHwSx/EEoۃ7owŜ9bl8QFi>QئF7EDMƱ9gvͶO9 -uFcEVó-"ќ>lJ\n9m[!&t֕' -`"ȼ@se*WQe=au!PSڎqzT'#@pP3Crjv*i̠CTM6ADEM 6ٜ )6l60sm}laii25ח_ { кd/,(mA|oy=QKnÝ_>'tǵFk{oheG.4Y -|wYwm#w_k?o bm_Hs7R`=#ՉŇYDe u |h|uG@ڐ֏7%=D7]Qywad]n4]dQ)IB$U*J cIG%-)w*Q -CKi.W9`XSjs"p&fۼJO;az{d?6"*^&|tf*b1V>[*xDȡ"wD+PTЉyOPR?VPVT Lgtlςm."i! *1I.]xڞ>гg__8@dTܰ{1ڧ'9!>kcS5hóp,tXO㊞FW3L߁ P3c#I? -VE%0вhpK(] -,6XJDR__2E  )٥/A ܙ\2f41hN5n#oE(t%yEbL&,18? -%'8̝K^~d /K~z{ Tx3o;} 7K2iBk~o1(ݛW'֟86Yqp1y_Ϟ|qw.1ZuP1H, KIg@ߙӴ`Co2I0Rn4batʹ@CV\0ң䘥q4KcDaVi]dFDd9tZ}jKІ*؜:irQY^K55JeOxHETRyF <`;X]N'I@А[ &kSZ4F8Qda=nup "烤$C{FGQ!L+pBS5Ԇ;ܗ0;>ɩL8Kφ;ayWd\+LTbRutcTZd UX$B -NѧM6YQe~"1K2_$uZLPqVm%pѭ 's,>{t=Ԉh;TMz- -h09M&)`lچ`og0!WUX ]:{% M|x LW>-ɳ.V,o ?\@o o+Kt׷^wy; Aw4PifNup'qmA{d@{ЦX$])Q#M$6K$)IrHEi%z,`P;*qɿ#uJTXPSOڥ.,(wMzqS<4MwR(׭rx‚J0s9p\ßB7"ny9z}nt,KdMRisRh -_+9L5-6Ƒ&dY+k=t٧W%}1o}?I܍Nw[v-(?Fzv+{m%Pl_ƗTˍE"O:_d]4!#pHi , _ Eg7W3j̦!KۼlfFs& /Jbv*{ow,lqe\1.\ڲ$YұZk;MbF=xT'NLTmʇz?us 3t9IWd$sLf9%GW0s,+-l?-l,x=Eq#1>4^]WX.,L;vTGDpq>&Ř ,ҿځwd 5dGd}n&慫Vi֖)d 3xٕ32ל`OMID"\k |3# V$:s{xgݏ%ѤEiˌO` /dlnlgO87v+Ji͒Z%.ntI_v N5iik(kGm8,.1it nX8nFpGch!L#h3$V qr~~Jt3ӿQb5S";s'H\EgS@/xBqed>M P"ef=!j~]mʮʎg#mܔL11&gLi0GnGrNr+o#x\!Fam?|ɨu}y)_bYSRR -ftV=.%5fYQvKPAI0:xFpo^aqfu0Lkb?51Bƒ"NIJN1)f˜.4\,ׅl|t>l.FJ J~ĩv;zusvIky5dUe*&J姥 1kX򈸩Iqb;pI,?gvwXM`ܺR]#\&kjܣ.oW:(Tt*/M=:.WO=:-VNN=t%Ir"%H. .='X#k]B(OrbZdr/_egZ֒vJ\K.~`q.2U}>oMCk 2)S*]sK5X\$:qI &N\͘vͺ^+ȯ4Ets?)`*+dح==zo؞}{*v`ܣÎ-?ZqdWqk9IM$M` 'g.Y_Hw^^T5x^q.}{OCƋej~G0U9qڭ'+>]Txɢ$%a}UŬi&%e2]u3.* ˎv~S纫ՆzS;őaIgmLܓ?Qq9<&Pf秚,Lfuݖ{v>![ze!KLyRsɤHNMv^8JL(K*QŒ]e'ks֛K3B|lL𸛳5m-^xJ~Okh LŦa)IgA2u,O0[̲{%Bs,ԫy}8SЧށ4)DOn9q,JÚ&)-*)~p \$H=xRZBG4LB|bn?uo\&:!ޤG37]cn?wIφO!^K |^Z_$=6Gb3,6KvLR]24ghKZ!H\,J$ y<99kWEHbb"diJ&JKl_`LbhGpX\F y߫Fx;n;ǕCK_[B}b;/8][dHRQL||)L$Tzl"\ݸ){‰kQ2qi %_T`=$| 1e23Z8 sEef{MF$,O5̖ ;FZ14L Aq -]Sf6ئT_mH6խxzRIuq++y8mRb/ˢظ-9<42jn4D#I Q9C^.?aLIݧfJ65kck.7m&[r - -;HOקL*KVWgMrr]3-ʼ1jTRsUSpccTr񹒑wJUlҰ)K<5zo\1rݵGrK}{eӃaM˜0}jM 3YRKXzDze׾CCb(@?Vń+6C}qhea/o᫇7_ -?#xO] WpJSЖW•p%\ W•p%\ W•p%\ W¿+Jua}hQp"6#DqU$$yDMhW?A4 T#^!^&rqfIqhNW"*Rl5)8Ay/G[Wg9nC\%^2^E (N٠> Keu qg6|/"/27 uUQ)$ By"W?k!%/ -|p-x!5b'uC~gAnqF+Z 9PKDUBUB*B ,pOjBxW'zADK?̄3I?" !^ˈPv! q,ٯ N@L ?A!-C?Y ͞!o%aDH7p9F!.k*ɥ DИI1k <NC3bR I \Q]7p$( D&ИK[UJ]Le u7wM$5q\ӕb` Y'kgE;&q6{U#Dِ/1"3BKͨe Zǜv5ڻNY7󝢧6 -);NjznZ(zԏԄrru|?A˷^rMoޖ/:28 Z-5zEXoQ5!p6P>zD+)W@G ӫ]vM!c6Monopylۭy7hM[kBfo{Sphb~L<{[׵5݋njck#gW݁(ArA=w<6mwjsZZmAͻR݁"P 6!m\ei:i۫|hEKgNo -yUqƫM_X;g3h^:; >j_LYmQ4Кݝm X *T?VӢ:6j#4o*^jWG" f样;D렶Q|D!H?j yyg9-[)nE57 u i\y:/ifMX}DK[㿊Y8z>:6SSgcxqj񛂷3uy?Mq5$ĕnN>],l0AC_WP^O"|@h$¯f0"K4Eűv/?2%]7-Zo6 ;ew#v66]l?N} D k4iTj&̈́I=YJ(wc_/_+]~/_ߔ >e4HJR -LJ&T.V N] |RZ j:uשnQ|z+L'!"6=<04."c>ghgR"Yajd>ʆ;D[a;9 ێf]3!l1Ol瀟g ܞ???c/g9\DK[Dz22ThX׭UCh| ]"2 -MՈ[̝כ7"Ul7"&Mo6ciVෙoZ:cAGpm+oB9y"qJ\ -ڒ -eJO)شh7֠w-yWɊPFЅ5D{ ڰon)'.>!~bTSm  w pIz'D|=ov'GEվ}-HaSU"NqŌRߥ)HM׊.qI$CdFI$Y.Ehj0u|U܀ 3Wr/EO~H9L~O^#oY)ӑVZZOhGӽ>C/Pz42"͘IfmӜ6},hzӲ-zZDO+tz:}ִճn\:P;].DW7 =n#7ZG֭#՗+G~?_˯Q􌞮=,mh;Nۧ#'\GG^DŽڎƎP֎]:u~#Uĝ"F:VY]N= inX#Gu@hDU<#ͮc7"f{$Kkr -;%5rţRB& 5OzzX} ]XSQs\e^c5fg-g3m.[g^o_aپK89"nIܦ3um߈GoFk"96FȫcHJF$e $?r#=r#;r$=&FmFi~FeYcF_T{o{_1QWG7' 0^'[}SK}C;}FI~A>A; @ ~@>@tufuV ^Tx{{{q"||{Dn-{"_<*@ ʇ!SKrU^5_Z7:AI)V-ƞk {NBW!G7ŀqRHxՃ0ъ82&RK.ȅW7ڽx$` wa!AHPȸ[ :{:{XohU@(o@py f"u5m}|>A-|!o?)p9.81 QH #O$ۅ4==dÐ7P+~&K+OP(ck>f|fffhPX=GjT5ZE6c[s"'صl%pҵH@'sbrypfv΀ pno9ȟ[y!M<8lk\S)J\ЅYiցPpCH)P@5HxԲH3[ i+k Q;uHC1*l#]p -lzA;^G; ^ .+CvfyZ}e%o-OoT?Mà8DeR -lJ*=ǩ΀еR9c/vd0;r'C:3 !o#ƅØN%΢sbj0"MNĔ>;cB面>/$h1g'Ҹcm۱p"w-rf2FNUgP -50>H$;A:V@0^+tĘ+s8AF >9OvmL݂T/5˽?b.G~Ӡ[.ZM'bZ9g 5 -4FƘ/=Y89iO7V{ၞ0zG5N;ˮȯ_7F|^xΰ^~ NhWrY6ߌ\5ƅagבk`[VPKm'o2B֬|е.7&79^N?}C_pH_25[p])@z8~Ж=][ Y["kOgN}K( , mpPֳO[>~͂+n}I -:{lG pַaPN/1 *W\3P2 _-mg xq 5̀簫-6sD/FFߧC){Gu nAetHA=<ѾhF23Qy6B6e}\Ӏ 86 j;|!D@=ް' -7 jc3D/F]c V| Dc2jAÀ o9!j=Z؎2a%`^9ދ0@_$QBnߟgA? d,[x;8 mp~ҏ`u*<8V #Kǎ.iWŠMwUjx` ܌Mpxk^UaC/]3֗8Dmˎc̷5NX5ijp"oRxe28S!jDϧss|w, ;; .9R.V*&T*U5,IRF*VJ9FT+/puz]mP[]_k6zT6Bw~l߳۞?S{}PzU o&h&.q4`Uո88xp%H_bFNPfOy_Vv%xWhYiiBhCS4eơ<}`HƘ48&DB_HOx=^u(q2"q9,C28PqX!{}'ٴ͟[νs=x#$jngӏ!Ł U@!8 |F2Au b14΢ 2G7 Gh]$A[,G-^qK25DYY*VlQ3fݒg)4u˶(L,i,2Ki0"#̼n32?5?7mteytY̷wL 76OLl6_71]0O(8/'l\If|k2;^Ӿ?n%t 6H!)y V6tQE]1@& `&g}iG4Npldp0~Nq6LS\ A`у^B8 q&O p>PԴ>r?AzJν"E<$=(yȈˆԡ7ϓq7P(z;"N.z7q(Oؒ!;8f85?\34iC8}lE&]S745|)|ԯAU -|VV]^G[8A?H'[⿡߫H $`m`7#@} -`?6؋ b{imfZ+XlD,D}c$l7OvFb'eE` ~c Qur0&qPhO~whN%#=CT` QA*g׍AF%ܚ)|hRV4X]Njrk+1. @706X u]WQsz5a(Iꆙa J0#A[]9sJ>f߃xԵʌ[/֘I57L՟qKfz-g.cqg0ֻlfɺV0|yQVJh{Pf qԚq ~eḿ3fɖ>ĜܝT[He݁L[a-kV>KL==LFNHl1]`e0eI<( % ķ!2@s?#60/Ŷr@D ;4pæq>֐= ON`'Q}tCI\&= `q{p0\lǁ0pOķ<;aY#i)`Flsb{c2Yuݶ1"' tOZC6g?h{уMwmmFh14*<&f:;eijMl) !uO+XfdLJ돱83p/ٞv#ODZѻ\l?vY{>(+=^.u>W\5cŚ,Jti7xXb>U&m&Xv;ݞ@8G<^{?փRŸ}#dJĒd8 qd,J86<@o\fk̒s`Y+{Y`$bW@=U8-) g<x@ gL/E¾qـ923yg!0JH ;x†?<<=Orw>s;<Ɇ%_HpnO -<Wk4<cN@`á#؆CL'މޞ|<4S|;dL{_ ;ҳ>64hbw@'&#o@fΫ3{ΦqwmwfbӲ+Lw ޤ@qN,0]aZnw7(ެ].W ˼yn[oi0{Kd9zoM`Ţ#5&M&%[mAqw#d]Z.3(y|n7lzӻޓ\h-}{&PI> -v^t^ B+˝;]wժfP=Y-z|5(ƃM׽sL pox-G6veײ`sŎt^Њ -w ãbIS/ _sם_ O;~cxN)V%|oE9d3NoVg-FX1^ - ;D}8x;;+~+H5wb0Oiף~6Y&PǮ/]_@vOzƭ;%dvAyl^壟N%c*$]M u?̣ތA?Uԛ<,dOHUO8d'A}W<x@#6m`G^o3 ooKTlt -qvH| &>n^&xš=s'ޢMGSS[KH<s9:z/@|5ϯ#wD9.'z ˀ},l$NP3u(BrvK epzK e[}!/'Mv}s|H<+)7}>B[>:s:|P㞯1x3Z|CǾPc5" kĥ -"`ݤw|v|z. -wiv(Dvٞ19"M -]uВ흾㌽d8i!nsǍ>߀S@h3s,VU0N 'Eޠ?=dp.|TCqk)pZYߵG=9IauTψsb=neX3IN -dw؞e|?k{in;aA'xO3=SHY >Bƞ۾xg[!x&l֞Y}fgv,:/bpy(Sk=K8 -cgƹ8]B?FvxŽeS΀Vh -^|ꬵ3Alxpq;X!G -' -N;@BO?1*Lgw˕H;c|!h>(s_s!wCX_s?Wbo:oח~O5W9`w>3'\l˞jO)ՅϪ -N.Q_+8W,_)q*Jg$}md.3ao bX>+o#941Kx.x;,mŕ善\&k!xJ!#;NW7NJ 1.]LvQ@{3]mLEߘD}aLQNJQ2\f_ȯ_W\҈_|e_|}+Wx{?k_s&~)OP3ch?GUQjAT@F/t4.&9-FDQZEE"J蘨]7/DЯ>mxOD[n}*=荸խ[D۷n}GE1'FO?5?xxi%B_t^JR:@%K#=M)tiOZ *5&ȩ㿤PĔQDYԑ{B'}#{ɤ"33O3s/%|j@/4 fvQFQV>^=X}\תWߨ[P}!ſ"c$_|QDG~&|(%D"JEE} -BS_Eq!1UMUxG I)3eFT 1J!o R =m# E⟉ނ>͡{g244j<"XiӵY\mP[-Ֆk5@MZMۡjZ6=֞ОԞh5wWc M-͂vN{O@Hs_X]?ߌx:3 k9ONsJT:Τst]L2z6nhz }|>Mӣe}AO3]zO?Ws5RIj:]U5rѧՅu)=䛒n򫿄(m >%vhO|}|=RŷƷH"Ai@3Y:VRju92j lPԶ#y E<qu}nCETycc#H,|9 ?cɄ1^\ c}6pu0|xݎt@\24%Vl)/;opz1N:k wDᘾLV?BB} -|X&>=ۤ~ySh858m$|O:<F]2TŨq}E/|r~cJgcߛTG_Ug%썟kˆ'SS/sl$o0m.0"u KuDg\v]a.0)TNl?p̰Dпh2$b _ [qѰNpɸUo1׷;+z)~&~'k2vl6"aszXlfbUl>#zd}/7֭LL !O1Cd]o5&ԵS tLzZ5Du.h5sXLA&lu1_FҺƺkFЧ]70o.cۛ6v>w^ƣuVuO^l'/ekt{”_Kbfi}Ƥ<S/֢5 K9{}Y9zJ 2W<`Mp~~Yṇߏ^F6̋xa}]yZnOnnE> ߘ~aoOgos YQ{F3u>/2c~NX}!^'%y7Kߪ/kH9'EX{5]<7])7NfzK~ӣF1~MVk/?!ecO{u -G1{⟊ )r2DnP"7(T9#"܋#'r/+|/%ߋlىE| ߋl)"[vvlJFeT5,6Uʪr*T>UXuLuBuRuFUҨT%(qSuKuG5zzzZUJPޫ؛hRUwފ{nIPJTN&@r?suÈ"?j/BCι*3tN\?Eh_Lܧ WAMjD>E9|Om)ϸC!g&r lG(8Kc!V }DR%#B -@AHE!j@:GrFFar@MF{_HNfEfM搦ƤrYc׸5戦Z^D26Ga͈jh͸fێfJs<}fV3Y,i5Ogu~\?j xVjS*' a vMfjs;5 'K6U*.;V$]~*JWU[@X ZmYYo˪ZUu.ʮCU*ЙS@=[5\5Ru*wzxdT]Ūƪ`}.]Y: Ƚ?]'G;Cܙ ((!py.C:Eϋ!@ a}!@xZAYb!MAZTjz$a"[kH@ԺUek^BHX<y<H^1i -c(Ǖ<8Y"9<6LyH9E1+gA@926(+xq勸1o[CQȪH#1龘1,\{QHk-Z(>/Cl -9c2Y_R"_gMF"C;йbJ3s/ IS1Lﯝu륩5S9=*vk%nÙ ۈ2.{DPӀ2_8m Ĵ} *r?vx[Io,Ww^=9k.qu- >?g֠יʈE]ojReYx*nw?U /yϼOqm) µ ˘|a}۝ƍ./ngkvt8AN8vod6q&}sXfpA%5u5?}75E=*(eI\kv(K)SneޘG$2K11=<|P@?H!d#_Yߕq2+51vQ3ƒHm'ѿo(IR8PYCCz"1 eMAz;eo[A);ǖt=cX><ޥXߕpM.SL!S+oW\0]%_x#vNFzC&no6yȷv43OPB̠$_fC?y{"Lľ5;;ywL.ks}Ε5 <.(ҀFF ;7ț{K;7:ɷ8rW8;6D]DW6 )޾Ά=*TCs)74F(8Dx^χ4_oR'Abcp?eQZB_{WD?J@!2_ԏJ R'JӇ)WHU)>A;H"l|N~O~o;ߑ???Fx@}>@!CDQh ߂d -}Bқ(1@TqGESNހ֍e}n'lSx|GsTy<?sqr۫or9RW>U$/ -[l*ʘ-ɖ8++܎ ro&F\kour rlc}dwzH$QRԂVi+HۤүKߐ~%IRJ:=sm"Ѩo[! jxլ/.u@Υ]HMՈemxce['gɲd;x*[ҁbfmȌ9㎅ L V 3˃/R p iֶNeBVEB`E6 Lڂ\VFqɷyC>Roesre`nʲv#*e  T;˲(*T -}GQs("<I|Xî|;lMo/|PCEFQ򹾿KhEzh"hrxzE+i!/*(Z D2Ex_p.GW뷐$\H=ZogeE8dEPdrDfdPQmQE@JDT,('dQ PDeqhĪ˴{]o]:nر#bGĎp&kFĝ4X3"9qƚq̑3Dmƹ!v'ۺ=nq<=QlĬ3ΐ[!O73t9##g|䌲"y?H Q'Z\m׺~Vq4#nVS -&llg &O'' 9A8&'XR$_?ϙ7ٚ[hhZ:X f'm 4ODyZq-);}B]_rn]ŵLpInqNΔiNRnsK>뜥?,6&`+ٙL丿aY?ow%^5F\\Rg|}3ݷӫǷVv˻O;O>pu~ oO #M2?v3W*l4u_i sb֭{%o*sr}_"Dߒ6[_E^_)뭱҆~ĚςX18ɪٚtkJM[׽- -'o_ =#L* ZXY~.AojL\ؼ(F59:)ar ts0b -5vX;fA5@œMAy׿;7(uþ_Lv;\W)SsI 08V Fh,dvѮ { ;\Sݦ[uCVZաO06DQѧѮƵq^S! splRa 0:xíMgvU -~|b$r/`H¬!#p88 -< N)/ NbVa=S `/F2&8jd,1H;GtFI]&*E;jӫt0rw3ŀȌ26=0U?#Lri8NoΣĨ>?'Qsڊd{EoG&hqc/8yc+_U:PޭUF{_toI#;~T>1C+N䪜آQ«mTijΚ)v}FgJFQ.r'lSc>˺ʎS4}uٟU3w.+;犛5o,}ӯ:~W'ǥ3Ue/ntfqSóu{Nj8\vn { v v_Ѷ=$Z=ܪOn/vUkg8Ee9ƺ{V撁xo]&7.nz?nMYVpFFP11>M gtJ7NѬFEƏaN VUGno;_]_Gz/7#u⢟mozd8=R`V@{?y c`y𰎓v.٬{, ӕNb=p]^u1茡j?}q}cxCkb wn?/-ܪsVWo4~VImӗuy#UϠc7GљP\7f6u#xNAyF?8 -><~ D-a쇋:f2Vv;`v<չp?::>X$NsOTxVK'7ƭD?=/n*Ftӝ7[/(ʊÀAbJmD}d;"R !O.6{a&Q!XC&e 0Wc0}`V!OSbm`Nf f:{gGQ|Lj\7 - 8ȅ0bSN2,0a%/idʍJo~.Lu.F'`6 :>r>ouf{`yQx}^KײIOH(ʊÀAb=Q=<=ѮA6zyc YF:?\B)!O.{a&Q!,M+j2aB? IaB -.p$i`&a!#(O4IZF]ǁ6;I<IIQi]*d:v`D^R4FHr>]པN_g2j\0]C:a%0h܃4&](ʊÀ>;bJmD}d;"R !O.6{a&Q!XC&e 0Wc0}`V!OSbm`Nf f2{gGQ|Lj\7 - 8ȅ0bSN2,0a%/idʍJo~.Lu.F'`6 :~$@g d2>{?Dɭ]B_`]<"7Eg8':S8K7wtbN"IZ|/HM ::zYq?@Yk}ViE/ƞy4i@DNvԪoewh G޾ķ<R`.)zj *#L/Һ -3]*s?Cca%I=SCƤGv緥 9[ -Mn-ܩ|-;e1,𫹧]ѭs(j3 -W1p"GhN׽Wղm|&]{ľ? WKS`Sڈ&Jt&DOCyCs$>P$y`|p,4#z^aC[|6Uͽ0b:zH/{9ڸTJp ֈ3 XL.Q=ӘHIw;<[F2-9`oyrM+y <Ǒ y1Ԫ3YގgM{?ۢNSAT.E%>}=}Brg]9w͹g^5={$s;|p烙B>NMzwk)ATC@,ry0ɻC8Szrd^Y IMa!v'\C.@%_i7%Lc 1E[A~!uc℧7C_<!7j͑O"W j{#U6AMˣ$/LEc,L%u֋j8) 3ȹ!oV"WLfR=Y`9v69"^6~ghIԼipzўֽm诃^٠:es#j:BY|- I>z!Aj/=" A -渶fF/p;cRK'o ꩖3D9HB]55|Ip؃cBateI ?(:͋KJiEݸ-^?f"5As?eeu$(#nݗ@uYOIaZC+'ⱿR|\4/S:0Ev ueQc>Bax࿦_6EJLG/k%>OG3՚)/NIy*WMNq̬(1I,?5\Jes _=dWLٯPc~-sL-MMXr.QE7o\H,`>&Ћ۠9'5̠ -2uX[y||gfNZh` ?͓r?,ʸNF潊\9jpuٺ]BT*f29G1(a: _9yݐo!u}dSOmoRP 0QSHHADpܦ|9r -ӔYtxZ1XE=YSPt+2-DqO,S_Ufғ f .<nU)\N8K!3FtPj߿HYc"={bڲ (oԦ Q5y%.Qo0bg070F@e?Ѿ(QXh0_sac fLhv`^ͺ; -e]3+HU&+ 5:@|n~D f=ꓻ)22Lg߮iGmRYM6Ufmj@Wy"\_۲AT&FQ] FE#j?#m% r]7R{,'U4>s54A}n'2rxds; XXΧ}tRGc:C`zZU\IpZ|K-6aKt=۝gSg)ChWDk/W؈$gYѲ ~ gFMI;E6un0ԿQE+>y|w:` -`:,W+揷Hm)țbyc 8 -]FFLGdmίʣB_)[ -ߐ%uv R 0'^- w8K W$A>W FhM*&(:͂`4)|8X-ՓO:љq҉5B_Z2>p ~f`Q~@L*(W1~7o4-9~}cxŘ41?SmY#MYG7 e-h=ͬo h⦌9˔п9G:Д2eM9S]ߌS$%7[b3jK]H41|.+/sK9U%rMuEuy7o:>\576\vnr -s\sp]5/^|-iVHn㚗iG0#|D˟M~{&?3;bt<$ϧ_v~,#"ȗGًG{@쑯b=r=u#G=r4ȷ5)ȱ#9{#'bGN11?Ş9/g9?c HahH*y$EIYHʏ<# H*y$<*z7')LKEI< -#JDI<*I<*y$U6H#rGRgGR#*DIUFLR9gRIGIUS%O/kKSbTR#y_jF~o{hGj{N쑺GG2b\{A c4=4=$H#b\{b<{:jԑ LZrrt:^zˍ2PUrUL2]e<"|,qyRyyQ^Wd)e'#ɗ[9,G帜_t`?HaP:( *UAݠ~pApa(h4 Z˃+`LW_za%òaJX# 3†aӰyxi& ;]«aO/R\fSVUmUmm FFl3^{Iڿٿo&NMq;N7}>dJٮJG#ov]d㦬}>iβgL9.7gs]aW -yh_/Je9Ǿf_3ڷ[&nLe}TMUTvS~j?55sskʜo_Zmߚ:;kߛzn1(0r\j.V46\(mi(iI{ioKGhH'dJ7fɵrHzJOsYlK_kZ`Zb.R-sdIi%cei-di#=rMV2Q&Ly@0dL2eL1MLG!3̕2SfN2Kf2G.2W暮&,*Y( Ւ-Y,͵&:Y&LwyV5=$OLOY%ZV^nj$o-o>I6]ys|(~|lq 33P/ /`9$F1C;$?f,?jFH 9HIsKP<(nn J̨LPƌ -2YAT -*ۂAeFPÌ j5A#1wzf\dA3>h44w枠i5h47AKso*he m߂A[311~`P0<dYfR?o& fJ񗊿dn 5B ĽDX< ˘RX -+zX 7fnX?o / /4&a3?8,/ /1[ -(v0a簳y,*, 3ׇכ%aﰷy"1, ͓py*3O#Oin mjڿi}ɾjpm}~`?;gK#uRW٩EKH?$7H%2^S#ҍ5RO^d#ۏu|*^Jo{Q!@bA {Hg"`-[ aTxVX!<7^6 --vaG88ٵ5fl bGL4%Dx$^WňWiīĥTTTTTTtqqlRyRRER%9ĥsHDD*DDjDDD656mjmjmmmmm26.$4$4"4&4!4%4#\LhNhAhI8p)q2@+@k@āā+āvāāāā+]]݈Wv;fݙ==3{1gĜ3s7ssl_~ӁA!ӡӛØÙ##73Ooa<<rekzmjOivgv]fW5v}Ӯ{vͷv=`Q77OYͮr? _0YF_N[ee/:([dwK}rP19!?)) ҂t Az02kB?mJK -*DI&U@QB'RB HQkCQT. ( - -(FW+*)VzZ7Y6;{fߞEK  IAD$P%c`K'8u/!9KSQ x<Thx4<MfGshx\x<m+vG{Ht$]+n5AZ:z'` 0   00  Ct$nƃaBP)T݆Z>@I2|DlEqdD3oB&(dkAa 0z zH=l=DbAH mRq3{&řI%̤gR[>-5 RHԎO 7F9 VyEW?͆`mH@#/r$b&$7jݠ &Ǽ 7@4B|̍^WF|:k - wLܧN -:r}~[hsJ w˙ԫ)|$}Or0 ,S9V$+qP -Il9xIID:#a٠Q(̇ǩ bqWã(q`Y%R2R!x;@^PbA/BoX~VgX񌹚+jD5;9Q2"#¬Qh4f#iC UߏF xJ9I`ɩxʑT=9;7Fcəә M ,kLOBe1t:K4@gXa "SK$"/wx3VH'x1J,@ g!# r yx}}!>gSlz_9ҫ)A)ęB %!h -mm[[lI=O_cY5){2tUoK^#Yv6A$%ck͊eeqݖgw:\6({Ti+<meI -m5bsd ҨJ? ezjɋA qqv֌K{?UbQ}7 27b_MTYs_0bRЍa y+l3 ]$6-Hw3>qL שVt3ʲoTۢ ]$tHt* 0{C.B,"`00;[²}k2hÊN[/eL7e톆)"?y=^ - q(BMcq0A\xtsXS8u1 ZE0Jky*5_gZZ^%oŞMݛ$n - ko'74t8cϬ?*uI<.؁a;zF7^R6ΔʩPh̸&jn@2Ox4Uƛ(о=x詧O>=n%3v=w(ύh1z-े>ި{G{}CZ p=ѐ%Wz UNu]*jƳSyfADc1;@ fsCto+8TDc(mB -֚ spt'T©.S Ū-FW/Q~) -tJq +*G|֟k95yrڛ溻KONRQ} kԔ+yvw`3~ɤ;Ò?S5"ґ:7^p,_sje~|Iv}mYJbV(剔u7œyKh9(Ji[˟|nz{|7=?(߄ _@9~Wڬ p# ݐVJs,69z9:IZ,c ~5$F [Jb0>ެ0 bxHl}(^$oFFFC_欞X - -&!O88%B70ϻTk6}.(,M`j{INsSJs?Wd. -VgYso뀨!D}~UYU%'RԝezJ ܛ?u켓:/mK &W?$8FՃt°vBxXJd룥73)^.u1<맗>X괤iqA"Pg==ܣ?WoH&2YQZ_dnf"x׬L9˔pt_ck蘙[Š_Ispប/3/VBf|^b˛*Ql_m>`x Fx[u.?] ݠ$2#^M@W5ih?I;E #oad--QnX%{b1hpk*G>et,:79֎=2'qh"i)>3jzr(˶9衄E6SMAs|yY dTb:(jXZzU=)A^ٯBrXGgS?wߧсWGo>KxJ0'֯'_+"Dix8\@:tRqIhkRLl; 1dz- +hC^C5w&ۧnXhR#׈d,C =~v͋)u:JZVTgnoR)GN,Ϯ́X2b_(ų+,->~8`!;*G3^rhP0 Ar=D)B BRAH+Jj ?ӓYwڄ V8fA-c[cq.Ûb=iˠUr#xNV@B֨IۡR8#N5R9!&\Ȅ+rGjaw l,7p&J_v3=#ds󩡧vF*= "+,-z\|[㋆CL*&]_˔Xջ'P^%F+|]KIBp9IcL#D*w^[%|mYQZOx2M@xr$ s’Q/ -̙YSaJ&7zXcbk -Ӊw}.;#ǨzsCjŁgƋwLI}M3i{o{VjyN$ŋF5$_ˉ~2ԢRUV<׈l{gX-iv>{ gE1^*2wZSDmK )z۞tg>s$C>f~ iMx"l peڋ˺&K>e<`E!I_]8kJ V2ưpƒUۆ5gїT# 'KA -endstream endobj 370 0 obj [381 0 R] endobj 371 0 obj <>stream -x}Sn0>l !B -48ҞH C}5IPc ݝ[k7sY}U-/` U-=(dZ:tED͇)?oq5\V}~P#E}QT-d:.] ȁxNz*"m ]q90 o]ArN镐xWWwk1SMeMDatiћt0q.nDYh,:` &ӣ!L^gם|fa[& -M $bAl\L pے]̈́VpBndy+QapiE`Fo,:c& i> endobj 382 0 obj <> endobj 383 0 obj <> endobj 384 0 obj [0[778]3[250]8[1000 833 278 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500]36[722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333]64[333]66[500]68[500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444]131[400]135[350]137[556]151[576]177[500]181[333 333]386[750 750]] endobj 385 0 obj <>stream -x |յhi$H,ɒ<%˶ 9N'l6`CJ,& Iy@)10P -]H[HPڂn SsbtpmoɍW>ym񔳶^<8]8 -ܽٿy㶋^*.XS -\͛6>{I:2flpb!yێ}9{3@cl\k]mo=o 6m p~ ;mSYs~]5p;]isx+/j.UhX2ɘmm!/erXƅa+1_6ޅvWXnrrN};`Ztq;G#9q^;U^}O}VΆ_CɵE rjn?7L` SrL~`0}"&&`0 `0 `0 Ck ]9)р Fg# -皆`1Git -nS /,|ҿ#W71#'ȧ9"o='vCnJ=NmQcżcW9`0c_)l!_?4`J &0J Z~ Tm`C* ;U(N߀*$a jfXVh@mFvHMWIЂz2vBr]О>+DԕpReXzVX^T{ Xz*LQU}tF=EX =SPϤNKuPSn?& ճLͰu l@=֣n P_sa#y0:g磾f,o-;~I.X/؆勨^ ^CӿK~.@ p9\zG~.B.I?^Ejp0^ ;QaoTo+PwGQLOP>>7UX$\)[> #kQoO? csp?O؅z+7D6 v$|: | >z܌z'/nԻ+yԯRܒ~ -[Q/Q ܎1_/~z/܁M'`D _F>Jq| A߂QC -a4+6]C/ 7QCO~>B'p(<Sxixx8~,ՃcOҏoQ>~{Y'9 ?/Q~"<<2CT -<xUuGWxX~7ߢKEux {Էmx5 De9=?Ǟs9}~=tN?s:3.XJ&lt:A »wIh IgfьhEQ4@G{hk0tF4uFh: wfߒtӏ8g\{0gnj!ܔO=xkA]`0 #+sj8 -q)[uzh1@DǨJ 1$AebHY2f0E#Y_gYvD9A戕l{9N#ΩG$ڃQV~˅v`0Ld0f"[Y&  VYdJ$ģdQleڃQV~+\`0 FVXlŘ%Ewb+`0u&0f $"I6dUblEJ@"фp3dD$Zg[iMe_l8y\{0`UNEv`0̩#xAKc+7IG̸٬f4,%j:V ̀لa eFUf S}rd;]l5^}r|(ni`0b+,)[q0Eoiܱ(mNY)*yl5Ҡ/l$[v5 "MSW׵$2Nns*R\{08؊O=W,.0 YSHoQ-6h h,`WvEv8M;e*n.4("oQV*DdXf[;Q#V吨kS#'"얏Sk  -n`,[фȂ|dFSL8yye<ݕ';~gb mUM/d"dc9ALGd$'#$//'";/oa]`0 #+컁DMb+@fl7"ʾ%1t? 5b\{087T.Pk  -*,LzA%\E|&IR$I$p(w]yT7v 6J aP8lEq$PX[gb%;U`S>x<`>q8{\`0 FVo2fPsDlUDb+VI$t1xV{A~S8= 6ʎ%Dlew8d+̾b+gVkrG}[y`>qc 5`0b+,Q|rL&P-d1X,. >uVg [}>,9]K:]fp9\.fq9 -V]~VpMis)d~nwNs|(b+bޡ/>9.0 +Y"I*2l.dH<5x\P(,{C!EnaaPat;m.nb+set8N툕lɑkS`0'x΋y>֓k  -Q,Q6UbuO"nDE|PT -e1(ylnEX"כ=P{fy7|J֗՚`4_=~(εx(8{*`0~w1K$6jU 1[Vw{!R -KJPu$E"H$h;x+^~i{#ow\l 5t}ǞS>D`>qoUCbc]`0 #+wW­1SmPU%H,"5%P[jKJp|OcdG@ -E |3 -r'Ni˾%w9CYY=OŇUC΋yq\`0 FV0f 3 Bb% -w.V>:1( -@ X, SUU0Xv2`f.N"<Ni˾%wӼPѼ `>qŋ;/v`0S, ƴ|lb:g~~QԞowMFl TcKsUuy>Ca‚ =̝(7Oi+j]z$`>qcgcv`0Ld0fJNjpyѸtE'zx,\D$:W.YK,=v ^BBe!o-u--+.+ eu%љD`^Mig&N'f9ㄺ\{08V;/O`0~k1Kt \."~wcUUU1XZt颚dS0ִhҦEKv/]Z?EbpT*+زX@#VYI 6OBͩ_&jhȵ e5̉Kv`0fk;VqyFWV.pITuܼlʎe5w,hYܼe -*E5e5eʚ,TVT GdkZL+/ڃQ|XO=,ks`0Ya ̘%6>"7uCboOL --^8--KV$ZXtEGlhA++/JCu5uP]Dbf@"#VYɧBӼpNٙky37]v켘wX7>k  -n`!L$?p a{ -t@^kAKf~ K`| R 8/.3$Π7XMFi&Dmmm?O6}Woy3u𖃟?槛&|!&7x?wYMfbɊs=?PCE)U'$j.\T~e fhmk?㤓;wXjSN=3~`fN~Up͔O@u7f_Vg/|JOa%.IP]UYQD#PP- }^;ߕtfHfh4uAy[?tpGGaఆTڧڤ,82GX&3IKN .p0Hk88Ν׷hwѲˡnlln `[#m8ܨdn l2WèY¢;<4ʹ8ZmMp{m#ǶgJ-_77QJ9[z?Q}ŋr1ZRboqW%m)#}Ph_![&Lǧ֗LOq2"ú(sȈyJ_;>##+%#Cm}RNljy4]z4]}z^ݯxoo`_ >V~Ԃ^/.$0Z0mi`8iShB-=Bn=qebK\s:i4MØxQ1$P sh$1 d=5dI9ܞi3[$MnNI6tv8١;kjhw'fZZ2[5g&kԦփ0݃LUvaJcۉL{0$t4FnQ+b$@΄*D<*"t:Y^Dk -cJke ڡ_ʛTl|y.SU$4u0:qPj2ʷ oqUxsLلdg"٤UxH  NL<ߣU@&3 - aLAh=svzA0xgПATᷘb_x/Jbo.2H`~pٓ-3ϓZi,d.&ۅa[s'|\‹c&΁f&v5Yqq<,*T40 p90KBs f'|C1-$FU<6K@ST1xPsXR2ԼeehAx {^B*Y]nŲX#"‡KH(qz٘F9%< W#q9=׿qzbOij߃PoCthփ0 hj&'}t4[ЁAV*>8Qɚ0 )@Kl:V'tRXmTK6\1VW'b3͚K )s]ēVjDmO<$X;uZOF/-S'5d$^ݣcڃ)I8 < 8H[da!BHc.W0Sp4bӷ0ĤxlQwaq*+IL1+PTu50txяrsAxK$7w7'빝vvw*;b<{C -V8T!$|E N媸Fn%[''ntP%4ⵠ뗆aI*IPH)iO34bЯ2 Æ]=j26+M-xP00ڳ1ZECD]EKajRƱBa]QISݟĶ!]xɤ:J$!½zz :8.0ǩh8{HQh)¨դ?Mn8:[1$@j#hM%gQr֢YQ&+d~y d~7܍Vb{,hZE+7=xXz+-U6=FPђζ݌%[/IJ|<v1ߧmq׵RL xTz+՛FUNJawMfd`+TH-b}!b~z{z[ĺ{#,("7wYo,-../"CB|(w&U&hQP/h9*=ri\`UX ĝ``ZAL4CZW1f~ 3ֵ̜Z׍jQ\InbcD-v&fz-Xba bwmpf~00_[pxOPJQ+k]hס+f W:ݩJ1CE0R&]}AmF> >nt+f(|4߮u|0uUavU9Z#m'ōrxesh1^7#Rڽj'j]䐴A\Ďr-d5stF-lY-ixEZ-xNLPF\ WH0+0-)ĬhNٵRXP}`h(^-qTM}=9.rRU_ZkW!{hlLy"1HԇcwԱBuK W#4qí .W?>W9p+cWD/W?Žk:Tzzv)ȭnQ7㎜lZ}|e>t<w'H%ܜb"]MM ҤF^\$仏sKf{vxڶȎDoߞ9֞LǎxGXAAK,NK<Ѯ6ϖV.Ⱥ;޷̄8tO!]zKOWa:HWؗGQe{sk%T{K;IgHHCW6 @0((7DeU uQgPS 7G%[R֭U=[ BvsC>=;~4^{ӧC%KNp%`(/M71Pf̛ Bc*_,R?ʭ1(v//oRnɞ]lE7OY $O^a/g~3$>s`?ar7Fr$ɻ[#<8 {=sk0 zTr'&+ GaH [ahr' ( 2_Ѥ#ߠ5G0` ZeN *r|L2d$lQ:ȕ>2 01%mFr;D"Bf*!P -NT's$sHxS8iO"yF*n$#{IpB L H?'.n%qYs;.ΐن@f;ХnC4 |*#q~(ZNoq!p5wC:9RMbt7YI!m8p -p7rpgH9O 0n B3Dp2Fƒߐ!2L{KX*Nwa", -,}5cz;%܂8v|h@VC  Mv ff#$w^O"} ,;a|ro INHFqI;nIr-YNv|x Gq)p- -xv^x7H^0}9WĵpOrGjZ/}0]&'Te6d|QEOfd9~y<:M#}lg??B(8Xk!o8 (:ĭt]AN/pZ.5r7sr~ -='!UG/''y Z4Pjܲe[,mvV؄c[x -{ WDh mCqFt"M6Πwut7nӏ/'NL\ZZn7!a\M|&Lf넧nᬐ'įUZUiU/N2(S;JU!ȗ )kt.} %t{>q/t!| bG+o&oR7OskXj;kbYr>M* 15;1a-t=7tNO62̂(LDAӗ/k IBatMZQ!s?_ EՐǧy9/<^B #'j2?6/{;",P",c ބQمQDA=??#[zr0.-O$0>yGy3pI07Hn|"93)Y/0l F/'jqIatgCWJaAxV-&'VBz1kao&DO197t<*i71v`Zr!܋xڎ9}}|q g82xtᙙ$~E<g7b=2$0rdkp K1SpGɗ$kbt7}@|^+PRsWЀ^u5fAЉRq}WP9ev̾1 6j -cP0OdC/Z+_-Q-DsDqE0^FA#\C1|/>JꍷIl*) xyr g߼ٕ0*}\`O$Źd͑!wk.u8:kȮj ,btFw<ե"k |sPd{Ol\+I=Y-$w.QQCZ@(Fjk*6J%r(X.4|ؔoyʔ)a}vdL)m#(}bJTewgC"{lj&*`7PC -.UUO:Ѯܿ?J:lCJ=z0َ# qɊֱrY񃇎ppc'֔LN Ǖ7"4NϼZRs?RIڠcarT]n_XGـp]xK )dg Qc_i##}嬔rRioI4> -RZ6 kwxIR\0tEhQuhwˇʡ<CɮCpxn쒩r괊=ON#/k5|+ e{(T~߂} }ngKʹQ̏&=R<]_%n0_UI̵A(ڬ^U9v@mMu41|aJ|#~2iF]1I9._7]wۘ,:$:aOmo?GnF|b^g+fjgNߜ7zѭOS߰e۰*.Qêm9,B\9#F)'p(߲Y|ije{-G*U^ORˊZ'2.6r HЁKNcmCCh7w!!^rhSO֘rʧy:^P(uyh#FcޘVࠜS֐hkIK~ؔDR=kF[â]O7ٓ&#%zq*F=Rg;\2  Go$?$@UY;D3|T7%@x Z? *N -_9x/^[t,_t\/29tfvrk?>vu졁us5D˚;e7liL'jfy#_[nɝO5ynqFt|b~{DH]?վ{韡K}.#O}?P,PYscmw07T[2{eZ k&r*>#okv [:^[n53%V\%$6ԡJ4IfD-BLήhQgE%-mip߮OөYCj*Gÿ06^J9X˯VSF~#ݬAQ: J9UR2]b+[*)B^&$Q}I] -W_L_[8` VC+Ӭ' ,~nFkgCﷀ%EuCatiL$N -8R-);~\̓X(AqNkA˂Ko6ä%co$vy`Т5-}D6 w aI ӓ`Ag~RJH!T181l$ K)Y <+tJ,E:^EUTU.uGhaMt@4CgjlMB]yYb`q|x /v[ZjK^76,--u55$CC  ; bMx5 P[]3vbK] ,fđn֛ -j-Cw)`9K3uƏvqk@.a-\tWPDgU_l&0zMV[*S0L8sIݕΣ_t>d47ëh ~RfҞW?v\j3ÿ??w[kq8\0d9=8,?`g8KW?9.{mcjmv/E9jo -59^&f€m@=D*4`A/xݹFq((Ovb~lŀO/[Բ]P6.#6zP ͓P/RI95%kϚq\Y"@x1])ĘDJq/0 מpݳSJ?4J7YE(5{O1ZrkQ1rLSٱ{lS}'Da"M(d5R+$쯱1* e K';=S#Sm$LEeFгVbZ+K ;Jc<|јՍLU6LLeޚIۦZps.^vV5vK'!tt:,rp/'ٓ+d1*Kw*k -|?H#^ʎ/Yu-=Ivd٠A6h bsNK.Ua&aA\@+]J{FUPGo*`7ƢE\ޚ -#U':|ww.5[$WpH_qkTVOlXyq7m\B-!D[D"0"Bg'ŀce -.qp_Y&ROXkɏx=>aC$ N\{:ʉL%o: !k(v$K&X/jƗ|RԜU+׽;BžƦM>\9<~[]S()k+f{K89Wc+O/[šon\+MsuNK?!dC4.j6,@8 -*Otf?=H)H{55Otb+k5nk|`y\錥8&Rce>F/9Ys֝V)u -^#B\Lt ]r?mb&p&)aE>2ar-&ҪYQa%]ncOZu/$d*]ItUc̰/zz]r|\# Rug"BXW: Wvb͕M_iK V+|rO#V^qR:ǹ󤱼H請X0ո2cycGo_L:+tv2v Is W#GX<jWK..T'x_}p8hx9%yz||YLm}c Zny-+Zk k{"Z6nD}Orn6ivjRt|Zp#/ -/+HWÖh0:@%lqN3p^y'AY#uܜ $WrM{A]tpF/y t`*pq)lR I _ [y[說BmUP6ڢ^oN[V?NCWXÎsWpjA*[a0[6ҵs\ l.޾9X \VY.Q -iZk:{ZַꎒMԢ+Zr<j@l7n;9!"[ veDd -ԥg%av) a{_OOO6*K -a3C ~~oŵF'Qp[w.kyD 0sIdXQpkؚlq! Sga\ϪYѴ%`S~έ^Ѓr~0E?*Z?/բVU~HcEZgG%_WT @!+\.~]u0&n|'EbVJ*CՃnjeoa{QVN"RY#+(Td_|eﴏܔ␰XceKq -c뒽>6$w.T(r+o*.yvEH#9r0QOc7|v$h_2J H@ILR` F2L&FCG/@pV%#VQ`?+rȯuGFGNG03"/DTo@w锒{$R%wJ+K<t$X[_$RHm*)W2X.ٳbࣘƯN꽥Ӄ&—fHIpp|~H׿sVHp8gcw0OR٢i|.A\Vod=0F~`̳k0TIsHpXc/a**U5jwWWyQ-1\U))/,8xe P&K;5eB<2TV{U'nht=$]MܿjлB20]Un&Ai`J L7Jey1jTr2Cwe{=GIIV06]_^r–F\J57:4ZP۵a"zqD5f3%$; ֠ʂ)wxfѭ|b %06ZMw|Xt-^޵]߽I.J.Jyp?<MKaҡeUx -b#Or/GŇX#&ƚ,ׅ -LsãMmqA`P!o@5QKF_UЁmŃdO'P)WROX%k֢JQ{#嘯اŲ;<fBłha(ʉ|9m./cR$ E ZX _ڰ& C\ngu7)ŞQco/S'=xp&HO3na6uvu44::OLqϧh @ /+SB{T(λ4_U^5jCN'O?84Kl -kMڇl;ZomUUK9Ai-}oVz+J^/sf6l{ș3̜{N Q0! OИ‚%dhQ7oѿm,_Mڋ*jZH[m.4"z f+)ja0G \C$:4\$3ӗNLOjS GT6dӇU -H1b5ІIMg\:횳*}޷IrfU#8)G4=-o]/n:v_R&i߁<5葅%_T0Uܷ9N(`I}m;-sQ6a3t98:nuxgw>x}ic7QW_?2:12!D Лm"Ĕ04F>7UF`@7IxKdA˄x\ L -e`vB>PAFM /6@Đ ONQ`@v1U;MjxSGu" M4#h r:q$Ƭsu> vgC* *yu[,'l)j(UzQ)ޘ-%ERC*קtWx^\\:luv(u(}(瘡m[sHqۿO8_Ug{P`uQR E^VJԗ 6<KyAfny #.˄/1Vf^X{Žb7vsNInBT.DA$l/ZBV]]$7 J έVrOLwX\[IC:oAzILZڪNz]r~qiKQA]ov;/΄X];U_!ʛOW՟n`VU*Ϯޱ۟Mp\ۧtحȲ@"YgOk[:~rHnĜ,2]װi؎9(;@IDȞCָC6ݛ(XJkSJX9tfG -Ќqд&EXn={߳g_G23]^ASpMa 8N},: j㤩!9"p8ӿ>l*NЌJ=zSgd>iѝ+? us^ 7rvv's(0u1tȀz>ID$IrTUDA&B"=(4 -`J lpAQu#,%ɗѨX>ɣIԐԓXwКzw͖dЇlydwo~;̗LE?%dDf֞*":GEp~_vaCpOVcf揢69Pc$ TuO}Yהikk$=Ek{P?o;ps+c7C^Դ~N`r^0^K_Kjrm]+ʟ'^Z]G.-CN ٵ'qcPzpܠ Yw(;R{RO+URYݭR(۔i2-OȘ3 q8xPjb[6qw5H?RJ>@ -dXhrmEIlt>1 s~& bQ@^D1`$`4cVŘ"0xK'rF &/Cx"S,‰:Z8V@pk(dKQXը6+F6ȈFLԢ6̶FaX0 d2n a k&B-l9QƔwj*}DT<'_j(`jR͓3ͳ=Mݪ - -¥:HBqWy=agr׹*\,r1QdĬCF"-$[|b?#xȊbV2E>-  >İvHn ,缙(5i14@ bY6gĉ)jux0R}֍0!4m׹m+P}o,Ƕai0Yڜ`wH;*Y9kS"6ntgWd -.9n1H5,HsvsdcO F?nvt5g=|3z!q,fR609(;Rd kJreTM ^.jӺ޳vNoL,JH%)a~DnOe2w}G#|2Gvx2k ;)G 5Ļ!WA2Fhm'kĽq}5]ۍ4c<!Ѿ$$v#ε6Va -w1Pl~_,m=05݇8w-v!F5}^| ? L8 FHks@1!B+C9(&LL%Sc e>Z_뼂ݧTǰ~L26BJ@ˡ/Q C͌p/L9lx$?eD'FlӈuRdCҬ o"aga&Ng@"xB" -"D?Ɍ,`AtU4U `42OQ+kIOhRb -]"kOcUL=m^ZhA}{ڨޒ̏ ߴ$ixKZO-^hyəeɺT>|YC"S3 n--r>7-Χ޺R,$/aٲ[8 -dy Mb=*M!T3)Dtvp$rGek s>i(H"'vIdHl\LБ 2`.3fض+ PEM k}c!ù$~Icd vc 'IH(^ʕH/ޞk7#KW5OS{6I|Sb {!+0~zHZ6,#Q' ʗu$8/GykB8L6A GtJCߩMbHtǐ䃔͖x2ؤ 2E'.Hp(?|Ûug]Uɻ]"9cc_lFHE(_!A,-({y%/l<ǔ<߂}>"`0OsO*)9^ԳsWjJ\LBWCHJh`7>s X׸rl-nv$^py 7+DMY4KX~R^>,] ]EMlJ$;X\Q]Wj 3o>g\V->2 ,fbfI30.uo Hq(F[1tR#Ŋ\"eScAlԭY+po/8أؠ/b4F6 &ٌ 89'r:3󰍦3(ǻ+ɟlb(fs .S:iu:^",3lu n<Əe젥's<a,qй@ .}8joi0X* M>x` E'jliCyC?VfF: &'6[:zZ6EG㝶BntOO<(sk\iIck Bd; n1do-S0Xz,$^Y"ܽ -1!*Ƹ<̧|JeUy!i^HjFljFWA>/10 iM:iFnnK]9&y C}!k(bf}EX(%F)a@-LBhĦr`D]JạMhLO -,Q oziU-cFEsbGSWD+ sWsS<3OS;h”!?MNؿC4nn褀S^'z8wn]l[kFmOo{z;H=zaIw)㷅NΕ!a'831|b.%~d@nw8|t a7z3fbQ3=`1qW&oq#y21j5EUO b2nxж+FY(FQH$QAo :4k3ɺ3iKԙa=w(Dl~ U# -{@t{9RFG|sW1Βy!\ ^(+f6>S{Φ /xo~Z/W^ENj=)9qzu;|xKOjd)AC^ 2|0Fx8{Hw=tʵأ(OVgZ7@F(9oK2[g~Z}l#]9g/,/FЉfAUWi;ghl"qE+ 3'o~?oo{%`Wc <ȸJ4ܵW볡].ﺾr! 2rů?v (>իZ}tZRSXRUA祓%'O#$k+b:^f=s;y cw2QKXw:;f;.DM#`XDʬ k‹KY -+ K>'[/w[gdjBEMV s:wmBz.DI+tGaT\+jmtE->PSbJ]nVQ9'N i敏a:Mbd/=Lm{6 '`NOg'l6 -2RSbc$:ӕ'dCYisǡCC#^2Z6a i.Zml:a{2Ӽ޸iޘ/@(hA<Ҽ$"FS0Xqž:n{Go:򲱧ᇊTUO_|#ߘRUXQ+1B5JmD -6@'lmiz9_XW{_iY$4>#͢x8c;28qSB PBҐ k.tyxM@pR0P(wפ/z ioxr9'9Fh~]9Q#B >PtXإGtJBPTrI;so@ Yȍ@xcr7x^qV zF8B mvs 2›#1΅zY'Kj bL -"\GQ^4Qy+Vu8c"?CMq쯆T+$g͞Tl$Eu">GjOm޸81˒Qs7 )MB֯>ozqVK>Pn޻(G¢z7;8PnɅ5㌴ -B=msKǴ\ӜL_L;9stGqS==YGsA<#FaH3 mVg -_Zf\:!fd3F~$e*5DE Rp~>7zTj=8*>mۇN`˷z; ֫vՍb\a/Pg3dOBDE|PErZ"@Uj$2>- jfpeag+E.c$h'zX?xFἙxxx! mabP<r1C8V!7L&q@"pBJ2Lkm -onӄ)2lk/C>:T+[/v_,\{~dܕ7\z׿oIKg_1aM+* -9i%dtJri~X?re%2c}W^聙Q`vȣ&ts8m.zos&>hidIbR,0^sn2dVSSST*!ƅM-R /%kld"v.Fk$fּyU5fvS&|6I 6詾Ľ{I倄4\ji_Kh$f4r -n7= %n89J |cYg#Y -:^=;Oul؄" b"ђ KkS @?@`2Ws9p2[7F9nD vҁ( Jkv`tqͿz,k<0==45mI0 v1Ϝ =R:f$WI``QEFx%!1^D3ܟW2,QwX/Dp vxoV>ҥSJίT?X,U=^8e6;p-I6GU_Hņ:.!xN[%-!M7J5nrrvzS)# "L,MNbKlJgƅ2t3 Y1 İ,%Y%zv@w *Bc8JGCυ^QFhg H6"\"ew⻄ЪfbKVW<:=sᙔм! Oa9>w"n E,<1W"1r&%0VL"b?8S I;qUg"K;nE*V!N㪜K/8;=tr ! lpA cx1@H{txlq}5sѺhl۔JԥL?>H2t/+n\D=}\Uy|,NYfGz3L<ڳyV-uWU!" [$jp͂T+S{ k f "f &:o"O:iɀ"G6 y"ߠ~|L3H7y-&^9"QYSg :O%]cGHݗ=J%qApBkhf UO˂`A> i_A\~]&eeee6{hnɋ2|"ഁؽhawÛ- _0{E 1 /Fe'L 3Ù @|kLpc.Nyd9I[x:ZɉwN;M@B /` BB -F=LPi ϽV!If/[mg-ܴxEm߮{Ѕ`UuS CHFatÝadN3l]WSnw̮m]UZC:IDHJMH="Sf01wMQsWTy 32~%av8$P`>/0H4 E)sEކ -;%cYs -VP(NԝoD + M=l嶊mNn-2jm6agЁ˕+@Ҍ2`KP_tݛ}inTTI綟m+ ?oџ~ނP|xrk̇`O6B@JCƒԆ)(YiHZBK3"#AIgTT1oW¾H,WJ_ebH,%eanP g*9K1Νf!Ԋyj:2Bf쌙hBP X&.sYQ`.fAC4=[ͨͫP5UٚZ]-o ľn$ߑ%|Py0DI&G> g'H"k`o=ʴ.~sEZ}%Um<ݞj0&UԸ'ۿwk[[q7Ő@ -ACn j@ "&YL*|1e8{a zQDL#Mq% q.PHÕ)S{~usḵ1d oNo#! -BH ign|GMyl'l"X~KOD{NL7N[oaKݧ=~'5>bi9758RjRI6?2^aIjrg:C =OI3yd$ކ䫂sQDѧ2s0\N< AC-siH+,Z8%8O$n<5p -1ṣy,"|48G=pz½_N.B4:s~F![;)S-'2%6ْ&z%-){d׍3srdsMbHwsY}cἈGsm ~zŻ&з}{Gc{ޥӿre{ӂB<.s?]q"D<`w;97,GA~lLn$gˬRzEnp1=ȅ#f#ZImeGk*U;RPqӀ E㝦ƪȁDm|E-ar'fr0_j -3dD)K~{!#lW8|u?e?ysg v%wOR ډQ[C$xx ʁڈF:lmC'CQdyL&$MxUZڎ ;@*Tԛ(lɺX"Lu (1HcT A;Iu 0@`@y!'piHZԠtYҝfIu%ա~1f w7BVk@i h&>k9od;%۹͛a>"177O:U[jZgNedd&)(K`؀pJ<)Ojh<af굆o>s śhH"א^pK n6 -^__ݮxKqKrGv#, $B<<ا<U)voVDjͿĿnj@ AV2~ѧNj\*x$DYD@+7rG݀1brqK|C7pa&JMeJwPn@"bzP=ف%UTPb2u YAl>CoEMzOGf=sN[/%}?+&(N!kf -pHP#m@U mn.oLǯԿZ,N3-Ǔh{N{.g?%P@ Bacl@$DJuY끚\K%%ssejvο.ZY^#^'m-p)~mvgowN|Y!øqDcSR_iU )IpBeA6ߠfM{͡:8|2_ di5c 怇"C'2.QB<_(tqYU^I0*IT('fjg#mIQYP 'GW! \N@[B4_0MMn~2=~Snw)EĶ_δ_%_4J~+cq7G$Y{^j6H_!Jס|rRz;7{P%Q(|ܲQ7U^G:]tHj v?S}cPj3js&-jBMkIۼC-[R1E[;c(VCZ1j-ja`2H0&T^UKBܦB;guJ/|v;?[G۩XYh{`efTgWeV | փ퀾AX7S+yUyݐR5 6v8ɭPKbBA;9Iv"3vɀ pf)e~gG@!F$$!1#[OMh̛AeoH-D f/(Y:Ȇ9H]Tڗ6hȱ]PFRb?{kޟMv̀ps~nX|O^*.H4Ls>Q9V@YF^>qW,~\qxs/[%$:h*4?ӗ*ޮKg]׾P{\4Bb4Yp. -]rEirԻ18tpؚ!^ XWD)]4tkd(rmD71sbq!ޕyNw3]e|!i@ -*7 Zޭ8BɆ_sz89ꄆ6Mw*ⓡA3a]U9Z9VHOGee\.fd+M$hmns4GnwU -+i!qN?v^SK(dN~DAv'̒n@u!*c𬋐D bb$t&ȃp LȨ>*CbN׹꧖]O]uSZF6Pmǘ'.kt k"?ufapqӂS!.Cޓ B ^1pKd `#9a3i1AiJI _ݹ^˯^|ϊsŞ7#ͥEfr1̽Bm,q7Ћ|81E]=l=yq~#O#1aVw?Wɛ7U ՛$2moL7&wdO(OS'LKKh.0!&k@W<Đ(;SC˨Q ҺIM6+𼹦U=Ơm4E; 'K;?9ݏ6?uSJBRL{75girq;Z^6]s |`ʵͅX2a7Ip%^u%H:;WS7ُp,]8|Ŏ]t^"45DZxE[W \Ւ<&KKs -\"dИL2*q5ѨB -69%/R=ŭALWkv ; TM%KQ%Sa E -Z)1v"$D0cN|~ބ+)< O@6ifH)-?VB#og]š7tV`C_y3o<3R]OrFw-w#yM$PBMBŠkJ jI^!O!(k,8%̀o"sufyJͲO4|:Y]/ iKԧu*O ?{?ϲT<~)'Y4ETOUKbYt c:VUiI2c? -/:}Ul/zi\OPz soS -[ЉiM.֛;Uuom?]/~EG}>x}gw?ϩ_mu/ǀ ~O[De7zOz۰o>A_ n9`),q~׎OnhPT<1l3&#~a:h* OBṢy~OEN^t͇''qqvLF׌O^#'A ljv;ނX")"6=~Ո3ÎRR~YC n)JHrB26{<Ecy"X / (|WLRk9ؚ{[w%g}_{&Ea >StAUBZKKI%Mz,)Xr=A\%﩮IҼi֬?uߚ$a@ ]_$[DkI{&9_cݘP54Ҥ=ؔsO>ogg\6z23SOZԚhͳnŒ8٩YUYd7y/g[9|K^ u|.<w-QE59/n׋_}1ﺮ?sBʵ/x/i3SQ΍~r>yTGwLEܨ(PG QNUTVS,څrxfGLE$YH+D9<*󩬦0$! ϣ̣2jsS9%\xөL28 b*K2 \IepKX8d>-Ԓe!SY̧Q(I|H.dy$9lσ](!< >Ƀd^" -yq1%ԫ2•TVCB>E$dgIf>iOC&/ !92yYBJO W~q1n-#͗(He42xS2A&TF-UTAe5ߠr7{F*U W~O)ϫO3*c -VVv^jΆ -ֲ Dq5*GDzdzDOs~WoRƩ*Xdj -V\NjyDfФ)X&h(80*G&x\BVa8,S{ q -Vq kѮV~ )'C!n,#n x2/c2/c2/c2/c2/c' v֣}N`5ˎ}br }t'=YgVe '\C(nC[ -GOGchO]S -ɜ?T$x9F(!39[SyLO)16'AT03\NlCNBǺbKc!oa$.1#F<2rff 0+$e6jywv`^֡82druVt׀.&pyY)j7qYVIFc|U6xad+KVnjH~4yNGQ2ÎF+9{[$5^~b|GȄho2D\O2V`(/&#D*:\ +KzcTGև [L%7>,n}w ߈?Sa>IkKT*DU&Twv[RKLvvw׫ AoQ34s4ss4/k }I%%׀+kJNإu{Lh{WiW{ q?Sm{xnuL: xH=T=v}"Sss?G?>(W.J+o{o?Gd p/o ef8&$&'NbɉZȞ ˾vr|"]NeΆҥl4BaO ]pn57WKCODxi %KE^W-Q2Ea1+M8xK'm2M{l -{C +57YMkd^; -,&o -0LΰHWO0 &("vdHKTZlAUTr#ۨao l3{mg^va'Yv]c7]A-)B+ -%BP-؅aC- DŽS]`KuALH.=e-9.=)sr]믙0S+KN1iaYB>'J]'ڴԍ'4],߭XbAΜn7/5仦Ҧzs\$+Uҵl=zM6-ZY -,fK޲2h9f`eMNf[U6:^mr2S&v%J]o ;re3y0/.D] -Pr_P[@BJݩ^Yo)z9zrT8zBv<^B&v{qț-NhDRhQwǻ3)rT{ś>-q_-{8oy+w5tctǎL J?$`NF.4ZB`Y[$zȦ[ -=Di~ {_d.@{#m;ANq΃z] C ENNwL9 /)7g7$PP_z$rLlk;$3ZH,Ge&){c9.?ylbS=|i)0'3c$W6(4rGT\}_ڑ?J>ɴ]Sݍޭ#zhiodN(l4b} [A''o$79]ny@ -|~u4ʏ5e߷c{Y{:U{rlbG֟aANΌrNOCm%xDD9/?22Hg71>O~:4zM0&m_>] jOE;(fZũAyLsYoyjW@bb>_3o3|6xs`ktT_yk-i=,c~v.lzr=˙ԞiDc~?ѽ^Y7y}9}]30tUh-yߵ[A'#hd^*vw}~܁ZúuR^΀2 -t3w@W|@אL9N ]erMnpKװ}(8awM(;wjYG{xlsXfhg() -lI{˧hgkřjj&_Qet*%NѤcJ)g Oi>־ ih_ -;&m}mUآkx}`w 1woeh!.q)[Y_u++A5 |alVm -RhRUhO!F *:[W^A]>_G}P1]!<e UzW'[_9̎3ث :Z`e•V.nÞvvb uk3q׺vhmޚo]eib XmmJV#fkehZk5@[rȌ@5x:rmlm1;h7Ik[$pgf[,[lF#aY1 hY<.MƣȫIB -ۇ0 kA,aD̰A2+v?$_f+Թ - -T*W -T j*9㚢vͮ ----RWQ-Զ4ⲣ ^C_j9o;o) 5BKX,QhDW).SU*6qfw :]0b4H[$u&v ; ڰS[q5vkm؝IyLל׼p eQsъosc&ODm{3 dF`ZdqQ!i~`b' d B`V 'dqJ\+kxP<*AeTeQը̪[UzڤnVh͚̚!?OSl?ϯ3rL؈dI93~ʌ -GRI:$EB:Cu'7~ꍟy'MgI7~mܨgkGm\<4:ϳU![F׊iO?&3~Lsg*:wFθgs\P A<:sPN~:6 -C ?2hFn|ZK15X]-<NMt5i0|G 8wb!< z4tAqg?4D 2@@OG?0#ˣEp,),{DLf8} -]>.EХZBh6s#! qQ?A!bk6[Sv#ڟ~>0O-4 m㤡A4(E`74`4j k%߸ {5dՐ2V@@OGWSؿK?C<!m'$ z54DO=-!aZ2=CrA pg@@OG1'OA ??Ϻ~hSʼI#͈#i]ªw mѣl fa-E>QmK@9_ګ77ͨ[P dd1 BFl`KȊ&d<̭(B ,J44JU֎\"c o|R>{mvd#FdSXmod!++r -_#m8=aQzTYY.l:K )Y/سȷ9x3Y>=[^gUG5>G /<-OxԎkG. - W;'v۝S}BΙp'pV?3 9(|֘x~;3}G0_`cs'gix 4< y9 -g4w[8fjs!YD]sIf?Y -8|BWk8Vԓ$g-F{>^Ĕ-F۝W=)΅rrz`Lj@*י[YFlŚx;m lD=rk<_PYvgF>tg>Gy)YwaBϽ8p_b_wEf䊻:p'r5>Ȑw/!>Ը;unK>閂#w\;P𲛹ۃnJZL힤Vpvt`Vẇ[(7)\*m`mw1b>_wvAOw`},nK'[g);oܕ/wtx#Tl(uW{8x{g:x{'!x:,z^?/=WL ހWoH w;<]ΤAO^gJ~)݇=E#δΌӞsyĿsz2<[;d;w.8 xw˼g{xz|GzK=zzu4ZSz9_yCh=!"+}| !C)1WAxµQ{K,!2k R\C3:ZKscj shhGpoPK{ S ­ - kZ+DgyjXKllݚ^gPBif¯TFZ"4/hQZ}+[c=p '`'1dѷ^jOYN "Ϊ G^,i8 4q)XpzD HOa` n<i}>_6lɎcxȡ4]1乌+Ȏq\Av+3`0KML`j!0<'ŦDaV~AF֔n4@A7 kLoӞ(Z~^A3(x1)5ӘДmLjZoLmoØa~3M^߃߃"˦ey[o5ߧ=KF{@3cl9 Kf嬁-a_Z}c .|{g+5c/[l}&v;f-c / t_`}Mzt]FytG' ; =G ^Ï ?|~ Fa GBqכjn毙0wGo/O72GT"<~g0E_5ob7X$696>$ElVl*NT*~HJX ÒR#-SZ!I%T&UHUREjZ]it@jY4q7I&~ɖxc<3[q&r78SUp3|-3uY,9GS"tăl.=U};%~n9{4.SWjE;Yy΢֢E{,:,%JEGN*+:[th;EElэ[E`0$z=i O'ד{{$O{*=՞͞4{ڊL'(',%f%{:=<ݞcO/~9Ϡg$<7==I;Лg9V^ke[πw3x*ا5HG6>a([mcl)SĘmaygo,0B`ˌe0_fgle@<+Xya奕WWr|$#%HIRʓRPHyR -U'6HMRM.Z^itP:,N)O:+ҰtM!ݒ<ß0 -L/ofVHK =>Wl)o,6eƵƵj0Vb̢(Bfdl+|;V0q ΍b_ʺ%՗!X[g%9IU9VS+uLou8y_]_} ڣ=ԏ9ޯ:MH7uHr6hA/T۴mWESB[ԾQG~b+-N-`9T]h]P76umBP^W)jcQճW[k-|5m2Kպ"Smr8WwWz5;kaVlbڢN5ڃj`Լ%ˠͪ::7NvQ+Wۛ~Z!ul\e3=Tuoo.4ϐK~vFׇdgKd_.~}Qm߾\;h5W:\}MPu{ok]yc| $(e }^/> 7ocnE[BBiNie|iuT9W $oP 9Qa_mwi/mR=uwrKgď͖S1%2.}~Tv ,/ HpRmX4kw?!~\{ӽ>B~w?nlIOpڄͿʻݿFyw}檠{[In^ư?Fwj7A-tؿ{ԿGY';U򷒮>n[_moFeaQmyOxoOyowgK|?T\.M^][VxjqϹO_K"r_*\(z]"$_gS!%`?洿~XOc/rm떈\DĤ]x{8D㉺9ɺy?PR必@{5ޫی~r.aԥ uOD`;{bV_@]{o͞t$y~YQX;c Kǥ7v 7@sx4{W_|cm@;MBcc 6/|E/)z,=G.zNOPQME?s_s_ss1\D||.".m';4`Y+\ֵȲN.;̲e]ZvuƗMX`&XtBŚZWYX} ֍MZ6vNkuuuzz:|L' 1Jj7$T8aD^SaHke?g$;&T8ݻ̉ϫl3lҤKӗ.\jYyPKK jHn h]iimpA*uzl| {_2!q8KfAұb Y>3MY,[)BzIY9lXi%y|dңlV#,Th1!Ncqmn(1洭Vۼ6[Ve)ضl&KŶ˶Ƕv6e;b;n;i[l&ȱ Xml_ Ԩen;y۶ M ^j;`Nv,A{=i@N$;5SmIW}b{kRR-{`jKӡglU<{4 텶@I -` Bض2B>zqskCp>g߀zZH -h}#P - -jQ^ qVmmFvN{+O6,:H `mkB"KӑK>~ =ّo;-l|9$H@FYF~Ҿj?l? -iS~>dlϨ!?^fa鴍oQzw Г#ΑHa i n^Gk딫uus '*#5.ik r E{Up~뎛M8wycd՝4*}x㋭vVK'.hCӑaxZ%7ˠsy6`>Ua;WE0setN,b`jJHrZ@IJw-5,<>W*\ZEw@wmpm9]\m{V,:JGg \W;6;zC氧96KĠ2u8:Y8vs@&j~9 x'ELjc 0vtvL:uΨHOh8cw'Hq.@qf:sȇTȹiu:+Ev,sVa*g JgJ9뜍&gsmDK|7F[w; ׵Ovڊ9s -BqۡQˈ={[rK`l)c 7ۇl6w9zwns^r;ܝıE݇c%(qH/GJs>hUj9=[dg@"+$'Vdg/*R٢+WU@B^բ]jyɪE[ AjeQ˓'P7=kZO Iox_CEC?!f4&YDu2r1QR Уx"wN##z"t^Tdnjr6B2 -ԩm׹H9 LF=ʎcԩtN7Z~&UکsжqRWmToFqQEEEV-ӣ)QdymQ;oF-x%gOR>edDث=75̖hAm/*6򪝓vۖD?"\;.*uȼgN]5W?h6^ɱ#XHU鱷(R"_x~9faت1C5[4m644)<5>@Y}\ ]Gf *}~JIB%asQç -z4uC#|~SfKe?Omp4 uOʵ4.(_RઢgTSNmB^sUPLO@`O!l7=ITtŇ۾pZnEѕ'-WBF*53X`#&ZmvY{qc^l:f]5wd~/檱qw͖m_E:>^k惮i#=qޖ|^h ^>;czߞ9Gt$N8L|y8yi9ԍzɚv)IE3ڜ#:4ȝOcck%'/|)!96$$1x9Y2<\||M7)4<y HQ6D -`3@PW@3@@"Tա8a{=9f:՗u6|PaHײndʺƣͳMqىpu#;-;l{l @vyvevuIIkYeMA?  лRw|MK O ކe_>AHo͞`O1{eZ`țiA*Pr=d~VaDUt߭kdywS]OH5I }Y=M(&w,#B#ԱёAȤwqž0dx}'[S^$<~`zL -H'G&$rߠ]I]#q%$ӎ&HN.VijTWCFT+v]4FN4ATچ7iLm$}0n~ּ -f2o0͟7Eh"1o2Ś_b= Bp{ [X! -VH!kǶSIțs=Rj_šsϹW%sR/'O$%sKR-NHONɒ`s17g`ArX )9 -OJ07Eũ}%B{rZ T!q `\ d>6קi(`;QoB hW†Գ3qଁ@6$\~, G!F13::2Keϙ2W8 \z7Ub}Y}?*y)-ߘ J[@rAƁVhrٰ9#jK &tF#O7Q[X,i60jQFu?A6֒ 8 (kdVnt5*v);]3>ޒtH#MiI$M&ҁmM>d w1y'Xd^Z^*ҚLogiWXL'3s8NG?0qP\TXPcJGi>ᔸN0Ԩ&aFi \sw,2H4Yhs;1̛$@쬻x7qfyi!3sb{=C,_~_ 月>1G+7po:.u ݦwi7.|R1 = 3x x W7f K3xYB.\ x&<:"` 뷖#$ -(k 7&4kc75kf4>1sF[)v7N"1r$UwD?.ez]CvF M74:%3dۻ!gRř:<(i|s 72PlfCzC!t͘ch~8ppR%\UdTNIqZfCh@MzP8n^H6{|UO-2;z87(4$&%Um -lܣ/%q+'7C~ b׮wR*H&ONŔ.4媁 w`zPmÎE2 xO *2C쉏y[Ӡ#n A.mcNQ R8svrtKtVL!Yds"5N#]iZǀgz=mW@ڧsR=?ik~u&ⷘqRo @zq_^is.uk ^1R=-&#JH*JUJj C]I'8'b*:~tW'4 |Fhs&pf ǧF 68(/Btzw<#J2Y5DPqlJx8e8ˀ~H3l"AZ9z[A;#\xbMwi!%:DC<ݝK48.bJYJ,qtv$B/qh=2r]Ox' ´Ä{3iWI6gT7,ɤ!$yڿC|&(IҮE!OLSC2go =?K ."mvESCD.ltޡiS:8^; g!9ћn)tz "*5G o'Lu c -a|4A/sLi!\O5$28I!F'k]z#ģ/Σ/F3XgiA>`O?b='D,F 臄DZB+8#HL1GLzzIWdk'V+,[GڒH&] _V&\GЉuU& uOd$ُXG$/ sߣDBCc$nPl @Y6YLH%ǫxN5QeSRTfr,q\5䈌A22: ӈS$|^/ŽHoMx@sVwz-hsSR(6q.e$y#h-sPC $It)Êg1ۉFxiŗwMZzǨ^:SIY|F|Ž)7i2Կc x* i(w"CptpRt 뫈sG| 9 󅲼މ2pGm,? tǠ7 nBߍo#w a86hPoH;@i}'$IK(oE5g`U ,)N p[ۀopF-rKO /Nω`ߋ{tO.ooA=":kbiw5rl@{KA/"-~kZI?C>HwLD>|?Gh,3n+LHGy8¯:C_!8Kqa _?Ȫ jK*KDZ×p|EN8Qx1ІwIET(%i Q`PCuS;8F*hk/v!m0O~|yQ'{'N&Gbѣ0&\,_a.~K -G"Dl~m-w%{|5L~Jl 67"ЎڄwPGh^gG#+~ GL|ܷGj;) .4T2|?ÞdqrnxOяieB*pghIp(#J!vM7ho0H;=+nD$i{H&Axl -=- ЩMw8A"򸊉t=H5ʧoN<[uei)Z+eIjURLjsM> n/b/o'bhI#p*+%t:ioIeH(_DYcY{4!|ϭ -ĺCI느ֹi'%ԓgH28y: !;~pp!^M:kl8oDD}b?E3Ei=C>/7Fs%ivd=O$|5&~24?K=V,C*k':-7L (c>DxK"5tHCem4'!DGJ茒,BO>ë=hHʉӀzy P =n`<9ɿMw~Es}zbCMCW%G|&D=[dT0Dɸl"G= hMba:qxodL jBS4!`KD]zw.)3Ip[gϜl QPA+" -XbJQ4MŮQc7c/ f{{{{߻'߽Xf͚5֞ٳـ |݇^%Ⱥb#Pc;eXTFpʑ(.zK + -nbFHygZo5 -H~] B!pj.&Vt=a]y2'Ik;5( - ]/&]~< LEO'ݜ=R:N"YzTH`vđW95A {@ۼ$1dz"lxr7g -񞏁x)M%}S2֐bXGjD*zC$NhBfWQZ(: 2g -N -8z"Ju]͏`UUmlQ(8@8c_ -ͰP :t"p6Fs hNW蹀!mq lSÀe!|N4p> :yy, łc0v}; Z1Լ[5 ->,Tȫ=P z+n$|NC)fEM93[F23)(Q͗C%ROpD-Pp@s" -1 ɘɘsuw}ugNT'{؃=zX͏`smlQ(8@8c_ -ͰP :t"p6Fs hNW蹀!mq lSÀe!|N4p> :zy, c1OFKFvJFvJF|;hp0v$mdyeUf}.-2{:E)} ީM ȫ=rVI} IhQX'ڦ#X#b  -Nh+"s*Jw}P@'A,8UI8#@OD.o2ʂ=- \(8@8c_ -ͰP :t"{%6Fs hNW蹀!mq lSÀe!|N4p> :yy, młc0vw; Qj RP?_ߗȫ=MnE퐄cHB3|+CV),)̋F 7b% -2X ޕ+!P>Úp;Vnsp%5aքX`MX5aքX`MX5aք.患IT9$Z$V&ShE-.]" (`]U?זH@_SJ=\TVx``(dL6 b.AkRG܁UУxƩ4^̃=RC4X8aN)ZP-=GDEC+-_9sT̢ z>|1k$mLzIUv_Ew+l9к=hעgH7&7,ļPp`Q ߆J%]r$w {(2LY<+:9ixrv_ar91sFc> +$Yi' E"XJ \rri_Y M>~}U\KIUlЗChk&rRLr_ST{_IZշ,FrT$E=h'=HmJyHzJY) Èc]3݋^ oKX{lF6xp?x?:Wo&`t0^tZC_d[jƃS3Q$%1QLT<1VsMϙ<0N q׵JdU8Sx^tL|: iNF[aTBsAY duZi=#< ; fHѢ % A\cQ+p%eqYK[ b`Zc|;b!rd78IoB#z@ƻ9_342Lo̐ː%@;#.Gd39v &H~݋VC=!|:/J7bձKF_FYˮԐhfmD-a 4)o2fd{z'sc䈻@1سDvrH_x,, X'K=yBV>;V^HI+ϪnVs@ciuf*h|ÍGɓ$8S%G~ w碛x_5ZsՒEwdg=p}e߀Ag}PA炯wLwh*d\p3SDr -N(`!#4L(A -d~)vGpfS IY7T"큶A u ڎhÒp $98[ 3OsF6Ȩx^0`4sp\P v -o6@+e*{Z -{hEihp@l30xn'lFuoC>q@;Z<&A~y3@f 8=&*QzfSx󡶔9_«{@@/ًh2=wk(BЏU?ˠn'C 'јos_@=c0`'ݎk4ix9~Y -z 2xXHM`xh,28þDţ/^FN{*wd;|xÆyCaONiF6BGEKo#W,F{g49ӈ}?< -1#H|F6tOhe*w=S=xZG?u%8 ' M+֫7"-tDF'H!@Fy7_$vā'Q$xhq!nI,Ee_ -2hpB6½Pe8qq1,dlB`nľd}BbJ/31%1LN ^2frj\2 |4 O"y|&MGD2G' Z>AO ʼn7#A> #mHҕ!$7?fGd"EE~\`,Da]*Q\s`~q=_4!/z򷪅~ E] _@hC" |U↑ej'A꒦$DΤ7Op)<7!9$%Nr#Ur< /{H̛542ouy kּ̿U\W jq]mށN\ךwE\wV =2j^\טּ_H6 -JA\Wk̿|XH1?Gq]e>jq\׈, k'ڿ02SJi3g Ϝ5O҇!FǤ:}J1_1!kHYc֘)0FY ւd,b,(EjhM갎# fYgº$T~e ,cޥ>Ka)Kci!†Fl8N/ٗ Ɛ,eflGX"D6`$ҒMfI8f٤Ʀ6M'L6al)C<6e|Ҏ-d I{rH:a,t`+J+C:l#mbH'1w.ta{^ҕdI7v&qv`'IғfI/1ϓD5va,ij;I`}җ=fI?='{EwIbE$s)LRw /F8]+Ix)K${rO2WͽP%2W܇܏ܟʭdk/y"y!cx]^ yC+ޔ7%xWޕ=yO>dOid:uk $7iv$[sTVLJh%ȷZi4yjdVA@fjdVUJfkյ;W%s-ji<-X &kzdHkDhʹfdRkIi$Gk%?h1Z Y}}Fh].GփiqdWKiZ"Ւ$\Dm2V>J :Ns|Ct#Bt=D ^-zW~EU/XuKa=engl/(-cyl ~al'`c􌸞cUvf{^+s{DH^V<סx:lT͢i榹kk5:Z]TkEhQZQuzk Ze*2Af3!)i9MEbZʌ|eACGr@^Ґ!/9#/G^rA^rE^rC^*Ty;Ri2Ke<xc/1xLF<@< StZV}Nt]B t3Fwiz^h>#g"}D aX։ue=Y֏%, c#b`z۷0ao(=-gv`{!{bonqGz%DI 7O`7~5\RZYVIjPDk"ZMkD_$ˑ(ȵAڈ`c1XXX xlxlxlx GPIDU!AxpDDH >Rb GO^ -hD~/^$j^_$g98 ٶ<}HO"c|D&?m*۝~f©%, -UI"T?qui,Օdgr4RJ1v:Q #^ޗTSfbRsb~p<A_[қ[K2''T5 ݷvYV;i9.LUXDPŤ(y/+=)}9U\+6KEZb~^{{E&ƥ&dx5KMX %i2SS+Xr &3%f|a-Wl )hٹc`Mcmu~_ %U t?X\?/1oh$fWst|)}>f dV>^1}SVv͚X3M4bDLlbԹn rVCw+`AO{fޤ6ѽ_UF*9ac6;o=J+:_YJO6~{Q~ FzDzCC"^ S͢ªKN6Mnљo7>{-3Yn|X_/i0vgeA/7a ;fy/m]PyG"fk~,+VM8ԱvSغ{FxNh07RƵ'RRȏ'\Q}k*YYլ".cfJcKI;:1]N |R/Gf!~e#{7O,~˸[I]M"YX=%I-<6 }Qڇ/ {buTUQ'Cˈ*ώmXܩj YF"~r~#+>#.1I\0hyg=8,*8rzpiʩWC=dk*}v\ݷw ۂşݯ>{FӤj6Lnv[;4IJݶy[vϨڈ7Vvqsn -Y<ƙz+ˮqSvzqejUoNN76Ἃ^vYKrs'xcc q9f1t!raO㈉-`{hfeO,]0;*FW㙐qu{o%;w)hwjQGΞ8MP>WyO 6G-Z=x kM_MUx4N݁s{9mgoM[m`ه7~iǠc2;O.Q8NV5C|cCpH],mm;P/-O#}<2"ḱ <\yiE;.C{ϡ6)'uƥKNZ ڷ?:_ժJӫ*pmI5+:T}wtۄ<=.jك_yZ٧.3D㑋dDg>anݤr^KwwZH>u֠`zBŏN ߮u.[si C~կ6чzذօVӫmm;9{vuaUnx/GcVZftܔ\w??xz&)_p?{@Y~6U-aY2jl]eQ,/a=s\$+9KΚss>/^_")hޥf?m {-~ny:[i|_ʊ͎MZt& 6?D8DN q&j}ِQ"*J`,DAM2&yI&9.`R`/ę%ьR@M4LaO=3mq/Gly_lIޠIOlML<@!'HJf&ȩ1.jS ,L -LL-0mׯn׮2̽rq]-h%(ԝ:]&,?yXVnyً֔gʼ=R!2FWdZ\ⓑeղ߱ʛ&صe3ߋ1?'rkn7_)+~vqZ>`uUwmzJ>MaJua f{+Wf.˨H)a*8V̵1w,?sq덑ӌ6qFYpWme"׸'}yx7 QIjp -endstream endobj 368 0 obj <> endobj 369 0 obj [250 0 0 0 0 1000 833 278 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 0 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 0 333 0 500 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400 0 0 0 0 576 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556] endobj 366 0 obj <> endobj 367 0 obj [250 0 408 500 0 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 541 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 760 0 400 549 300 0 0 576 0 0 0 0 0 0 0 750 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 564 0 0 0 0 0 0 0 500 444 0 0 0 0 0 0 0 444 444 0 444 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 500] endobj 359 0 obj <> endobj 10 0 obj <> endobj 386 0 obj <> endobj 188 0 obj <> endobj 194 0 obj <> endobj 200 0 obj <> endobj 206 0 obj <> endobj 212 0 obj <> endobj 218 0 obj <> endobj 224 0 obj <> endobj 230 0 obj <> endobj 236 0 obj <> endobj 242 0 obj <> endobj 248 0 obj <> endobj 254 0 obj <> endobj 260 0 obj <> endobj 266 0 obj <> endobj 261 0 obj <> endobj 262 0 obj <> endobj 263 0 obj <> endobj 264 0 obj <> endobj 265 0 obj <> endobj 255 0 obj <> endobj 256 0 obj <> endobj 257 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 249 0 obj <> endobj 250 0 obj <> endobj 251 0 obj <> endobj 252 0 obj <> endobj 253 0 obj <> endobj 243 0 obj <> endobj 244 0 obj <> endobj 245 0 obj <> endobj 246 0 obj <> endobj 247 0 obj <> endobj 237 0 obj <> endobj 238 0 obj <> endobj 239 0 obj <> endobj 240 0 obj <> endobj 241 0 obj <> endobj 231 0 obj <> endobj 232 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <> endobj 235 0 obj <> endobj 225 0 obj <> endobj 226 0 obj <> endobj 227 0 obj <> endobj 228 0 obj <> endobj 229 0 obj <> endobj 219 0 obj <> endobj 220 0 obj <> endobj 221 0 obj <> endobj 222 0 obj <> endobj 223 0 obj <> endobj 213 0 obj <> endobj 214 0 obj <> endobj 215 0 obj <> endobj 216 0 obj <> endobj 217 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 209 0 obj <> endobj 210 0 obj <> endobj 211 0 obj <> endobj 201 0 obj <> endobj 202 0 obj <> endobj 203 0 obj <> endobj 204 0 obj <> endobj 205 0 obj <> endobj 195 0 obj <> endobj 196 0 obj <> endobj 197 0 obj <> endobj 198 0 obj <> endobj 199 0 obj <> endobj 189 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 192 0 obj <> endobj 193 0 obj <> endobj 187 0 obj <> endobj 271 0 obj <> endobj 278 0 obj <> endobj 286 0 obj <> endobj 294 0 obj <> endobj 302 0 obj <> endobj 310 0 obj <> endobj 318 0 obj <> endobj 326 0 obj <> endobj 334 0 obj <> endobj 342 0 obj <> endobj 350 0 obj <> endobj 343 0 obj <> endobj 344 0 obj <> endobj 345 0 obj <> endobj 346 0 obj <> endobj 347 0 obj <> endobj 348 0 obj <> endobj 349 0 obj <> endobj 335 0 obj <> endobj 336 0 obj <> endobj 337 0 obj <> endobj 338 0 obj <> endobj 339 0 obj <> endobj 340 0 obj <> endobj 341 0 obj <> endobj 327 0 obj <> endobj 328 0 obj <> endobj 329 0 obj <> endobj 330 0 obj <> endobj 331 0 obj <> endobj 332 0 obj <> endobj 333 0 obj <> endobj 319 0 obj <> endobj 320 0 obj <> endobj 321 0 obj <> endobj 322 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 325 0 obj <> endobj 311 0 obj <> endobj 312 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> endobj 315 0 obj <> endobj 316 0 obj <> endobj 317 0 obj <> endobj 303 0 obj <> endobj 304 0 obj <> endobj 305 0 obj <> endobj 306 0 obj <> endobj 307 0 obj <> endobj 308 0 obj <> endobj 309 0 obj <> endobj 295 0 obj <> endobj 296 0 obj <> endobj 297 0 obj <> endobj 298 0 obj <> endobj 299 0 obj <> endobj 300 0 obj <> endobj 301 0 obj <> endobj 287 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <> endobj 290 0 obj <> endobj 291 0 obj <> endobj 292 0 obj <> endobj 293 0 obj <> endobj 279 0 obj <> endobj 280 0 obj <> endobj 281 0 obj <> endobj 282 0 obj <> endobj 283 0 obj <> endobj 284 0 obj <> endobj 285 0 obj <> endobj 272 0 obj <> endobj 273 0 obj <> endobj 274 0 obj <> endobj 275 0 obj <> endobj 276 0 obj <> endobj 277 0 obj <> endobj 267 0 obj <> endobj 268 0 obj <> endobj 269 0 obj <> endobj 270 0 obj <> endobj 351 0 obj <> endobj 352 0 obj <> endobj 353 0 obj <> endobj 354 0 obj <> endobj 355 0 obj <> endobj 356 0 obj <> endobj 357 0 obj <> endobj 4 0 obj <> endobj xref -0 387 -0000000000 65535 f -0000000016 00000 n -0000000122 00000 n -0000003702 00000 n -0000192343 00000 n -0000003785 00000 n -0000014494 00000 n -0000003884 00000 n -0000003932 00000 n -0000005280 00000 n -0000181469 00000 n -0000005530 00000 n -0000005578 00000 n -0000005629 00000 n -0000005677 00000 n -0000005725 00000 n -0000005773 00000 n -0000005821 00000 n -0000005869 00000 n -0000005920 00000 n -0000005968 00000 n -0000006016 00000 n -0000006065 00000 n -0000006114 00000 n -0000006163 00000 n -0000006215 00000 n -0000006264 00000 n -0000006313 00000 n -0000006362 00000 n -0000006411 00000 n -0000006460 00000 n -0000006512 00000 n -0000006561 00000 n -0000006610 00000 n -0000006659 00000 n -0000006708 00000 n -0000006757 00000 n -0000006809 00000 n -0000006858 00000 n -0000006907 00000 n -0000006956 00000 n -0000007005 00000 n -0000007054 00000 n -0000007106 00000 n -0000007155 00000 n -0000007204 00000 n -0000007253 00000 n -0000007302 00000 n -0000007351 00000 n -0000007403 00000 n -0000007452 00000 n -0000007501 00000 n -0000007550 00000 n -0000007599 00000 n -0000007648 00000 n -0000007700 00000 n -0000007749 00000 n -0000007798 00000 n -0000007847 00000 n -0000007896 00000 n -0000007945 00000 n -0000007997 00000 n -0000008046 00000 n -0000008095 00000 n -0000008144 00000 n -0000008193 00000 n -0000008242 00000 n -0000008294 00000 n -0000008343 00000 n -0000008392 00000 n -0000008441 00000 n -0000008490 00000 n -0000008539 00000 n -0000008591 00000 n -0000008640 00000 n -0000008689 00000 n -0000008738 00000 n -0000008787 00000 n -0000008836 00000 n -0000008888 00000 n -0000008937 00000 n -0000008986 00000 n -0000009035 00000 n -0000009084 00000 n -0000009133 00000 n -0000009185 00000 n -0000009234 00000 n -0000009283 00000 n -0000009332 00000 n -0000009381 00000 n -0000009430 00000 n -0000009482 00000 n -0000009530 00000 n -0000009578 00000 n -0000009626 00000 n -0000009674 00000 n -0000009723 00000 n -0000009772 00000 n -0000009821 00000 n -0000009870 00000 n -0000009922 00000 n -0000009972 00000 n -0000010022 00000 n -0000010072 00000 n -0000010122 00000 n -0000010172 00000 n -0000010222 00000 n -0000010275 00000 n -0000010325 00000 n -0000010375 00000 n -0000010425 00000 n -0000010475 00000 n -0000010526 00000 n -0000010577 00000 n -0000010628 00000 n -0000010682 00000 n -0000010733 00000 n -0000010784 00000 n -0000010835 00000 n -0000010886 00000 n -0000010937 00000 n -0000010988 00000 n -0000011039 00000 n -0000011093 00000 n -0000011144 00000 n -0000011195 00000 n -0000011246 00000 n -0000011297 00000 n -0000011348 00000 n -0000011399 00000 n -0000011450 00000 n -0000011504 00000 n -0000011555 00000 n -0000011606 00000 n -0000011657 00000 n -0000011708 00000 n -0000011759 00000 n -0000011810 00000 n -0000011861 00000 n -0000011915 00000 n -0000011966 00000 n -0000012017 00000 n -0000012068 00000 n -0000012119 00000 n -0000012170 00000 n -0000012221 00000 n -0000012272 00000 n -0000012326 00000 n -0000012377 00000 n -0000012428 00000 n -0000012479 00000 n -0000012530 00000 n -0000012581 00000 n -0000012632 00000 n -0000012683 00000 n -0000012737 00000 n -0000012788 00000 n -0000012839 00000 n -0000012890 00000 n -0000012941 00000 n -0000012992 00000 n -0000013043 00000 n -0000013094 00000 n -0000013148 00000 n -0000013199 00000 n -0000013250 00000 n -0000013301 00000 n -0000013352 00000 n -0000013403 00000 n -0000013454 00000 n -0000013505 00000 n -0000013559 00000 n -0000013610 00000 n -0000013661 00000 n -0000013712 00000 n -0000013763 00000 n -0000013814 00000 n -0000013865 00000 n -0000013916 00000 n -0000013970 00000 n -0000014021 00000 n -0000014072 00000 n -0000014123 00000 n -0000014174 00000 n -0000014225 00000 n -0000014276 00000 n -0000014327 00000 n -0000186602 00000 n -0000181715 00000 n -0000186327 00000 n -0000186382 00000 n -0000186437 00000 n -0000186492 00000 n -0000186547 00000 n -0000181779 00000 n -0000186052 00000 n -0000186107 00000 n -0000186162 00000 n -0000186217 00000 n -0000186272 00000 n -0000181875 00000 n -0000185777 00000 n -0000185832 00000 n -0000185887 00000 n -0000185942 00000 n -0000185997 00000 n -0000181971 00000 n -0000185502 00000 n -0000185557 00000 n -0000185612 00000 n -0000185667 00000 n -0000185722 00000 n -0000182067 00000 n -0000185227 00000 n -0000185282 00000 n -0000185337 00000 n -0000185392 00000 n -0000185447 00000 n -0000182163 00000 n -0000184952 00000 n -0000185007 00000 n -0000185062 00000 n -0000185117 00000 n -0000185172 00000 n -0000182259 00000 n -0000184677 00000 n -0000184732 00000 n -0000184787 00000 n -0000184842 00000 n -0000184897 00000 n -0000182355 00000 n -0000184402 00000 n -0000184457 00000 n -0000184512 00000 n -0000184567 00000 n -0000184622 00000 n -0000182451 00000 n -0000184127 00000 n -0000184182 00000 n -0000184237 00000 n -0000184292 00000 n -0000184347 00000 n -0000182547 00000 n -0000183852 00000 n -0000183907 00000 n -0000183962 00000 n -0000184017 00000 n -0000184072 00000 n -0000182643 00000 n -0000183577 00000 n -0000183632 00000 n -0000183687 00000 n -0000183742 00000 n -0000183797 00000 n -0000182739 00000 n -0000183302 00000 n -0000183357 00000 n -0000183412 00000 n -0000183467 00000 n -0000183522 00000 n -0000182835 00000 n -0000183027 00000 n -0000183082 00000 n -0000183137 00000 n -0000183192 00000 n -0000183247 00000 n -0000182931 00000 n -0000191731 00000 n -0000191786 00000 n -0000191841 00000 n -0000191896 00000 n -0000186657 00000 n -0000191395 00000 n -0000191451 00000 n -0000191507 00000 n -0000191563 00000 n -0000191619 00000 n -0000191675 00000 n -0000186745 00000 n -0000191003 00000 n -0000191059 00000 n -0000191115 00000 n -0000191171 00000 n -0000191227 00000 n -0000191283 00000 n -0000191339 00000 n -0000186850 00000 n -0000190611 00000 n -0000190667 00000 n -0000190723 00000 n -0000190779 00000 n -0000190835 00000 n -0000190891 00000 n -0000190947 00000 n -0000186963 00000 n -0000190219 00000 n -0000190275 00000 n -0000190331 00000 n -0000190387 00000 n -0000190443 00000 n -0000190499 00000 n -0000190555 00000 n -0000187076 00000 n -0000189827 00000 n -0000189883 00000 n -0000189939 00000 n -0000189995 00000 n -0000190051 00000 n -0000190107 00000 n -0000190163 00000 n -0000187189 00000 n -0000189435 00000 n -0000189491 00000 n -0000189547 00000 n -0000189603 00000 n -0000189659 00000 n -0000189715 00000 n -0000189771 00000 n -0000187302 00000 n -0000189043 00000 n -0000189099 00000 n -0000189155 00000 n -0000189211 00000 n -0000189267 00000 n -0000189323 00000 n -0000189379 00000 n -0000187415 00000 n -0000188651 00000 n -0000188707 00000 n -0000188763 00000 n -0000188819 00000 n -0000188875 00000 n -0000188931 00000 n -0000188987 00000 n -0000187528 00000 n -0000188259 00000 n -0000188315 00000 n -0000188371 00000 n -0000188427 00000 n -0000188483 00000 n -0000188539 00000 n -0000188595 00000 n -0000187641 00000 n -0000187867 00000 n -0000187923 00000 n -0000187979 00000 n -0000188035 00000 n -0000188091 00000 n -0000188147 00000 n -0000188203 00000 n -0000187754 00000 n -0000191951 00000 n -0000192007 00000 n -0000192063 00000 n -0000192119 00000 n -0000192175 00000 n -0000192231 00000 n -0000192287 00000 n -0000014381 00000 n -0000181322 00000 n -0000014772 00000 n -0000024931 00000 n -0000025106 00000 n -0000025286 00000 n -0000025428 00000 n -0000025565 00000 n -0000180422 00000 n -0000180657 00000 n -0000179605 00000 n -0000179845 00000 n -0000109196 00000 n -0000109223 00000 n -0000026472 00000 n -0000026499 00000 n -0000025747 00000 n -0000025993 00000 n -0000026981 00000 n -0000027147 00000 n -0000027217 00000 n -0000027470 00000 n -0000028041 00000 n -0000109675 00000 n -0000109846 00000 n -0000109916 00000 n -0000110174 00000 n -0000110614 00000 n -0000181552 00000 n -trailer -<<1290CC486160B9479FDDDE0E78E988FE>]>> -startxref -192586 -%%EOF diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/85 Pydiflumetofen_DAR_08_Volume_3CA_B-6_2017-07-26_Page134.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/85 Pydiflumetofen_DAR_08_Volume_3CA_B-6_2017-07-26_Page134.pdf deleted file mode 100644 index 57f6eb60..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/85 Pydiflumetofen_DAR_08_Volume_3CA_B-6_2017-07-26_Page134.pdf +++ /dev/null @@ -1,694 +0,0 @@ -%PDF-1.7 % -1 0 obj <>/Metadata 2 0 R/Pages 3 0 R/StructTreeRoot 6 0 R/Type/Catalog>> endobj 5 0 obj <>/Font<>>>/Fields[]>> endobj 2 0 obj <>stream - - - - - 2023-04-13T14:11:45+02:00 - 2023-04-13T14:11:45+02:00 - 2023-04-13T14:11:45+02:00 - application/pdf - uuid:466ea591-8773-4bb0-8166-93a38cd70c3c - uuid:635fde64-d81c-44f3-9eb9-005152047d0e - Foxit PhantomPDF Printer version 8.0.2.0718 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 6 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 141 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <> endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 155 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 160 0 obj <> endobj 161 0 obj <> endobj 162 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <> endobj 166 0 obj <> endobj 167 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 171 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> endobj 174 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 177 0 obj <> endobj 178 0 obj <> endobj 179 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 182 0 obj <> endobj 183 0 obj <> endobj 184 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 187 0 obj <> endobj 188 0 obj <> endobj 189 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 192 0 obj <> endobj 193 0 obj <> endobj 194 0 obj <> endobj 195 0 obj <> endobj 196 0 obj <> endobj 197 0 obj <> endobj 198 0 obj <> endobj 199 0 obj <> endobj 200 0 obj <> endobj 201 0 obj <> endobj 202 0 obj <> endobj 203 0 obj <> endobj 204 0 obj <> endobj 205 0 obj <> endobj 206 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 209 0 obj <> endobj 210 0 obj <> endobj 211 0 obj <> endobj 212 0 obj <> endobj 213 0 obj <> endobj 214 0 obj <> endobj 215 0 obj <> endobj 216 0 obj <> endobj 217 0 obj <> endobj 218 0 obj <> endobj 219 0 obj <> endobj 220 0 obj <> endobj 221 0 obj <> endobj 222 0 obj <> endobj 223 0 obj <> endobj 224 0 obj <> endobj 225 0 obj <> endobj 226 0 obj <> endobj 227 0 obj <> endobj 228 0 obj <> endobj 229 0 obj <> endobj 230 0 obj <> endobj 231 0 obj <> endobj 232 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <> endobj 235 0 obj <> endobj 427 0 obj <> endobj 10 0 obj <>/MediaBox[0 0 595.56 842.04]/Parent 3 0 R/Resources<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/Page>> endobj 429 0 obj <>stream -x][7r~7p 3n-X,KH`ovN4fxmXE6*J`@SUvهo_=Ϟo_twx/N'7_u:~uj4tyҧqtݧ47ϟ>_./oPE3;=\ݿ}ɿC`W|CߟOhk7eӘ`y"ç }VW:._;7a^)C|nvcW<]MA?Wp@3ٷ//n.٫: msU,{U7,uRfume`zaiUO3ӇO?:=P#kq0\x2LV;W1i/|qaϏ5_'^}6%⪵_߈;<|}d:׋Ik5?T8[r:R_ ])l^t}᷋RWUs<¯G;(3NߟoB;u҇TӜ̇ |Ab5O qk>z݇d@zr+mZ }@u (}0nOw^і |=SyXmi5HƎowp]Ϸ?C_tm -WLfS]v-ۏmo w8>7& -t/L[~|xu@Ͱ;ZJ|x5hK{ڨfvn^_Lͣ hm|\J1kn'KhľUK+ۿ?mg6 -g3w>̽ @to2j%՘o?=vbލZkjy2Xɕ94n1^3H0i*O%apUΖ&X&2֯,2 + -vRP&&Ռ<C(̥}EW*ۂ#ZG8/D$2nd\%*$%]$b: AS%F֤.Ӳ$ -JD :$<$zQ*if5F XVE\*`cpǪciDQz܅UF5`J'҈>հ5Xq/<`xDa9`yD9n>@낓GjfyDI ym9P+ Ж\6,tHAVD8x%|ʁ9A~V:*XBaiI$l.c \hd +sē!+"+yƀ0.>t -b vpճ(1`>`0.@ U2m; j]0c -I1D~uc ;r3 j\nW04R R,c0Ij:ץdr)R샬x+?xUbTYVJAȊ\`("S -IAeJ!P$-0VS4+ ]M$S -~U(E<@tJŊ^෣ߛ5FRˍϥ$ĢMBxJ[IOB! !(,[6 -;ֺl I2 3&]hK aĦ -U)j0Gl](w*й uUb& -,#!O?VGr&u{XC76U(1*|йMuEa볥mjEE" -0ʿ 9"âGJ=T& -hK=xUbTɩYU& +rBH=,|Aqy! P$ g R:jj&~ >*k]V( $k2jT l" U>3[)CuW&1HpH:ҹ]}Al1 -*{ЙCsfqEd0ʿFif6`ϥâbϐ)U<%ky;dDvn9`E7:Eu~ȊN[;!+s<Gk <[T3p Gl AN`9` o)U-n6EH&XHQJeYT&(TQDŽVJ"dE^YQ"GQ$CDQDks+%QDf׺PS]rQQeeȵ4mkݴ^ j9 RAQ@6q F|J@j֭vV/1hw:cf{~hgmlzNG =89Jul4"* P ]@9·olqTI07w遱R^Od E2di#%ʐ%YT,yU"Y"U2YUykD$+rB KO$Ȓ$CD6d ȾZ*#z$~7]&3 javKx)eJm7'W٘H0bJyo}h#Z݈Q-\>=y5$䷑YGƈI :s"PdP5+:5ڳ+5= рMƐIeOzR eSՉ=sƐI eNu|pޤ6vEt<+96!|] -&7w)*, (ʿ96LP$C=C ݓU !stϫ鞬ʓn=Y -[/Qx÷W"$B,"֗[I[7׮h9P!kJx:"Wa Hc!1l[_!e%<{S@s\MΪbAj UƁ^;h 8eNve #K{4O0k!+ah-T2GmE;-a8f="{`r$sSMiGNQ.6gLO+N5"i2H0 -H5Z!9\gD5IDjL53|gdS%R͌*7X)jfzfg6(8 YeTȖpj {>8e݈}glCY>6}ǒ`3N~#pKyo]ˈ /3h z{o6Nj}Wa:$}oZø~x魱= |z }ZR]]*MɆ)Џm. 6.rVrȖ31]Ems2.ʤONN L+lZq,$zexBU1!5sԃJdFZmVu]R򜓌e3G݌(I7ȏWSgNj]A -$HlQqX%h -j&۝0,ݮwd'5f?P*Ugpks:e:;Cį2Lwa6rm?&8/@O>Wڑfbd!ΓT4ż G!Z=4q<¹Y;XRUM."@;JQ, ;&YRl`ReB`>4P_Ѐ<\/Tǽ˝#V#]\剶P] _4EqJEme}H7;)?bowI1hKY]b6RA%RY yPx|^#gآ*4RKLܩrQF{T#g*{Z)dz"p:w/BKQȡ\ -BT4Qftt -T9ezGRa,-6`0•}R-hۄ>̆[Fv-Tc*aV1ƩNcfUCUVlfb!r`]R&j1(@$ 2tw]Q* 3GK]`n$f/w1Ol.P5ef╙z\̑u |zb0GaϞz)2cB9 f*jKz<1jK^iWa Ý:Z~J;j%;( w=RRpGVbʅ;^*9ܑU1Vr#+z/+plBQTlJ[$k`-Tb-^T -DT&.IZ0r(,dkL %Fnt5*gb⻱w͟//L6 9CY:}p(ăoOO0 4y-,ތoo>Kxw7$cW^܉<*@3{ $Y0$gG ]‚kZA3o ;sUl-˵Vjf牡ZYj~Ss - /.|~|x=!>~xsQ(y~}H/1po$%K~L;kh}e:v~52Н -}0_xRn1~Di\՘K;;)fy(%;͌\فd<{wM%P~WP;W[;3?p!y %[DU -c eڧ5oq4簢7AA7wPNgƿX';l}0 - V]jv\)?/4Z\7-~*͆p5^ik~;[z.LU=9Unt!QCFШ[~Ĩڦpːs8u0awH9Ts.w0 N ڴw9lvkh@0ZpI#ܖV> نj:Ėk/BM#LY -z@dPNH(EOʤ\1;;4׹8PJyǕbMr|j5S=@7(U?ivZd9YknOY,q;0g8Hah&Ee&] IfR@jU%ȅL/$)[!hzВZK ӭ[xL -+""~bJI48 KO$~ -.PV2Ʌɀl2EF- iTu2O-(q]7gt(M[հ,fC&J]Hy B@}!3z;&̙R~ᘸͶT <bXiV'^lq~Fa@|,ůډN+W:uAy͸&q%`*P HE$"G$zrՊKDRU%˗\V Kl/*ZH -D*R&I^;|%+S(K\ 3n%",:9Equ+ ~% SMDyxD&v@ kMD{a~!` TSnM(%B-G(PpzИ/sՎq:`1p9Fp-럝ߋ馵^IH72|OEG)PD:hNu"pH:T['27=0[?N6o$b -8gır$̖Rt#lZfhmQ$ӉnAg6LD6d1Ln˥u:G&ϛ}a>w υ$W W@$h!TM{Wu\A9-Gm5̴0WB!Y؈VsⅭz v@F`acD6X BQ;r4*Xr.񚅍qZO F؁VƐtn,lD^W M(jvӥ @ 8B""ZDBRB8$ -R% -Y c ,+`¦E Rqe -er.M iEnӥT -eSv!sD+6JhTB+r/Z= eL0IbRn(@ -XŘ|nW8s(`9VA`1aiDQ*vXU*KtUZ60$Rl7_p󫸴a%2+G)tV(ᝑ5P!*ZXʬhj lBrpy!=(+R(P(S[F ̎KJs+\tO_}Ċh]7ޔ9b(p -ˋ7tG2or`h!vR3jwnfJ~5,r[xZ8`hT%Peێ&N,[WC%n,f,f"ZqI/#7gGOMulZ-7"XVVr;Hfz++jL7+jv+Ap3^fVBfNͬPyg$ndn&*ZufQ;hCq1/@- @I:Z"d4f$Oeo2WSű.NSAoyf)D:0$&34M56 o-O0ثo< r?pd9O1 Bf.&{u6ϐ* |!2rH612s=ezr-gv4 \Os LX1WŠ,{ΩR)+9RV3{.)r4f,V!%J?deHY+=3yv7V:vZǼ;rfV,zs482ѧ* Fu~zID^"P@"EZ"&)y8pHX"v%〉%3BJDLMYO!֬ +Ϣľqd\B,;ev[UQq!b*+ŴienK/ 5:H\*Æ`p>lvPg2}yV{m;y ]0qa*ȱN`ڇFl U :ev;w:WDA;r *ȭ|r{_n~qJ KwNov^Ip$^HVBdHNHPyg$zdv$*r,ddn! -8V]iUI)ɥU9<'6fC} 5M<7puUU&F(Fd#h xpB> <0{ * -V=yEii-ƒlAa{.xsi|m.Kefo]l;Ĩ͙SNzgA#{oC9|bJJn q&Ӕx9|bL!L%N>'^#v$0qHV2Z|s>Bi;kH$"KzCi|"-f8$,;UyFVH\7_)m}.;gw+N vʌ!̫ټ9aUiNLO);^-0iUYSV%<+7Ey":.$̆aN˕pv\}4s`T &u5MhARcOw1sƔ1UYQ*m]J Y?|xGˢn/>r;l0 |o'?*(=YX+wa|7r?H zCG{-"CG C_:j Pб]4F/;2Ϣj\PE*S(92B h5EFъ[".fT"n 1WGN+m{HqVxh:x_%PaӮΪ}<Z1anuo*foS|m&X7<p}`+ udb~( L&I ɍR}X"1X^p JӭbLB< - -L[d-{ޫ#l4*G#|m^{:^P[TG]aV}1Bv!T[= %sZTT|\,Hj+(*~K֥Qd&IrA (!7:&($6Y6"qBG+#4 հMlKh}`Kdžy HG 1o%ҙpK8+RBrKCAK )#SMx`e507D`(H q -endstream endobj 430 0 obj <> endobj 431 0 obj <> endobj 432 0 obj <> endobj 433 0 obj <> endobj 440 0 obj <> endobj 441 0 obj [250 0 420 0 0 833 0 0 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 0 0 675 675 0 0 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 0 0 556 556 0 0 0 0 500 0 500 500 444 500 444 278 500 500 278 0 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400 0 0 0 0 576 0 0 0 0 310] endobj 438 0 obj [442 0 R] endobj 439 0 obj <>stream -x}Sn0> !H%}i?" 95yJh3fyfd=nte`Nvc)s-zǵ4(bF3cq_MGL6ޟZ#8f_u^fVsc|L=01bʮ/J0>yv,z+v@W}AC]~Ҳ=Ox1F[|ԞY"A{Z1;w -u1?!0$PH<yJ#IE@rVN.d臤#E~v߮Ӯ&9Ԅ]aHpnW@*/KKOD;L h%8DJgDC EO}1s~dL 8,6Y5?? -endstream endobj 442 0 obj <> endobj 443 0 obj <> endobj 444 0 obj <> endobj 445 0 obj [0[778]3[250]6[500 500 1000 833]11[333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500]36[722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333]64[333]68[500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444]96[394]131[400]147[549 549 549]151[576]177[500]179[500 500 333 333]242[750]533[527 468]541[567]1734[279]] endobj 446 0 obj <>stream -xT0sv>[fw+ua).T) -(X@,(RԈM2K@Q5`L1D0!jʪI$|Ϲ3 ~_ߏs9󜧞{gzLxXpyT^-X̼zu)Xoú┢[ g= ^yَIXW6@zpAW/ -|o.YZ;vhZeU?v,CJXz u(V%Kd+L;<)@|Yn&Lj @:w[L_^lsn,&"T)d2 /ucw؍SۛWplI*$JƳu/&39A?q"^s0}1:}9 r %Ϡ@}, K00bl8>q+Ƒr3d 1'atc9=ʫa -`mX.ľE8/;X+`1r1a\ф|2kjxGpxo&`>ӄXouRa1x.}dcyN<ό5b^шqp9$pP~~0Ygfy.>K0 F[,O<gʑy)\ -¥W%;a|.K@Nw3KR.g :(%y)\ -¥p)\ -¥vu`wR.KR.KR.KR.Kw9\ -¥p)|k2ѓ'Xxx(4 kF?ݰ^$#QZ p/E{ٯ'hD3'8/Jknj.@wPzJ+;#979\zԖ Y -op= ?,!qqNJh:A0poB8͋()-+Y"6jƷO1i򔩗M5=||`0g͘ЎMMGTWU(.*,ȏdG#P0ey=naY-fQ0uZZTe=CaE =~lj:LGRD߀ӐyH"렮 'ȌIX%RyTa9-~oo[pckO [n5Wn,CHjoMAIB-P A?i=cRgk;*'sCs!oI ,=_ܯ_VwwxwB9=1м3;]>߾B75wnmlu,ƍ;&u^`iWH[6|݈qS4z[Wg? g+aJo~,BMָ6Ձ%HWPmW8E=cLA0|TYi%lF1H~IgTŒUqna"xW<ܑE枍B kg"Bȿ @ - -3-"X?/X/ W%^:j"JI źi92c9{O)y~e?`3.'{~ܔиI3:{27ktLɹiDݜԋD9<0tjKD=/P"UJ-/N]@yS"9K.ܖfMگտ6=F'G鸩36nT %ƍm!ƞusB~!eomD]p I R+!rǤ"cʌ;v)=M]y J|+Y 8UJ]":M9F`n c橝o]v@/ayl/I(&X0rRJ@MJft8M-_@P:›<֖cRRQag)wga^_^4ϧ B:|ޓ$rin ` دs~+iTsr7H +>(*nI?=ˀJ`-y#,u>ËR(VPJ67j.3h <."8lw?ǭ[}GqβQyEaـN_rQ}Q7ߤV@c1RD{kS,})nͧ5,>ega l8yru1x@*sJp7r7 &C;7 lf7Mf  /rD'e{lp {7a{"[/af /a韻E955ݟenxgyk -0r17q3ѸFǭAiΣ2wg -P@<^t3ùO U5%Ň .&}ts -mqUF6 0WX%ćtZ#Tf*q*qk*OJ(LHiE%Ѓq~!%mb Y kZ[˯by$D\̒B`R٣USq*Qա_E#qEM)fI^S~ڿlLX$0rpX&c'?玵l;>;VpNlwהT"Z>RDDqkM㊸GӫY5C nkhkd#SyWNYC.) -QLH݁i?F -0,ǥfރiT1J!LY cza#cŬ1֋fZb -aB|&ç´?|$L4Y|O{x{ҳq1}W{ޕE8VL{iT -aZJxh0}IaڀqT1"> -nGQFbLgY#eNWɬFݎCn! j#t[nLg5'+Ql])LqTiT%1=%z1qYRɇݎ6,l]#j(lhCJS/2tOJRNR 8{6kTӱϥRXԇuuuOu C;+CP۠nP\P@P73ԍr:e)BJ=ݯ;}׽׽=uu5~'C}#J)-_e%z$wVy}9W}&B{/7;_O4+M)0n1R}m8h`8ZZ*o.|&0. /*nRQLU4VDE¢4)^UJ\+@-)1ƎP-ryRY,ehPhqtܔظ"5*6_qynB"̅qsgD>,DM`&;Йڙ )vmnvtɿ7n l zcu[˷$=%v!8bռRޮq.nm9@YHj–..A0hgљP}E`d76쮯OM$2D hFb .,5swI@I?0Y` Oz`* vG8҂(]E{҅t?` B.Gӳ́(Aؿ1opji';4 תusKWeN=s.dB[ZGv~Kw'j S;ww[#ő-]nڳ/8UUffEpkb+a1"VZ7N lhX!u!.Ábo](Hw^#ݒn]q  Vٽ{1Irll S83p:fBnE+xC7Fc+)N(իa2ԭ9h2."mp3j(Co`# E<޽ I Zۉ5x&8 -WUGɰ4fd<1n/K@9́DA$[ UT{SO1-) OR 6PR.AʹfУ9qqrpN\Ar=SOj*a.Ez{Sk+ÙnG2Gk#S V|ҭp;1wWG!G~,E&@JnN(P1t -OD$㽏kM'N9g a=<~v+z7 =u=η*n|AdDEBTʮ'GȇKCݝZH+0\ m0H\xg@:=Bqӹü??Ɍɷlbhǫu}7‘F8,@6ȓF?ȿM1zry\ 8&R&'?KiRTijsoR.xk o1x ~twRN_9Rg$!MquI'l$ȫCr@4WcL\kp?WJz^W"|#C$!(pT9Ң)ό]H#Q /wxxSrKg;HWƿRg5Iz*.3,8o4 LqF? Wo)zУg7—p9>p.zk_4DJ^;tLJFsSFDڟF&"x~KRF||w(ڏay|9 8 yO--,mK{"(brTPHgxR;a;l"tMq~Nq7|2jX>J>#,*"s hѐg "153M%xb(Ňe BA> &w@rA R4([%,{NG-~2q'zrO>O#b4갫h"4 A݄8;GYw#?=:g9} Cα#+qqp -x-d[A!$zREW} %GJW>Ey -@gR5e &¨]Gz6j T]ĽHl HUSQ$}8 cd"'Ghϣ,=7Jte8Q :vE jsGƾ2Q@J^+R4S)LH#p #& k, 0Q0Ls~9Q_?>ٕa2i?.E,zWE 9Eq]9kGͲ]ZN_%D:2\>u>-&YT1G >}T+ -uCCG #I[K[˘fgG*JKlVB!X.Y*_]V4sY%`Yͳ W.kb֘_|{V#߽ĕifn4Yʨ-uzB>AֈNEAS˭ t]lwU3VWE>ڛ!Ŀ^2}dYW2U?jMnW]?+7u5W-d:ͽ+[^le42M[ ^@YdRZ!h:`ɮv=gtWBx:Βɍ>ZnT tG]oF)+ -Rh tj -8x^`lNEEBAmXFA48 O(8T/1~Jh)8voj+ݭݽ4`*ٝci g:)b{WQw54\k(FYaF pPyKRkH!s3́no1N=λiMKvJI!;o#dwr"'nKvNZ<Sò> \&uDS%e2<RVm-# N%f[,VkY.uN -jNgVzRK(I]PD0{ouCXB6:uy(!$^=A썉FKYEw$@찥$A.zJ z=*RXryd(bwͻ++#]4xa;u66q Aa4&(🩺)bUsM ˜>#fr5TfKeXY^jٍ!lE1#Wȭ&把h6鋟Zgv>ӟ~w8c5ӧu5oi_x_ -,\ҼV%tֿ,*v'Oι `qWL:2{L6po5rFj(ұexD.o2a.걠W2?F ehY5E k9_-M/EDiv%PЙn&Q  Y$Åa9A -tn"vd{lyf+A$Y dK a{Ɏu+uG]>7Szp=OoT%/]]](z{{tV_X{gmO6Ϝ:gw=jv+h~Wfw5mћ|'j@rrb~U;*9 -άjbP2CJ0ͼa`.ڊiU(f7Zr#65 -F GD+kr7 [R8]W%K&,;qn]& -~C?LS8;3mZA8ʂRJ'?Q 8ɋfg.`i(gιpDsvzrdbrwrAak㌻I !%u?J4XNsEڡju6~31'}N?zFuB o۞ -H=fуg:r)N [XnFElbMmH"!d`۾²I&QU)bJRy#?< h/ŜYNX݃/ 9# DEBz -_iF1VjH( E-ievPan#1;PoU5׍: 9ߚ l&MmE;TQ(MgEby = MV,1J#匄Ǹ V.Rӣj5mKbT)ƙMn[6#\%#N=lpZڑgH<@WȲcɳ 1chXEUNm>60XEh=ulR&esidT^d!TbEZĆF5~A} u0U^~C&cE-#\GJ$* d٘ u&{S2cV`R;LD|TiA7N4[t|fb?mA1]d A6Ȳ cFJAӎ1r{{殌k^-!y/@p(rVUiZ^nYlTtn'كpXnʳ9U`1&w iÆd $/nF1G, -=וi ݖOX}*nNɫΪ3 -KyrWm4oۓ='8t̫k=YԜQkl@f.ny}Ye -JuR B`#OCbRQoPLb0^aXfed3CPWAtru(`bm)RkzE,p}Cc]1&w¯5?i[G_QOK<+zWO}jZC@6Q%zG=LE~;'H0NLJF.\x^FȐgD70cqe9^{t qywǾ3(aeJѦkPv=&N&j 33"){ iZ1Xmƪ&;(H W 9ܨWJs#["'6_\Uy%ݵ]w$V2MWxН@5uS}PwWy7"nuNCa^53ӥ >ՠmAGJ ГW2N Rh$_@D9STJ"SjuTyS -#:xOyOK̬DZ'q\Zqg2d 1>qc&R+Yc.u 7$d#Iqm9rf8s7T92{%Zd))BwDmG=nM}4!YFD7:L`Xb7 ݨKeBU%dyShJ#Q`;7kCƦo,qoɟ( ccrd =ۖI&wqhFqc2YY,jp15<,j@QY4C p*Q*>њ0@JhS\߀_sVs..㶪v׵|Rfɔv_69$qlVQk68'u26]y qg_1Lu/qEU@D5F.䑨_Ys :">tQW1|ʓY!cg>ட^e?[v/nz+EΜOvSlL}{~tH&UAzGek>3Vcr;ޚJ0e1Ў1i Ua+:_P>AO"|/7Mrfntin m,=?] 'fc0uGofqq.na\]svsngxSDPrqHYצ'^1gvK)t=|t j.b&MqrxXfNLN9W zaaІ3('rPb$44ۇRQY萌)'VBzo97 /M"/oL>|#{߱WL" -\d@o\-8R3 D#LQ?i4K6ҕ÷}uE?^5 /dM (up֛vKA~jrٙ>̈rBr^ w%''GEz别S-AìnM -M.BnrN}:?AZDD(e?.Go r֥y S^bc]@gRE8ɴcgP@G 1?7 -);#rŜQ.u. -,Uc%Uk05_qE3Frp]36l4qU-t9a﹯3V @aJ6A=nxX7$ jƫ^UzU6kCAۊA h DF P @W^HFB=ds -Z4؈ Y[Q(jgqq#z#G7zW׹.Gq^w*)Ft菄Wb́v0H#BSeeһePUdKWa$QOM=ɑch%0?z69,q֦X[PF"5_NO؄,YwN:{G͍VrxV;1wu<0`*R*2q_F_Il?Hш'`ZHB+ߩ{ Z2Yg~V~P(w|nvARo40zQ]&l/Ȭ"#1z$j,=@JNQePTta=. vMv3Y9и)w(q{6\ōU**wGu6uL4}T.Y73m%AKVMSƊ&][aɛb%I6=;k1a+x] ]G7=>/RȖ$ܿjˁ}_nk%GE̮q#I#qk">%1\i^2=7#Ҹ+[[mOs -A߫<= ݠ4x ^z -ҁՍ#M>Bu |`,R(E$b K bi^;6\&L9ٹyٜBmVauZyy8ǒ l%1lEE>UKYheYؙޭ<-F]P`Pٚ 謿?oy .}ɍ FG"~"eّIıM}lK˧`jTmX٣k}#q;U_Z\[t]˻VWZo("S۪~۩-Vt5'Ssj5-eG򏪞z"PLjPz~ &a7&D2<CDZZm1vۀ1"'j\PDmdbBn`׊]1ZkM͊-m=Snl6KрH %#\}̵oy;>K2`ݰםbxa( W9AQi>w1 -5 -i(}ͪ\ZI-./bB}J!ն/m.J"#6kdjw_.'wjV>X\[ߓꃎ 3!$e?Q o> -^炚\&W#3phv"צY^]_p/W*##YYZ/7k 4G\D6YU$Jߐ{Y~o8R*QIpD\Π驾kʄ,b 5D 'VeA 5(ا+쀄OäABЍ]K+?>2{E7rLL3ƃ34{P%vdơV1կQTzhOf8K[ܣ)S*(%W6 s}u;|oܓ{G:Uo!ݟn yroϓmn{VbǑ7rcv Y{3vɩvb|kJ/R_AQX>c<`z*gBY)YV{JfĬʧ*zQI --v=Aj¾(u{U~]L2A\ϓ4Hv" "M3}%.5VKədt9P;w2y -Һ~~łKAk -~/Z PwFj8&jQݫ>gaBNu޲S810+.ЏwDtL}l _\D?G CЃh| 5Jm3<.Ӌ#d(r* -!B#5D sHdiblIgC/⃀^=};.4h&vL9EW#cUv\lxC _}힫ۦOXՓ.'lIiM+5Ւ`d@0l$LI:Mv [[`;ٮ12A^&tkGnZRR4v1P ZP[XXT`@SJ љ*o-b:3{#T{+^+"E?%9Z {}[Yz9N-h+]#)/*+j*JKIF̩PۑEu#_S%LaJ}9Z7|h)7ƺه<\*ugN /:(TeNrc%o\RĠ,($JB@8-ٹo)oΞIeԋ(V$`-Ǣm:5t?:MHDe[I6%]\ +3ȖJ6 ">wDD6sȵPo699LiFmĹCa`dYE(9y(2sx ehhq#c3v3Ch'7Iugث`X.t_7J9{ڼHw,֫?#- dm=Ʉq]5kՂc<^AW73;ƫ26>s~F@؉OV`4 w@6AEةݍ(cܤM `ƴf,ΦK̉)2I`"o|1,b Bݍl^!lgcr0JX  {`O@@ \r!2-'IXV[՟vzcMQkb54ф&|_tL qb"H#/~.[:"ϋ wM:syIp(ԡl!ۜmqю%֌bJVwàKL[t|a3kTz%tW(*NԮl^uk[ ?Wj*[):%HUoS3Q){chu WܓI=#YBDUYrܠ3EO*dcɨGC1%f-.X/>c r9;iݣeQcS#M>! f2VU[W}W]nH5 FdA!rF9;i!my=@׿C!UgO\sٶ+[;{D6K\y2J?_!:RHңɧYY"MO#PL;~~mqLM(8k?WSzh C:&CBzlrSĶm %wV7JbMUԈG`. -7aS$ JF%!L*I5 cJ'/qMj 7+Kw]33m Y?|,Sq6 {qG3B= 7 Sn}"lbRdo'(P݇mmo$J,Pz?B=`>hJ "Qh|rALq!6^"xe(}LN-JQ+A~;9 (B -:^1C+D%QP*R@ Ԁ 3&'W82-Rߋi4\x=y5Lrg_+/`fB̓+n7EŇ66!  hX4{.Zz58].a09C PYwiYkJ͹Дt9McxܞB L:j'Txx^/g>4 S[Q'D?@3ыpSM5) 0 86GU^BѫIpTҞJ% (!vnNI=VLQhk׃qTLSIUI=Օ0ȴMQ@Fу,`jŁCzT";VBS,hҒT*a~0ЏU>""6u"2vzAXuz9P5k+mSwsTјqׇߠW[sl,F%)Msڐõi*jʢT"jFaxC4S0-8]}jH5N+ -Kӡ###S`z4u BF, &K -"fmϭ ($Js-؅ƚ@cQ䁆!iSd fXhv = 3䘱Rӎ(&jGHed㑛qfNnG%9}ziUqQ1/lkaX>=_1$iUdu+:U="Zd"!qiVm <ծj%pS5sZs t .,M 7yvC֋_Z:Sޕo[Q<Ɔ7t;WC~m,;#`/澒?b9qBёC=djcYW֝fbmq͍o3G2CѡEuM\X\ݒb(dz\=͸ -4YǜR<3 @4 43" ų\4`,r]Œ,cgcQAMu\.S&3WCD5eultPtqSbj]*Ϲϩqxkx dC,qb"4ѭI0lGPΌ]G'3}R2=*FQ3̾Iڵ_:gk=jnn ?}7|B$`:49)NXZwY= !4ҵh%` V81i\&h`!-f/0pZYnbgeddd2 OYF^x]X 2Āc@CP0i[RrVfeR=2{s\c kkqcnlvp:EdBT J%2b*$:9 q!vIfJi~!uhGCt𥍱s?d(iK-_Ha Ve;]-ܑ2uEXw,\ %+U Qy(Űjoc{,Ό",c4@ĜKUodIz>x9oTFql?hqDL!%V=XȀRì໨DȀ9_eeN5 |~{o{1H -_ςJM 4i$Vn\=ut%36m={!F7ihۦ]Z 6<rƒno[Wk4msqۀkc/vxsv Н:(}^ -qdl,MSzDkJJJWn)[n/td1Z\6rkfrs;{_p:CMۭ6 zbjy -2e-/quu?־oGtf3Y1[V$>&ƨ;t6:2 - M)Y۶Qr6!t`09ٕ/#r/st1 8!Кk:?nʞ"3XPeb'E0@lG /qB{)( ;vÖL^5<",B1C)nZ(0i@PFI%E)j F( rȘjS\uP|KU.E"VCPӾsC!X璓i?>22&/Xfr"DȓqϪ9kW7VC$k,u^?1zbf έoG|X9y 8Wqn%*໲/Akq<|^+M?(5L(wbJNuR)3Cy, ]Q~eA"xBXv["~]+bESAdHՔR5VMzftD <|%V f1p1xRh nZN7Cs`T/Og)#T}܇pVdLKEsY6~Iu:1@qƇt7\ Ā}cdP8hH3b]O{:|}gJc,rpy޴5}}޾ie4j\4WR\ezttȩZ8K8bBQC\f~%ǵ%kɞdKcAʝ&hF=9!Yhe(꯮±W@DDx|,;&hO1$͡"N8 ҭLI Mh,Xk\7#.iJbbLBU͡Y&g -G lyuk[/5w]={8=5owZ(< .(:! ӭLSdTYlJuWY.X8y+\9ieXx51wPιFt!Im]=]^n5΀?=|ݗW#qۍ -h9 Y {׾bR/P/Y~J~/Lm%,z9Lo _C_g~CF2 $ `s&mZf :B#:eO\ ƒ  ѡx J{aMXJ)jZAy$Z<^,1"p:&@Rg P\d2X2řŸ@k1Ee뷊A;0hˁUeUs<0FehE-NV=<[4eI륍C[Y0ȗ~n$戔C-#kϟt/ŧ߁eE=YfhF\MR< "+h5 mSd4Z1*jèȢ9}&0g&X_|A,Y ATXFyTo"uRjxȿ~ aM&kʨ\HՖ%1#H cѸx>#UIQkHb~:AgP8å?g2Q JHg }Ql=)Nlj@LaUgԕHcQGyoڥÿo쉭O(O`5FHP7S7_(gR;/RsC:wb͗xLg—1Wu7H=9۟:?}^_ձMl4дMRb)]G`I3:1dJ@7k`${lmjrQpmqۆh+3 {@BMAp͞vJc :1Exy#yaaF]頨.l]eY oaMBXȲֽ͔[T4Q-DT GºhDQ14DR^IFl$}V^цC!٤Dԥ69^Sm:< 55b JIdr( GQ& +6۠d{F 8#bŬGPS|:ܐQ$GO#9z ѓH͓\6ɑ -N&%a88 eCrQ.*'< -)! A(T 4a6u"PG.uAE3P!:bn43l8;ט1앳Xݘ|>bd-j/lmM@h2\COTrB5^Z3,ok[sڏ9Pwt2yJe—-;/ߺqB* x\!Vi¬YX[YXmMͶrFE,d>uX1 '#\x<Mߠަ>01Hiiiemna~AZVF`0 kwcbc$0W]Tn@䅨/F0hB7DExBOuv!FH$Hf~@!Z(#h8෣g`/f -rE^ǚxc ew4q:o+RۊHCd=nH({#K/ߥ8FoE2NPd!u4u,u>a: 1L:DOKy7B h657Z4/&2fkZĬTR }5V 7|Q.KۗU9wm /<*JY1~\lg XA` 'X  wFН,@qv W.T\s9>ezhϺJ.Qq+cke -Rv.uRV~bzn8f~i /^jL؍RfT -Z6p ц7x}\TLlGHHDNpTL Qo-!*L6i&Z\\v:֖dnwʈ$d` :ySӉ "Oi(Ly󊇖=Ym BTQSucڼ-U8 %ⴐET]ybQc(wn`0sٺ9L#5c`@}tG; A㩱bRWP74*";ls [ ~i5]꺣kɆ\&՞ d.Y\U" dP~ @?uޤy u-ܹŵeD1 xCJUY9޾M:U -KZJ hAмPLIGϨAQ1:vuf_o(+oF5#?sGE^:r')uGH$$IWD">Fa!~4~,NU">qxY8=2gaLG50lΡ%F)xS( yL9%JX2 -͟ȟg;w̼2@2Q鉺jB-h嵄y6V 瀡Cy^0B9n@ku! kFe9)F.ɦ*Yd&q.Gȱ"rdq9ro(11쉫HFsv۟H5c̩ "V9-!o%DdNbP -RQ,~3 l9N5@$`6M -?JIc B5Ii#n3n<]]vϋ ~osn7mw9lݿʨfDouaub< ۯ̆|.01/Uog_~5S{.GxT8({   k+Dgłwe*/Ty1pi-Vwh`f!SkQƷF!]5jb\UWd*a(GnjSRn=TYvbTȵvJsǗ5M [n0At߬Vkǻ[t nM:4 GFmvvAhy" >mqsSޢ -Ecj"-D,|[9xܨzTMNB aQ zVէapàrBM@ ”6tgeY4}W1{Cf0)*XTA8^#J(A7,JR'uܷ|֟_ueka;gD[#Rpf'6%ڢ]*{_FoX/b0/~ce6iE_R)Ѩ`B&((-.SGb9 ˼@r9aw m5C'|AJ A!B aP\/ Db -U `+Z ~&-@ |7 ЭZRKtQt$Veip')v|4 F}2={AaP'ypBִH[%h J -Y*<óå(VUR퍓uzSrHPk,4V2>^.R4}u+K6IyhD -6]N1]Nq'@cTK="Pt`Jم@Jڝb/!#]ЦXQO_o3rga7#C'"Ș80HYkEp%B ) c- _2nsOzr!Fzqje5T-[ex>YSj3e,r3"/ByNroy[yo-[9 ?|FF7+7NyE$=%c0ĉ(ë'I\N*\#g & `2zkHR$ezFbt?n $9z -уpY'2u߂-jvP9_ Jphwv%G5pݩIER0`mEu Q->Z+ΌM T -G/j(c9ih;䨩~&P!ChlhOBCx#vZ@X2AI3|GGQ_iO5%3$s_(Nh]ywn❷̜Xn|ieCIww kǎtcqP5ͻ I Fhvq YP401&f9>Iۜ-vMFoSWrvvF<^]2bN*V :[!1P}9"cvP`E$?:q98­W=>Q3\}ds ΣK'wÿG>2rBSC?vlK|T~cQJgiFM+C~{w9*C6l7pD )Q&A0, zQMt[l<v,fXձc1Cb\K3,Y(hݧd}sQEU.ruQ3zrTep.{Yy4 -(UE]t@GLjzY*ogVF x̰`>j>f͞1JMxt5h9y6*%ـ^dR IXEPyꨓ`_:5;t ^iKd#ȆX.xe״%W7`k˚6xZ.}?!{X\Z -2 -j~S]7<֚9QqA}ʨ@FdCtW/^7o@ -Ɩ|.'f¨ղ|yi;%HA -+])/Elѿj ܇A-A``/acr7gTÇ)8cc)[M&9p2ꌽ> %Ϩq?Vo\9ŝֺ\66V_S]b13[^,\]/&X1Ƴ2rُ9K]X`3xoIip @`/8 ⬸8.d..cVZ8׸˭W:pmn.Kߕy} No}3qVXF`,/ VA#Itk0I ED&/9EW\qyhd MIC#U"JlC(ـ".4u4/VM#<4lf$GC2 1#E@}6w:6KS0UT jW -)][؀ڛy˛(C0wP^lP`H@7jaۦE:O.?D- 8O<ǻ\u+cW4񖕊՘U%:e>tG.C@H؂sQ!ٛ\.GW8OsA>1>,1)7Qi}0Wo6;.#_~>zdF2z\瞑Z9vuzQ += ?yAz3<#[~>ͦˊi.nWj^orV̵]Dm\ Q&iJ>Boy*_?ROsB,yͼք'=\L77GXH #uX*$isoͅB`h/4Wt6T _Csܣ49h5%bgſ<!QMӯMgLMnhMdekCfEX5ͅMcJh֣T+Vr+ "-,VA_5}9j3hTǁП1">}0~/sí3ׯHj D4J+A72υX9q.C Ӝ>`6(nČ N*h%+ bYۯ8y2S2jʰ": |T|T:,IG\Uvt/Y74Ӫ] fy5_'S -,g eO_;sf)W3-VO&T_FE!ni3dCG3'iZg&.'K>f].}h+xhftSwwjjNߐE9iKAtV++wy1 -&c"8E@jDļD{ڑHF3B{Fbj˄!.Tz&#:E0;[|ÎX 5jh"k4ٓbR))QNLNЉBC4XsM'>HwHY6VVZVuaA.8 -^hR칪H \}ur{&Y{ߺ6ؔo\}fWL-Nx/YZ'¶T}{ZbYDI0Qu%gʓC ۵hTŀvoK<+Ӓ7cu (<+7Sө6zFfzCl;0N6]D/0>ER}U -:"Yn/_}ݨQaHmzK]IH=I1 2FqZ#ct5u@ MVRa`EdW8jAM0L/ezB:ţ&3 M= -VD@=kW@Poj``{͚vYN )k & 㝮z}2oxF}̬al>lyXf18ǓBįO XԄ%0k"l#xy'Cyr~ml'+Nxh0VQT4Q C4/F z̻, }F,!TŠOUڽd^mUJ>HEf-'ߎu:P(WR|V/-VM-o~bWF\ -2VP>4z.);fcWI#ԟArO9YҌ49SEW!^l$ļ^xTNg 1djHUPO6m\8o^ɨD|CSfBk;+ֈ..vͪqE+"=Cݢk%KY:꫗m+&N)ԆDtc[:;.9s onx<%-{J`p, i{{W;w:<`2i&p!xA ]3P4{çg$+<T7YB]!hP`0FUg'1Ma1͵v,w;/xǻv ]y…W]Ŭ\]?E.\AxpfE< &۱kCl?дD"ğ)ՑuƊAҝ"wOg6ҦS&ʄu#=Uw -Q$T-n'w_J,!AR>,ЎkB=aMC/_~z:O*V'sZch. Y5ٔQiѸͦv}JQ=h,l.jj"Sق"ʦ!M\dZYsY; q*59oâFIlĶcBY oCTm^`UV^`)^+`Q)751R,O1&9lCl׍,!ˮ%ŅOIquwA'̤@]>.cM -όg'[k ʼnunB?8<}Nûֹn̹OwD&LNcBc+oۋFx=5@9pdUUeCSF74nh>|S_ۂj. -]f p! -r:㥴:Db<~ CƗ'܂; dwM+m'c~fc4wx7?Nߴr^/4]9~ -& m:V'-q?qcQ/U{aPNKDJZrtZӬ5S07uz,o$m X>yF~IwNf?q&fTl`ٴ>BR4CMܳ5u'xSF> -tƗQGۊ) 2SqnJHF}|Af qӝ/([>|א5g= S-~H~ݲv;vt@)hX15؜eXѲ]ZX>sl?iIcơ|<DxA4Ir/>W-VӵK:#0g˞!'e\.sF>ۭ8^+iZ|A06JW@8)=D[ef(9UfjK{OS T*I*IKe (b/BobRu?{ VVM%O<ݏh,ePh=)(AP7?wnUǜH&3z>3e.)P;4 !U87 {XpL&Ezq>d eՉ8_;MI?M.ϯMI}aG2tY9D*Iz1;vq7?Xeryye=S&Z=|˚jf5¡1*6~6 eʖU݊b aSX  eފ.bZLJ a'+0N rK]8]fM縺\]}.M G%ԙ$GhU@8@% HM _юB C ̊!v.Ppa:+)r^L[mXBw4{.tCvwߝr~2o{❏ӡ/ϸzzvG` vCY^-j{4{4?{ G=zv_p=c#z#D.KFrf㌴6x ڬf+E{Z4 wR* ?~ʠo -3bWfΒ#(Qɗ~ |贈T7&;`[M,6wh+M4w{47ed-OM2ٱ*hg%.}x$OCk=pOvĻu Nfud \t11kR-?7L%,DOYDӒ9njd t&B;cܢEn,}zvhcWo*o Řqw-Mk^ɭ~ۨ3,7%fhn7_o.NZNXkhq48'Z\^Omセ/Wk #Fߍ>;VDQ9HOLڳ[ ECZPlS_li6VboMж]!7'Ǥ+ݟq|4yW':e};:~=5u?=:w~~|~=7ϏϏ2>?>?>?>?o;f~~|~|~|~|~|~|~|~~|p>j2ArU-`-85 Q32 pZւMc@ OL ӤiPHjYLJ-3,P,p2e-h{܌V-$2lГƶڤZր#e]ke HkIEYvqbR~>Q_i#e]7j]-k@V)WJ+eJYRV_)+WJ+eqYOZm%)u+TP)}b-R{fR6wZր"Ej?Go}}O->Jv=2Rvv5̝"e'Q}]=ZFu2ޅO{@-1)c cZc\IcjGQ<2Soi?ZFgI9sy\?7qƵ8q\}q1@j@恕@/XGLBg%*R#~iGk+`9Ay Pyuf|3Ջ-AOЯ%ockе^}1ע77ϒ@z^ :$4fKѯwm kqξ rcoj~eJI6G=-9w_>ܵHfѕ .qOG$Զ&PB_HJu'}Я#.KɽM{GqzRU6w-E駿W9un$XFt2]',UòB|c@cZgty cWj%J[Fg ~ef^2?JO/9W{*T"_i rkQ:FKŚ4oe4w}iR@_URڵyV ׳g`SϲUz6H{6K[^ZAZ" ,Yֳnw?~?cbe z6ZR]FJZtwC뵵Ftqּ%W_!Y|)'?dڞ-Vm]Z:; \2gTT]ػQZdqC4iy/eg`ݪeҥ[/=Ҕ3ѯowƥҪ敫w/W_v2t`lՆK/CwBZyI}y[䪔ԳR|gD/m08Zkcj!_\2س*eׯ]2裗(3 Wt`AiY&ܹʞ}kg - -21ڃ`#4۟Ys9Uw7ߧFrVK-~_ʛ5|ϼc*)1Hgmր3-o?ϪՉ]{e# -ߓJiӴh&i5Y3A3Co/ ZXʟ]Csfh#쳡[KTA_fKtZ0o@pʞKK׃P-8ްkdq.C3 >C84=0XeDţCϝ9S{5o cu}`;I#$MүekWZ V_5#^ uTq 5IwZI]׳l8M%s6U8oJwrQT7.5Kqy\%ԨEc"s&/^ -;*n3+k!gz %Jzjy-H.("HAJ)"]z R fa~2k={ḟa,sNQ>J5Qz}vaXBFb}ϡqVR/tc\sDp|i::?*=Y_;dMܯCF12dY3Cfe-!noH5cB~{= -ٓaϐ골}~eсX A|NT杼 xarCay! |4ЙQH+녴BRW@8@H'fo7ioָֿEc5}qsmИ)CZq+wi~!+ߥָƿWck4fK)SZԸy!1HZw3u!_e"rD<%s%s%s%sRsrrr%r%r%r%r%rI\v\q\u\s\wP"7]"\"]"w\"w]""sa ..]"\"]"cO%%KW1|~wgz)w>n*q«YqTEL>ff-n6OHVW۝tYfNSn6KS%*ףIQ0O{G:wsޑ{GwKώķ%owwlլ|wӈ.{#7kވ{#7[ވ~Ftяވx#r-`U*bYUUjc "6ǿ f__Q_/ޗk{Y˚N/,J6Oo쐗}e5sVlqrlzyqP"+NHY(h&iPZεz:e쌗s^v.xEH.eZ,ǒDbWKK~[ӭrZ+J+B +Y:n6@*g k-)~LZ-}nhmL5[Z^^ײ f-@ZP$%[;rUU2n/}>Ѭ54/k%IQB|{==k럴ώXe ~a&IS _vzotf1Ŝ|cE1 -`9 8'$8g\\K}\c:f`&~q+~_܇<<^]ćEe%QmJTR#jFunԋ F/K*4&dJo4zޡY4ޥ{>Uѧ紃v^:@:F',]tҏ~L &2LS7%MimbMYST0jI2Mbz>' lPᜇ paR1\8rMN:܀ssn3wܟ`a -mtE\X,X -e\ -X+ce08ǂxq"N,8'C(Nũi8 Ʒ! gˊspd8b\ 9p.p? -WA.\!75ZȋpOSȏ[p m -%ݸ" -A<E0xC1< 9(kx J-ށxAXe դP)Q2%CyJ:T*P=5JFiOM)T-*ԑ:BUJ]PR_AvICi(Ԣ4Ezh$dE61BhuhM4@=zހ h:M4f@ͤЈflhLsi.4y4Zh-洄@ ZJK%-ЊVJhMm(2-m Ў6Fh/s3@i;t:5t!:0tB''3Ћ.MW -t>݇zBO` N  7~j&L6 39Lx49ak &#LH /dJR2Q110Ҕ1eUSΔLMESFxMUSƘ:5&ƙd MI Mw&ަ7L6pXXS&x& -o114Y`:q98ܜfrG,.`60Ksi r,<.a>WJpX5,$NŜʩs}xq#X͸,V -v>N s7r/+x<*Qux#10[8"\q%n9]wx dzxMqλ)bMjB- u.ԃB?z>h5b >IǾ~ǁA!ǡa2; X  ƈSsjM3uԟs4^}ZAS}"޾bh}I:G%St.5EDgd1axܢfI֒u5=M_Tk~p6y \+peƵ6܄[p]!r_[1^XYXEXUXMX]XCXSXKzLR=&kST:Ǻzdž4c#ccccSc3csc cKRUVUQUUU;i{ffGf'fgffWf7fwffOf/foff_f?f@ `P0sUå~U>Fs} F*?lOd;]yYIflkdT{====80ih/ecl ^6YfR\?O*E<"lv_ݏ%!U_rD鳣ROҥG,9<_8(I-wNe `Z/:h=/<x [ 뿽p}r~>AZ9(\lf׼̼O?x{{ -endstream endobj 436 0 obj <> endobj 437 0 obj [250 0 0 500 500 1000 833 0 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 0 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 0 333 0 0 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 0 0 394 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400 549 0 0 0 576 0 0 0 0 0 0 0 750] endobj 434 0 obj <> endobj 435 0 obj [250 0 408 500 500 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 0 480 541 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 333 760 0 400 549 300 0 333 576 0 333 0 0 310 0 0 750 0 0 0 722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 564 0 0 0 0 0 0 0 500 0 444 0 0 444 0 0 0 444 444 0 0 0 0 0 0 0 0 0 500 0 0 500 0 0 0 500 0 500] endobj 428 0 obj <> endobj 14 0 obj <> endobj 447 0 obj <> endobj 238 0 obj <> endobj 244 0 obj <> endobj 250 0 obj <> endobj 256 0 obj <> endobj 262 0 obj <> endobj 268 0 obj <> endobj 274 0 obj <> endobj 280 0 obj <> endobj 286 0 obj <> endobj 292 0 obj <> endobj 298 0 obj <> endobj 304 0 obj <> endobj 310 0 obj <> endobj 316 0 obj <> endobj 322 0 obj <> endobj 328 0 obj <> endobj 334 0 obj <> endobj 329 0 obj <> endobj 330 0 obj <> endobj 331 0 obj <> endobj 332 0 obj <> endobj 333 0 obj <> endobj 323 0 obj <> endobj 324 0 obj <> endobj 325 0 obj <> endobj 326 0 obj <> endobj 327 0 obj <> endobj 317 0 obj <> endobj 318 0 obj <> endobj 319 0 obj <> endobj 320 0 obj <> endobj 321 0 obj <> endobj 311 0 obj <> endobj 312 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> endobj 315 0 obj <> endobj 305 0 obj <> endobj 306 0 obj <> endobj 307 0 obj <> endobj 308 0 obj <> endobj 309 0 obj <> endobj 299 0 obj <> endobj 300 0 obj <> endobj 301 0 obj <> endobj 302 0 obj <> endobj 303 0 obj <> endobj 293 0 obj <> endobj 294 0 obj <> endobj 295 0 obj <> endobj 296 0 obj <> endobj 297 0 obj <> endobj 287 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <> endobj 290 0 obj <> endobj 291 0 obj <> endobj 281 0 obj <> endobj 282 0 obj <> endobj 283 0 obj <> endobj 284 0 obj <> endobj 285 0 obj <> endobj 275 0 obj <> endobj 276 0 obj <> endobj 277 0 obj <> endobj 278 0 obj <> endobj 279 0 obj <> endobj 269 0 obj <> endobj 270 0 obj <> endobj 271 0 obj <> endobj 272 0 obj <> endobj 273 0 obj <> endobj 263 0 obj <> endobj 264 0 obj <> endobj 265 0 obj <> endobj 266 0 obj <> endobj 267 0 obj <> endobj 257 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 260 0 obj <> endobj 261 0 obj <> endobj 251 0 obj <> endobj 252 0 obj <> endobj 253 0 obj <> endobj 254 0 obj <> endobj 255 0 obj <> endobj 245 0 obj <> endobj 246 0 obj <> endobj 247 0 obj <> endobj 248 0 obj <> endobj 249 0 obj <> endobj 239 0 obj <> endobj 240 0 obj <> endobj 241 0 obj <> endobj 242 0 obj <> endobj 243 0 obj <> endobj 236 0 obj <> endobj 237 0 obj <> endobj 337 0 obj <> endobj 343 0 obj <> endobj 349 0 obj <> endobj 355 0 obj <> endobj 361 0 obj <> endobj 367 0 obj <> endobj 373 0 obj <> endobj 379 0 obj <> endobj 385 0 obj <> endobj 391 0 obj <> endobj 397 0 obj <> endobj 403 0 obj <> endobj 409 0 obj <> endobj 415 0 obj <> endobj 421 0 obj <> endobj 416 0 obj <> endobj 417 0 obj <> endobj 418 0 obj <> endobj 419 0 obj <> endobj 420 0 obj <> endobj 410 0 obj <> endobj 411 0 obj <> endobj 412 0 obj <> endobj 413 0 obj <> endobj 414 0 obj <> endobj 404 0 obj <> endobj 405 0 obj <> endobj 406 0 obj <> endobj 407 0 obj <> endobj 408 0 obj <> endobj 398 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 401 0 obj <> endobj 402 0 obj <> endobj 392 0 obj <> endobj 393 0 obj <> endobj 394 0 obj <> endobj 395 0 obj <> endobj 396 0 obj <> endobj 386 0 obj <> endobj 387 0 obj <> endobj 388 0 obj <> endobj 389 0 obj <> endobj 390 0 obj <> endobj 380 0 obj <> endobj 381 0 obj <> endobj 382 0 obj <> endobj 383 0 obj <> endobj 384 0 obj <> endobj 374 0 obj <> endobj 375 0 obj <> endobj 376 0 obj <> endobj 377 0 obj <> endobj 378 0 obj <> endobj 368 0 obj <> endobj 369 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 372 0 obj <> endobj 362 0 obj <> endobj 363 0 obj <> endobj 364 0 obj <> endobj 365 0 obj <> endobj 366 0 obj <> endobj 356 0 obj <> endobj 357 0 obj <> endobj 358 0 obj <> endobj 359 0 obj <> endobj 360 0 obj <> endobj 350 0 obj <> endobj 351 0 obj <> endobj 352 0 obj <> endobj 353 0 obj <> endobj 354 0 obj <> endobj 344 0 obj <> endobj 345 0 obj <> endobj 346 0 obj <> endobj 347 0 obj <> endobj 348 0 obj <> endobj 338 0 obj <> endobj 339 0 obj <> endobj 340 0 obj <> endobj 341 0 obj <> endobj 342 0 obj <> endobj 335 0 obj <> endobj 336 0 obj <> endobj 422 0 obj <> endobj 423 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 426 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 7 0 obj <> endobj 4 0 obj <> endobj xref -0 448 -0000000000 65535 f -0000000016 00000 n -0000000258 00000 n -0000003459 00000 n -0000088536 00000 n -0000000137 00000 n -0000003543 00000 n -0000087345 00000 n -0000087181 00000 n -0000087269 00000 n -0000017223 00000 n -0000003645 00000 n -0000003694 00000 n -0000005447 00000 n -0000074619 00000 n -0000005698 00000 n -0000005746 00000 n -0000005794 00000 n -0000005842 00000 n -0000005890 00000 n -0000005938 00000 n -0000005987 00000 n -0000006036 00000 n -0000006088 00000 n -0000006137 00000 n -0000006186 00000 n -0000006236 00000 n -0000006286 00000 n -0000006336 00000 n -0000006389 00000 n -0000006439 00000 n -0000006489 00000 n -0000006539 00000 n -0000006589 00000 n -0000006639 00000 n -0000006692 00000 n -0000006742 00000 n -0000006792 00000 n -0000006842 00000 n -0000006892 00000 n -0000006942 00000 n -0000006995 00000 n -0000007045 00000 n -0000007095 00000 n -0000007145 00000 n -0000007195 00000 n -0000007245 00000 n -0000007298 00000 n -0000007348 00000 n -0000007398 00000 n -0000007448 00000 n -0000007498 00000 n -0000007548 00000 n -0000007601 00000 n -0000007651 00000 n -0000007701 00000 n -0000007751 00000 n -0000007801 00000 n -0000007851 00000 n -0000007904 00000 n -0000007954 00000 n -0000008004 00000 n -0000008054 00000 n -0000008104 00000 n -0000008154 00000 n -0000008207 00000 n -0000008257 00000 n -0000008307 00000 n -0000008357 00000 n -0000008407 00000 n -0000008457 00000 n -0000008510 00000 n -0000008560 00000 n -0000008610 00000 n -0000008660 00000 n -0000008710 00000 n -0000008760 00000 n -0000008813 00000 n -0000008863 00000 n -0000008913 00000 n -0000008963 00000 n -0000009013 00000 n -0000009063 00000 n -0000009116 00000 n -0000009166 00000 n -0000009216 00000 n -0000009266 00000 n -0000009316 00000 n -0000009366 00000 n -0000009419 00000 n -0000009469 00000 n -0000009519 00000 n -0000009569 00000 n -0000009619 00000 n -0000009669 00000 n -0000009722 00000 n -0000009772 00000 n -0000009822 00000 n -0000009872 00000 n -0000009922 00000 n -0000009972 00000 n -0000010026 00000 n -0000010077 00000 n -0000010131 00000 n -0000010186 00000 n -0000010237 00000 n -0000010288 00000 n -0000010339 00000 n -0000010390 00000 n -0000010441 00000 n -0000010492 00000 n -0000010546 00000 n -0000010597 00000 n -0000010651 00000 n -0000010707 00000 n -0000010759 00000 n -0000010811 00000 n -0000010863 00000 n -0000010915 00000 n -0000010967 00000 n -0000011019 00000 n -0000011074 00000 n -0000011126 00000 n -0000011181 00000 n -0000011238 00000 n -0000011290 00000 n -0000011342 00000 n -0000011394 00000 n -0000011446 00000 n -0000011498 00000 n -0000011550 00000 n -0000011605 00000 n -0000011656 00000 n -0000011707 00000 n -0000011758 00000 n -0000011809 00000 n -0000011861 00000 n -0000011913 00000 n -0000011968 00000 n -0000012020 00000 n -0000012072 00000 n -0000012124 00000 n -0000012176 00000 n -0000012228 00000 n -0000012283 00000 n -0000012335 00000 n -0000012387 00000 n -0000012439 00000 n -0000012491 00000 n -0000012543 00000 n -0000012598 00000 n -0000012650 00000 n -0000012702 00000 n -0000012754 00000 n -0000012806 00000 n -0000012858 00000 n -0000012913 00000 n -0000012965 00000 n -0000013017 00000 n -0000013069 00000 n -0000013121 00000 n -0000013173 00000 n -0000013228 00000 n -0000013280 00000 n -0000013332 00000 n -0000013384 00000 n -0000013436 00000 n -0000013488 00000 n -0000013543 00000 n -0000013595 00000 n -0000013647 00000 n -0000013699 00000 n -0000013751 00000 n -0000013803 00000 n -0000013858 00000 n -0000013910 00000 n -0000013962 00000 n -0000014014 00000 n -0000014066 00000 n -0000014118 00000 n -0000014173 00000 n -0000014225 00000 n -0000014277 00000 n -0000014329 00000 n -0000014381 00000 n -0000014433 00000 n -0000014488 00000 n -0000014540 00000 n -0000014592 00000 n -0000014644 00000 n -0000014696 00000 n -0000014748 00000 n -0000014803 00000 n -0000014855 00000 n -0000014907 00000 n -0000014959 00000 n -0000015011 00000 n -0000015063 00000 n -0000015118 00000 n -0000015170 00000 n -0000015222 00000 n -0000015274 00000 n -0000015326 00000 n -0000015378 00000 n -0000015433 00000 n -0000015485 00000 n -0000015537 00000 n -0000015589 00000 n -0000015641 00000 n -0000015693 00000 n -0000015748 00000 n -0000015800 00000 n -0000015852 00000 n -0000015904 00000 n -0000015956 00000 n -0000016008 00000 n -0000016063 00000 n -0000016115 00000 n -0000016170 00000 n -0000016227 00000 n -0000016279 00000 n -0000016331 00000 n -0000016383 00000 n -0000016435 00000 n -0000016487 00000 n -0000016539 00000 n -0000016594 00000 n -0000016646 00000 n -0000016701 00000 n -0000016758 00000 n -0000016810 00000 n -0000016862 00000 n -0000016914 00000 n -0000016966 00000 n -0000017018 00000 n -0000017070 00000 n -0000081162 00000 n -0000081218 00000 n -0000074930 00000 n -0000080882 00000 n -0000080938 00000 n -0000080994 00000 n -0000081050 00000 n -0000081106 00000 n -0000075003 00000 n -0000080602 00000 n -0000080658 00000 n -0000080714 00000 n -0000080770 00000 n -0000080826 00000 n -0000075100 00000 n -0000080322 00000 n -0000080378 00000 n -0000080434 00000 n -0000080490 00000 n -0000080546 00000 n -0000075197 00000 n -0000080042 00000 n -0000080098 00000 n -0000080154 00000 n -0000080210 00000 n -0000080266 00000 n -0000075294 00000 n -0000079762 00000 n -0000079818 00000 n -0000079874 00000 n -0000079930 00000 n -0000079986 00000 n -0000075391 00000 n -0000079482 00000 n -0000079538 00000 n -0000079594 00000 n -0000079650 00000 n -0000079706 00000 n -0000075488 00000 n -0000079202 00000 n -0000079258 00000 n -0000079314 00000 n -0000079370 00000 n -0000079426 00000 n -0000075585 00000 n -0000078922 00000 n -0000078978 00000 n -0000079034 00000 n -0000079090 00000 n -0000079146 00000 n -0000075682 00000 n -0000078642 00000 n -0000078698 00000 n -0000078754 00000 n -0000078810 00000 n -0000078866 00000 n -0000075779 00000 n -0000078362 00000 n -0000078418 00000 n -0000078474 00000 n -0000078530 00000 n -0000078586 00000 n -0000075876 00000 n -0000078082 00000 n -0000078138 00000 n -0000078194 00000 n -0000078250 00000 n -0000078306 00000 n -0000075973 00000 n -0000077802 00000 n -0000077858 00000 n -0000077914 00000 n -0000077970 00000 n -0000078026 00000 n -0000076070 00000 n -0000077522 00000 n -0000077578 00000 n -0000077634 00000 n -0000077690 00000 n -0000077746 00000 n -0000076167 00000 n -0000077201 00000 n -0000077258 00000 n -0000077324 00000 n -0000077390 00000 n -0000077456 00000 n -0000076265 00000 n -0000076880 00000 n -0000076937 00000 n -0000077003 00000 n -0000077069 00000 n -0000077135 00000 n -0000076363 00000 n -0000076559 00000 n -0000076616 00000 n -0000076682 00000 n -0000076748 00000 n -0000076814 00000 n -0000076461 00000 n -0000086746 00000 n -0000086803 00000 n -0000081274 00000 n -0000086461 00000 n -0000086518 00000 n -0000086575 00000 n -0000086632 00000 n -0000086689 00000 n -0000081348 00000 n -0000086176 00000 n -0000086233 00000 n -0000086290 00000 n -0000086347 00000 n -0000086404 00000 n -0000081446 00000 n -0000085891 00000 n -0000085948 00000 n -0000086005 00000 n -0000086062 00000 n -0000086119 00000 n -0000081544 00000 n -0000085606 00000 n -0000085663 00000 n -0000085720 00000 n -0000085777 00000 n -0000085834 00000 n -0000081642 00000 n -0000085321 00000 n -0000085378 00000 n -0000085435 00000 n -0000085492 00000 n -0000085549 00000 n -0000081740 00000 n -0000085036 00000 n -0000085093 00000 n -0000085150 00000 n -0000085207 00000 n -0000085264 00000 n -0000081838 00000 n -0000084751 00000 n -0000084808 00000 n -0000084865 00000 n -0000084922 00000 n -0000084979 00000 n -0000081936 00000 n -0000084466 00000 n -0000084523 00000 n -0000084580 00000 n -0000084637 00000 n -0000084694 00000 n -0000082034 00000 n -0000084181 00000 n -0000084238 00000 n -0000084295 00000 n -0000084352 00000 n -0000084409 00000 n -0000082132 00000 n -0000083896 00000 n -0000083953 00000 n -0000084010 00000 n -0000084067 00000 n -0000084124 00000 n -0000082230 00000 n -0000083611 00000 n -0000083668 00000 n -0000083725 00000 n -0000083782 00000 n -0000083839 00000 n -0000082328 00000 n -0000083326 00000 n -0000083383 00000 n -0000083440 00000 n -0000083497 00000 n -0000083554 00000 n -0000082426 00000 n -0000083041 00000 n -0000083098 00000 n -0000083155 00000 n -0000083212 00000 n -0000083269 00000 n -0000082524 00000 n -0000082720 00000 n -0000082777 00000 n -0000082843 00000 n -0000082909 00000 n -0000082975 00000 n -0000082622 00000 n -0000086860 00000 n -0000086917 00000 n -0000086983 00000 n -0000087049 00000 n -0000087115 00000 n -0000017125 00000 n -0000074439 00000 n -0000017491 00000 n -0000029148 00000 n -0000029323 00000 n -0000029503 00000 n -0000029645 00000 n -0000073517 00000 n -0000073752 00000 n -0000072764 00000 n -0000073004 00000 n -0000030556 00000 n -0000030583 00000 n -0000029827 00000 n -0000030073 00000 n -0000031050 00000 n -0000031221 00000 n -0000031291 00000 n -0000031549 00000 n -0000032029 00000 n -0000074742 00000 n -trailer -<]>> -startxref -88681 -%%EOF diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/95 Trinexapac-ethyl_RAR_08_Volume_3CA_B-6_2018-01-10_Page532.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/95 Trinexapac-ethyl_RAR_08_Volume_3CA_B-6_2018-01-10_Page532.pdf deleted file mode 100644 index 2af63c31..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/95 Trinexapac-ethyl_RAR_08_Volume_3CA_B-6_2018-01-10_Page532.pdf +++ /dev/null @@ -1,962 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/Metadata 2 0 R/Pages 3 0 R/StructTreeRoot 5 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - 2023-04-26T17:20:28+02:00 - 2023-04-26T17:20:27+02:00 - 2023-04-26T17:20:28+02:00 - Microsoft® Word 2010 - application/pdf - - - European Commission - - - - - Arvilommi Päivi - - - uuid:bf370780-e660-44ef-890b-eaec057cc4d7 - uuid:31529a0e-c67e-4ad3-9b8f-e8cbf0cc072a - Microsoft® Word 2010 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 5 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 212 0 obj <> endobj 6 0 obj <>/MediaBox[0 0 595.32 841.92]/Parent 3 0 R/Resources<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/Page>> endobj 214 0 obj <>stream -x > 2f7Hˎc+ ;XnHkxeG7n>>^ð4*WxܻOnݽO^>{zޣqūWoo>yxx{TMwġVPWc#4Txx/On/Escq}.ީ?ۋ'OU֐Q{?/.M[<[gM'F~x_p/xv8^ʋ$/ ֨ܺvZ~wmTݰMz}p.esѣ`pjڍ2Ǯ#iނ^oFEJAnʰoMOU?zVtޚ>~u \3u**ЯU];\&n*)lZ~zvs6*ʯPWri -oV*\}_S7JZ˩jbn]D\k-/C;ނ)hW2`? h]_ m%Ϙ{_AQxO?_߼8\jIXPyRl=Wն^*݀ xV{jӱ-:@K/ynhN9US9Ɯ:ި٨r76SYi&eQ??;(tiTo,It;vj9;AFQhΣjiL0|׀zeUf}xFMFй/hUU ]5 3ڠIZ7bvmkeZ|= -Ȅ?hT?߽=6 vCDH|~~ -\鮴뼿=Zw tziM@Z*nZN4L[U? s60Z+ULtֺ%oMp¯z1^LXOԀ1 |mm $8g_Hjk=_|ZWD |6WitiWG4oi^|yV֌8ػÄ bgjYm -~M&Bp 7gIZ핃eWnYɤPi|וwFbW+}eZ2n+^5 -.{OWBx~/.[wt%&CI֊+elD-F^5-!Q~x5?_#"EKlꮊ;3"55'OuOZ#%|-3!;nU!n6.\2&W_'ﭚw*ŬsV|.*5c?~Z$vFXd%Eg$)k٥h@ -SRJ·Рxp~Y2]Qv )넞sNMǭNUmoLcO]-Uñ'D+8= -SC?~P34LsrDl6D̏a[m3TkfO'5pJ|Z]?h)׿JNJԵU5U~ո>/_s=P1îiZZ ;tkyTnM1ظ06طK@:5F^mOFW >G"ןxyQ$9K,D$ռLLic-Q=sڊzK#rDK2GfIpsC>? XÀfivmy~KCg>nT.ln"N0?RHuֲl*QGC(y.@y Ld*j\yj㪹4HV]AT"BNw,J'E65W d\A!A]<Ȭ2k' ?z5mp,R@j&" y&z\ӵb6qn10;1#4¹-%l]'Y'=̠<9"ѳX#׹5XZ46 4򦹮Wl(C$F8)G{u\\57 _(:By%xVCbDz(>2%"e, ƛ"L*ޡ2GFd} n[YXHx.BpAE@(\cppg}l^́ lޖW9B  1^ /jydp$Gɜ$ZUP+ D߲ /]'BbX<X>T+$1Qư~>rfAl Q2묹=v^F f {l' 鷐\ - KOb+1i"eb~pKń6A!<%vX ^6nZ6FFջIC@uoT_>BGѸ+06P~/ 1qxya165v >hq%u%+VOIQg724$ :Fdd2`dvtpRG."9[7!DkC?(^m _=IT?.f(z8:V:wIMLF_G/iÍwSo נq ө52`Z ~sʀͮ+o ; GS}k3[tFa= 34f&RL(0t`*]@BNTjU2<7n(+7 P^S=i6V'2Wô&A[ &VñB 6Ccb e. -&,Ddk ([FcFՉml+S[;lDpˋP 0 m0H2xkJ)-{!߲U ϳ٨4ipH3kqmov-䙭bP+[ )W!mK,c5.d sqxa.6\y sXj!鐷A!c+Zu)g Ꭵ`.|cERRkDRP{)\DX.6"U^<'x4,'LZ/xaT0ٱVw6 8N^ʕ@NF`b޵TCCvKiuB2(`"j.n> ?lRzaOcxLʕ:n1YSrS/DYVbc.9ԅ>*ٗB!i@˭ժ$hȤ R9!ʶdsmrS1Q5TRhWc()`UܒKRgUO|SΆ  tAϒ ǘm;<,w՜c)m! -&2TN5'VTxG&4g*4SĻӉb*tB@b*fḵ.=O ->o84%kjͶ-ݎM^!`roؓWxYH.oS(7,Nґy*6v[kCNJఌlOb=ypF#n| -5xJHɷ6\bg ϶>Й N3j84u&9հ[@g7?26kkwQ$m3TTg]4{)5\C.qgQO (nJ0pXi뮆o/\_q -:(I=?vn`ӇmVn}?hڣ=R]J_/~eSk ֗ `baRg޺x Dݔߦ]/q -{f)oOcw8؋L>m|6NvҘlp'-%vJnvT|y*:4n49ٝTmFؽQk143٘O: hHFPOPktXj7v6+ " }^ukܥ4T|Iȶ|{cۮ-w8B ujvR۷KerKeB풗xvv.ӽߡ:m1 UT'¯ᚈ:L%S;lIBɖ -ʈ-ك8.w=KG\z+.{nL4b04&RjnՋbKw'@>߬x"ufy3J}E(EݦE$ D?صf_NAsSpiMesڜe/yaʪwA/dtJ)evE4 j@(_Ŧbͅ# 3~;7sxV/8\",R(V((>j JgT,ۙu];}Ki6oti:_ɍ.T%ñ-m -&jʏB-q ipv8(h Fԏ%W#ڳҢ@d#{7o#A@R빂PuJLAgh# QGtqއ+tWcS [qw {Lj\#[[Si8hKKD6l(=g׸|h^xjUOx"Ć'޳3W4Ap"{F}uľpLռ5 -ApBL90,a6 ns6E)@|7 ؀nǽU%qlj^r F\hKFD#K*F_Zd,Q,׷J3#ߤSh,OPkrXl1nm=ܸ9 9Xm*&ϒZBIa,cL"IDJ;Bױ[`sjM%CtM.vMnRCt.hRaa6 4t/2U":fq8+ʭ{e?''᭗&Tk튚-6oG^ R] Q#s"#E"8 ]Vuk@CiZ'J׀!d"B{ymT!ҎsnP/m j @)Z![<\?oΣI'߄ ?ob:PUjC$?O@q(4<68u㯅'v)aŎ`pa4Q+d%a;VMf\LX+⎕E2;@1(K6Nt1Н _a$^kH.'Yta+fJ1lD )8Fy[{&h$9 ka#b{ZwLCfZ5Y ٨jeC!OR=AO✿*q ]?^;|K_м3SzɊ}_nRC -gtVCg׏Td?Qtr2>(Z01EEGL>nI(: hL@.id)1UEuwyls!X/s)妞B6S3}pN2,=(|Ka/]"{KD5 *j".683 #Cι|am sMX00™_S-``Iتu/5cޭ``48V BG!ua,*o%A<0J<0S=Kd uiw#f9  c!b^P!u#f- fD(Es%"e-֟Gm%393c ;w."y g9Yrd'ғX{r Vg="zb٘c6IJ1{1IDACI'z)z(U$t2{(YГʉv8Г(a+āj1suN0Hwy^$o"JXȱ x9ت(IUyVniHˋZrYKCbRE[gl.Mlnc\mqi&ITC`ѸFKx+RG0+V,4жTzx? -endstream endobj 215 0 obj <> endobj 216 0 obj <> endobj 217 0 obj <> endobj 218 0 obj <> endobj 225 0 obj [227 0 R] endobj 226 0 obj <>stream -x}Tˎ0>F HRL)}h{ŹEC~.&6H`uzﮫ7f`6 ۚ}k#1g}(8h6cyܙ̛nk^kkힽ*7>ޜ9;$* -֘R_a1֍o|"~{f1ǾD_UD6w#kTңD$ԧ&XR+EŃ()˂S$3Z$+qqHC]1Ah LQɒR S+$фTV)KD"bCKJ}8 ˄ )N>ȩdȼ~]8_OȂ"9hq:HW-.fzP@OQOC .s2sD\AW2LG'ѤӸAk p.)- -endstream endobj 227 0 obj <> endobj 228 0 obj <> endobj 229 0 obj <> endobj 230 0 obj [0[778]3[250]6[500]8[1000 833]11[333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333]33[570]36[722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333]64[333]66[500]68[500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444]137[556 747]147[549]151[576]177[500]179[500 500]182[333]313[500]315[500]541[567]] endobj 231 0 obj <>stream -x |[e\N.'$iII6[mmzn-d.eyrPa - -\TU6DQ?O&YnKOzNtstl=Z?kote}/)1٣m{諧\Bh+}]GOx3Z{dC8W}46V8ta0}Iϼa}q}wa`ӇGGuqs7F_q FFFO>}C`mh_?yQ(oSSNx%El nݰ~5?X\ac> ]E߀ vM\ o:Oދk={KƁ_mk-F /çX56z9a>`p_Q@q囿r Mv-/6t/l}ŻW) 60xv+0Փd%-*-mAZ8╸.AN^Q{'(MvmEAfD<2@Ӟ^Wr;%I}v Rst'ܣ9 ('[ɍ}gkroz cbLaa -bԉiI:B{_> 8|&+4/Bn>a|X(r EWC9p*/rÆ ۃN}䫩VJjX2̗Mb 3ߙ|X}m?0-1= -Gh>;kż1I, ef[#]{S9G2 F. y?+7 `0 `0 `0G{`0>i/tt^((v+~YZ\Rgu@-YZwIm[ W/AtK믶+CA)눥sf w*yHnaT1 #2v`0RÉG -5KiSL{`# Lf0',2U;`j4P`G-T'U8PB-B} 46_aՅ0u46SmT`!j;,J:ZP z4&A7cu1t@'Е KhepL5XVb,>Ћz,,E=%_rAXz -~O'Q] ' C0: kP`=|upXz -TF= ֠n g:3auNNB}Ά X>NADpZp.lt,G|8E4\HlԋͰ u |2\ ^BoP/ /gӨQ.D+[PͨWԫo%[3K{T&w2,.G` Kp%67p bTo7P瓿uPo/Fu ߀Q/'oWQE.), 7C5_K>p UT ~z/܎z0 woOu'|3<B}B.ݨ 0@!/!p/#pT_~ԟNǨHQ |]X9/ASCԧQCè#ã'#Ǩ~|~ H%xw3Óɟ//PDcg+4 kT³ɟ>x/<տoPE'I-x m;{wG=x5 De={W{:{O<|O{:N|O* - `.ho5=(D`DQ4bDѬЯhk4z|qjZ2GJN7ߚC5MaaگdzG΋Y˵ `d$g   -`z^La0ЫLfu8]: -d[k/PMH 2h6HhB"fNi8+ WKve[fUb 0"9/fgn]`0 ##O=c59I|w([F(Oa4ҫ̂n+tep -Qq8&$,HFYR, -yb)XG)_Ai&+9Pr'_9/f_S]`0 ##O=c &ALM4e -^e: NGmR~96PlŬ &cSlX),6%8Ե-.LwL| -cqyad_9/f@<.0 1ۊh|e_Y$NA+;\wd-* -.[F_Y1mɚ6,ᔅoL+X uX%[X|ur`0a0Ra2?vl0ڧ0d_9m\`0 FFe$t@e,d1SX0@r`PqAwI[\-{Cpڝvi%ӮX - D N?Lk]p9tW#|>dqk^ёb֡`02,c 5`6EN,;̲YrN!*3p +aO8X-5%b' ,a..gЙM|UT5'-19 #_9/fUv`033Hl]H놣`UZUf$pYqY cp܄[G^ |-XDb+_F;\=ݭO3)ƁMFYy1`023f`؊=P 6oYd6, Q'/ePV !sY=>+}E>ay"El).)C]rl7Bx[F7܍v`0iS5Ȳ=:}A.+)vz-FN_uYc:\ `KS4!y/P(*_{"'P ?C]r-d߱ yadqk^y17mʵ `d$YƘA?;Vgi 5BaaIZhLQX3dNuKݜ9uV[WUP%ťΒR{a>4xT8 WJcО.a*h˕ઇd&^% ["vŭyG΋Y\`0 FFd0& nw;"Ss΍45" bsj̍6,n{ );Rp;VVT}ƲH6D'U"׵"LwL -[њ#Ŭs}]`0 ##O=cz+8(uux^/@-ƅ [y[o/x! -њҚRovDkjJޚ袊hi4C_.. 3d1v|t#\`0 FF^ܱjN} ~YT30m5݋oVmU[B?1zk+8eGuMywB亶!.W3݃f59v G΋Yyd]`0 ##yD/FXRp1X`l;Ʀtww/]Zm?{¥ݍز-AA$ 6zW6pcb,\i#ajhŦ{L| -82fKh<tX{O3ׅ@cc]@dr˚P@ ʄΡGt2yDU&<[yhqs0CTۇ7ߖ㴕j%Agʋ˳#jh䀶8X;ɧچz{!}] VOjX8jgT.ݽd+jLjK57a01b>L: -bJbیZL1!t6^nhQ+TI!=AUֈWDXf4 -;paz*LT\-{Rn2czhmmTa"Zjk@5Q^=s{ siޙP -p5 *› avaL ،G{B=FKLAQ9Zc"{'d?ۭI&Wlyk<$^b^Ø0Hx$mۂ݊ -Cvp^W;C͞Q-uQˣVpp!59G8 `Q8M;(2a0^QGAiPV//?(ȖLNV09ŏ>rp3ոz@!=.\ .Q];PYp[!لdj53DxtMDc:L<"5,5<4y x OZ^ŞWѦVxF`+)Wqpyl_…'8lh`!]BoyPx -a+̝5tSNkmÝ5-[iI=P>:JqB#%L!Yۂ#jc -36?ԅa^ <}a0 -ZOOS/ƑOӵy)>EBShGJ6:JKqB#%)54Onu_Wތi7&jQ[0Ik~b58QV?GbVʊSfV'!5?RKⷩv(5n?E+L<,CjQ[hj#O{hiuԸմG?Vo۰$`q`I~Z`6TyĽFn7SqSHz3$0$Zbc>zj^K[-ai'"`G0^T"Dut_tgt]DZQ"-)!Sc/>ITqg@z' & 8 =RS͹} T#H9<3q'2vZ%L*q 5ƍYj͚hE=PĬQ-}So=77@9>patLRD#:RY:҉DUmLQbр FFp7}y;N9rһI _߼׿M_hb>h9?Y?[G#k0G$#K_VoL>Ɨ5pK/\$ -zGOZNrOo 9Ǭ9??@=>)nCݢciGJz-=Xe 4$T'; -s[0?HF߯oß7eR}P_/m"ZDhEQ'jD^x%X@L!e'J>ky vkK̫'W&+{9A'k- $kCm\=m.4Nc8?0%ɈK=䣥qU^!yץWB-[u~WLJPZ;;*UYy@͗o qo0#o'QA>~oOF~cJmD zIf*h&fؾf86w77q_4˨ ) WrԨ]ݔZ0~qv#DQFj"f4!&Gb{RwI{!"t_69d}ۿ1XtcáPzLC+JlYqnКH>>qnh}GPG`|tEqPu;'^xk]1V2dFҳ>,ҽuY,RV6gmRo2el+TFKgAu~ pwr0a%$LtKtYG.E ;] -6[CmyJ?ٴ%QTܪ}$;!}4t%`76i6EAFYE Apw@qeT0\Q~(9&⨤[~_u[n{E^{ 'ibj-V?4\__ I$ -caQ} ]]ýs:wpܝ gҪUVQnˮ*?J  tC=1T8u'>T:Q% ꧀?j&]˻V]7'_6,R/,VCBzk&J=kcQ-E0]/6?䂥{D:O=OC7\ʟK g'+ }~H;c5L#c}(jEK4vp+Q…c)Io{a3 8epI -&P: N3,հ>o' G峪)h' iAxxޅIPԐ6F +iup"^k~܂I E`h6`eڄ녇~Jt<+tO?yrsr7.jHds0tn4IrX@BX%/K&&J/?%IB䐑<%Q$N2gl :c>~hMXI+.ei:حNG3g 6D( W -wk煝‡b\lGs7cQR4MLSzBzRޖz~47Zvv5k_ueO]D~Ta12Wb>{kdi-Qp9%؍? ϱbzyy2]7?|@^TۋVv0yD eiw$ip {i-teS꜆O` { (Y8vp/B8 -̯R/[Lڋ`ߑ՟3g8k) ICl1'ybxkA6XJaxd^VCZ,܆Xӣz7&|N@^D]| -`\,/)>8!GOSia#*f -gd+85Q"%?%Q$%=<]eiN` ;r+^a=iSVZ"vJJjzGH^!x_#0J6bŰ߰I+Ў~O>0d"eEb{7)}>!_Flfy>D~t"ϑWVJ\?r[' q@~7P×PJuo:E 2̍79+hh!"\@TXi})7f{|8i+EEsKO) q[ I7(?° jA8@ -`Њ|:t /cIO%cdW_RԖOSQWm1*0(p"/ٞ9 -{gC1oG!#c\_{<~-\j/3Tbb :~ j|E&tW6ݓ$j 9;V>4J∎ś6Ի]NV#Z>MfQꛂiۧMŽ KN<觋sǦuWxDŽ}2i4%tvg# j5Y2L9Zy̚S9P;(M;]ajQ -{u 7GmE|̾c^Ə Y.M$ƒa-<շfI>_UrA&wv*$դ=#Jnz/ i>mx"Z=A lj,?D;=d}Z{׽} ^mmg+=]w|^f3&MܟH[zwmnٳ*f54z}sxÇ7?v}-<&GG5_?hܰQ`ࡎ[:vvזٮ.,u`͚Y%V!)6Xjjjj:rSMUMP5XÄĀ:MF3Yt:$4hhSL4tQl;;kּ-#2!X; f41ʍaj.!)kcF֘5z~PҊbCC,uX06,~?T6ݛΦHdt_o?Y~dV~jKuMrFt. h4?54/ T !p tUt/#-_|Rpazcu^=a~ςOܜ[8gTkYKM{hp՛Ӛ.$ R~}c޻/hq7ںUsY٤ѩ#S]wr/]#8|e 7V DckV-k)A>yqw /)d=.ZVcP`7#^;aLcp4ms>efhAJAI*m*jk*>6b׋D#\#kCTT9KLZDž\͉<:G@n6}69uue +MyLH9rTlpQ7U~Xur#ÖJB#q+l 6HB`#v&jQ@SOA-I"I m6jmV7,+vIw;F}+0a~BFA5ɧم >^1TBI,'B27@0ضYh}om1{²8 mY e"~;l41.RĊ6˒"fѦFX3}sM[Eԍz;7d?y]pp/Zc(%Z:;4qv#ݿ?0VSAa _D!qmz:gt*_.{73;Ca>F..0@p`z㯲c1wžsxNzl-5>6 TʟM$(=MӄO ¦\nJG9TkNTNkflɵwkoȽ=w~˰DH>xmp˵ɋ{?}Rnv򚯉1  ~ oʌ L7H: Dl4fp":IF@hF^Ӕt(Lf:{IZxkĔȬbD8g)x+)&UK;)N6(mAte7ޘ\3p-9>;G4d8EyqJEzPNLt\WPhtjHQBd*DPXeV!iB~=$ @ܤs7Y%_эm :|l]#_^"=$Y -ýdt6TOq - - Bn)(~#Uk&ĤlߤG>iOF()n,MLp6[0 0,trapDY}Հm'Ԥmq3T](9(˭6?~uhesbXB6]ϟGV}ٸ)%nf.+R.!"^o^aoxiW<.TB~l7ef[ -ێpN. NUqr525R ՁQLcY1Cd&3!dVGL35QVHS,2˳%2y{)Rh/0QU-ʢa޹E7}pgx-]SuzT{\bOWXuoYcssNG5!k0C>itdڄX m@Ziy<1Cl?cd4Gv:L {G1ל2q4)I -e\1uU{AVuJHZFaĹ ֋3\KP(odH/J юR谙qm y_'V6)}LiFizAUE.0ż`jlX"#j^ИUuVJMRh.2]fZd lEyMjXZ\!X*DuVs)֋s偌J"6 o, -Eon#,(9 -5p3q|Go_B@tamtֆN{"'W[Cx& p'Z}GfO ݔy~/Ѩn -.tg_R͡Lqn.7^MfnF_;rC}~&=?Dɂld nNh c<.t,jL7'!Sdx3:Ϙ~ѿB'`xx'h>YHRRND)aHiVLd-QcOz ߾1XǯEQoodOWN>T"ɫw l?ꪽ*9P72b// ]ww/ 7 ~PhO]!/WE1wFDѰb,2x" 6Wt"EQBXpl2]e0+X-Ű̆alѰBZ#S{dE -Y F>\QV!6>?<9~4~"P\uW^)iBi<;#xA)PN%vQ#}(/Y_r2M&=`ž>xvW52r-U!SvDUdh!z(X9,uGl)sv~?\EB19@/QAiﳕUP8 -;IYl[Y ߨo"gm. YBEH*rFbCu+. 0rc1EZ $XscvPZg-+)ceUV!K$mO r56x+;&,?mܝxzdDheKs;DU8JZO,4X/ {KyhTQCVNR-8Y6jbDmKdRʏ(yhQMJBMa5H:6n&{mΝ;j{ БfkO{V>4pQ7#Uʥn|i,|0H좭ɓ%\WA#W_4$X/ȟ&Hs.;|jMmZD _r_X͵͵/-=fyNqC\ݳ*2G|P]rfyI`cU;bdV5n*,W8Ɔ68kbOTVC|^.VvX9}*ͱGH--%C" <su$RwPc6`uziqM -_aA\^WP(WQߟ'.BKU̓_%M(ۆ[>KM9,qmN^_F+UdݷύsnGdqʁ5 h뵽kEj/l3j@ΜIf398 >aya}A4XB9,*wZi\ \0"-I ڂ_7m?D[RmEA `H CC|9K",=@^^*+ d -2 akI9qz }Ov{q r5T67.꣡ ։,4IfЌ`pJ}*2*5,p)U <DI*LY~L,u*yuí[,m)jPW!G,'{}Ė+[r\]9frzss];qc2;eoQ;cmJ?|UAH`XE2~g/,jzR' p S*ہ"oGZ]\՗ [_cZb n(4TZҘ{Wm$o}DH9˯6UbW'̀Rl9|hp35Ą= #%V)P])$ՠ[9۩ɇWty]ƾ;rlUU _ŚX!ʯt\`FiU)]+^iwsy -X}j `΄ol), $J(uz  Ir'؏5lgsOe$vk4}4G-Pir+gww&{Ki|/JI+"'33n/)|eJahF3hFO [b,w7%}Hշ'١/ ?AnikkzFNOZ1_Kn78ejbb$^+!p_"J*4҈^iVOtst{BݜW7͟> -L]> '`O8$rD}Dl;%++>/BE{FQ0[=M18.r$0Ǔp8y$zrqrsr/>Z3^w/ l H }/V&m9i,L7~ J0"= TNEj!'t+5}CxN9,'̢#E>mjVCI:*Gݩ0۟~iHzA~bZ WbAok z|%Swꂗ&3ide:΢k^^ wMvvvvaV ]}~񂮕pY.e -b5$yIL_&wu6m),&) ITemmV{EX, +{ $/@{GH-篜0X - Hh}I,]aV~ڨFRL #b#1QR0 -aI(%n;z *X5LڦRr)j'>&> M5?| S5)\u)Zi晾+^UryeѲRJ$8kj < GYwu -\LYw'1kQH "Hr1cĨ BObK1.vCA,9o&p0 -At FfZ kXq"6E-#}c -o -ui۸l^ -L5+`9J]`Cڑ'VɚY?q㓗>oŇؾ"Apq;^noDaFZ@#}B/`<^0>a 㓿ۇǟ={k cI:ڠDّVXE_WFUjbbQC9Yu"Uu*KNYWya/TTM*q^Z-xnXX]w>;-q .>C qIh'C漰SpX]Ir$o އvv2ܻn_߅J36C.KKcS\kk1p@|7!iP+m9É쀝= fyZ"EWBK){!~i0!׊dqOaSt mWt8"DuTNQyRw*HU\'?E;>r[Z05%LudDbZ9pw=ջ_|v|`;]|ŕP]WT| -t;V^}l-: \M"|eaG~0]2ge DŽS)o5taCb7JX!lppIC!Kh{1 Q}ȻsArmTӟq[#H\o0i͠NI0B|G6%,Dr0U'oBZ )qm,ZѾ`߲&z [>d?qudwP 4|C:ǖVusܷrno :f2u{ M"6O kGvz$m IlMnfoֹqׇkck5};E1]`egN p*Qk!>Löf[+5ҽďc[2W'W_\n\׼@HfWΘKm)u_x gM6D$vO1&FF#-"(EΉ#_Ll٬Meuu-ʛ(GO"NOG"G7PkLpDbyE(I bf=lAl9*Cd%7:`)/1'Mu;.r(K~܂+b3&\A I(#zȔMt‰ZldtBR! _D0,$RCc TaCZ(_Y!]'1S>,蜮Ƹ*1쁦Z&E@x -3ZZ$,=&֤SpͶU/wIw=VV|Z:+zKB V,m]Wer5%Kд0.iy5[Zո(KZ-צ-ޚ5dy(&I3[Wj]x%gV향낢^|?WEMHOUO5|ˡG~܌h$VUzsJo~H*"p4-Z0X{k4Pu.F [2B,ʒcMx/h ,%/"3q1AG2@BˀaHe 9J CRb0)#aM9 o3d8w$8"g-4]ϕԓ%؍1Z$#[x)WJ?+*~fg~ӌ,]qkB>MWڴ&;Oks}p YԣxE -Т?,a 9lPC٣2؍,gNѦ&̱3J z8YJ"~)v{xPI NN T2C|Oʔ{!Ҧ\LƦ&iiiWĐF/Dd9X>w^1INf#V=Se!V8l$ "`e<%64TM(b5'&քOC? aJtzA -i;J{Kn:_Dk'X;<:R-'&gO ޠx(+;#QcA)~$?[C<aAX=8EW>>y6!kDyCR6[Y86 -c.Pt# -po}K-qAWXVNy' ϛV`d3E - bmAcԽD>U—mLsPo-# ҇=2*!Q> ۙ;OVT`BRB;5ֶgU5ĊUCkF}I}w?΢9Џz+y60вe --\dzKK;JJ{K[--__j) < ^v! Z,Uiv(vEa0N(O+N}W``dXKDlj5ͺ5k-{YƈY䳙@6q'DNg^vƑxt&xa20 v!b6͐_pa,%HKam,`X97y-sf-7{ pBL4JFb>QSxKR_xlGCHД,VcdwLH!5;|F23af79 ]*Յ ս;Ym:? tZA!_(\JKJuya3Y|MUQ0kt2ȯ[4#-"S=Xœ ҿ>6͖mv̅zi}}OJ!ýN@ r7 g5!FfPB0~G^2!|bMp0tV1C&FRt!CBs',mF3QʽQk>00b%Alpx9[YLt:uO>G! -y_dx8J|n=ee2EAc'Ud[ ah/G> -ogYSgw {ڴaV{vKhUOJNgY1B=a5og~2Ӕ O!A /5 c#@z.?b~)s/x1x`\%niZf+|hI(_p|Ex{ˠ/\+|O]`Jkh֘.=]zd6Rzoo~XEDI -0I*:Ɗ.YRyFYSG״`h5e`v8+7{$Kg=Ds^&N#Q™#&6$5wd gi<*EnhTӌKڥ)+ eap@V7Ҥ -Tr]8p{Ec{źKR1SVFfmnrlJlRR6#t ֺMҊ!Zkzܳ%O-YMk+ȴC+-6GWiNs[Ì#Go75]e}l?Eģ%9wYc)?|d);ľ;*zU9hQ.0Ծ,־1?&0+R ; -c9 -Cd`‡^BI'ϵ:Yhd}-^c'[}܋"Gl,Cv9hec3Sé;j%$!{oPd;eh2b|;AdO.MifwEOxuǗn8v}]6O4 洟|/#xמUfͿ7.{h˟JJ[u~C!΀8G|"ogGWL%҃b 0C2񭀩s 9c=xX8^ahajR^ţE4\UD[u=H :,dM1S 3HѰ;C 9 sS"/m{=n97To;vPKa ay8xhl7) cwn~>$K9[S׏L@S3'/?{9oy Nf,XA5E3`gh*1]fxp{XVs*_NUfɱzIK(yo-[zP7AXJ$|ڀ4}o^P| V7ޞmGȳV)D -ߢ' {ٝ,{VȲA0>B׸#::Z8b**:eU]8 Q$FQ)kf8WCS*=dOiњO -Q$QC\6^UN7^;[fl,JȻkW3Xe>:JRθ Jk/@y ԯLBu7333w8,ݟv/|Ld5t23hyg^{5?|l1Jyaؓh,FQ=cdsz!ɰ JQze3Y8!&42NQq\}@ejB}O᮱Xz@WKxe;F1F8ˀkYo ţ<3s 1WHpjhEUmEj8Q$.p#)8oxGp'n'FufG|R!~u ̉cܝ8$Qߪ$9"4,ca/_c _:i%TeU95FʸPiR墢|өq9d'p6~#[}su7f.xR&B 6i67$AUL/Lja=苌Wa -߆)|!M˘^89ʄ 㚛r`r@ˍ&r4ޥc -C[PqPC[iPCrmvJv(]H(|ֽ(GxU/ޔX?5zWYgrB*}S)5_ZܛMݍlKD -E?z ^ݙܱqVSыkf5CUdp2݁!T 7'~m;P}Ǚ* L=CJXM!{`s9QUS7<˚z_k]uWI,ajh7VC iP"eiS+4.m!I,ܧCV6[+P>ONgا+ cŊ7ʳI,Ϣ/ cecdvЅd~;jLMTc zM]-[{+{3p=XXO'|,r^%Q D̄=:30FQnJ̈ Vdžcce -C_ 8v됹^(*@m/ɷx1qM1CPzmhrٿta\vܝk+E{ l< @^zQU-J,p(>_SF*t5{9Pގa&O gԝi=ԳsZf7clOFy?Exg4*4 eM9/+-(e #Y .$&_~5l:;Z̸P2BsH% [uˮ`<$BK·xQȪ(J*_$!VOK^>sܪD\z @Odk%I63"Rˏ'|D<("E,˂Ā<|tX aWVd!xx0vX=F_!|ly \ܬ*:h)rMboF_/7;U4j+n]AeH&Ԛz K:~嗽]d4i8Pf2if*1C& Z{C23<ϸ!RyKIy4à -|]0w#6e "%]w[QCplsQv -{J6a\8$/uh);MN%|s=FO -}ZQ] r?Ȑ@d%;8?Q#e?\"Qeq|tI!{U9U+iU΍>3A*τF2KŞ.&Zڤ.N3M90 İw։{l's$@AhdGțʈlSr Tzf2JJdCkY'C޽㽔^72w`<{4CaT: wkStf˳|uO h3Z(+V%d*]cO`="+jTqƒ AN:Ieg*G$S;aEi*TW VeuxM/;9r1cCz1%pG:*CH):Ps<6M}:swzRtcw)UiK ?AeöE+nH ?K98;cXH-BxĉZ)¿IXPOl\2{ɲ˷no|} wӜTp]͠YTm2Ԁ<Ằ`p9c`v8/ - qw:P%@Cdaȷ_F -1;6x?F -JׂS|aʜԳ+iD'R(%LrYKS6{l ?:BN켺p_a? ZB>)98Y 졬p' ۔mfd :gbv1k:&:TǕ $CYCPv(b&({״a -_~֫#(Goӹ֎$938r5H=)@#k̳k9ѐ!!c5+?6ܖŌRw1f^>F,*TZ*Y8XQWmU%`A5Av`i6R9Cƚq2_Y}|kռjZ=Cf534!O'Űl.S s +9Zʁxf_a3U>WWP)IڔT]#n 'nTs -(IVL?W9(?3?=CS) NU- U'Q:e?yle)zgָcz8!Sԯָq -t:_ϼq" $~s! -B a9ćm,whVI"_NY^bsC^n=e"Cp8b8UVLVXPvT&*$^&+rT)p =r9")+!d#߳fɜLhT5J$Ӝe2wSP<\9I*ծaz=.쭌W8][w{c ^bڝS1YbbTwNO:qgLr -L<ڿ`37sMG|tណ3 guzԕQ~w_yy d']d/n|93[Oԕp gYw[dySe؍2Ac2m#}H7[iB2/sy)@MQi\H$رH<,4m:X$@tʙ{z;f[]D4H;u4+[oW=o _NG'P -v@҃x:scB>eE>1bP|%J=#3ޞ3|[*Ut@s?i8v{>n%x@h ;g ^еrroD:C< ق]ےކJ}i,E)KͤkssyFH sm@W=: $z jɥf6|ӔJC")2-HD@ q$h5xƑ K|aP`S,ET @;\|١EZ6{Xr)>]z]Ҭ~sܘO/~v5ɿzE-`p˖͕uu{2 =Wrmmm,7KD~8>6QI+nM;/Q1xh lG4I7Eo~"b:pfZjxxJ'%Ca (qPX G$*Y:pYK:s> ,d '_8SK\;|,OU'4C=PPI'c3X['OdELp$Me޷vLHbM$QhvE.r]n"L$u 1HcV A -;iu 0c@y! gHx.i*TKS-N:D5oV-Q#a -duJjJf Qby-k !?TyNx)oDY44W 9;%_ \F$u PrOӖ/t(u\ ,Jݸug/؜715ԁ4IoC2&#LJNGO8朶 _UKx3$a%aIEZΡ}b'&Dէ(O!gV - -H2#˝P YZ-Ŏkq*Qg& J]@MΑ Ӷe2faz"yET #EAw'x5Q jXCšsseZ%ºiu嶕,|@~T;ϋYŸ}6(W ]Piö9dgȟCdFc'>؉Ke,rR够pLd J6IjY Xmis%N?&?OBN.$exۀˆC.'SH]F<_4]k72]HT/(~'rOChnCRj߰=JDpNE979O8p:)gT#aNYZCi KZ5Gօftֈ0Ǟ XJ֝J D 3s -! P*cѿCt! XR)57wJL>A|֑V-.;Ėv(?<|a-[ڸ\G^H(8Ds rz덓OއE̘K<$8E -OHs]@%xE9+_Kn~:xGZk8#lZ j˺oGk;FK@KHGKxeOG@g@IDZj[WvX:V䴬jZPV~ihkxa]y]tvtQ~ Юe5vWg6~XEV N!@[7Z"*/m?Su7x< _EG2i\MG.[V8H[0qrs>'reA<}ڽ(3? Ǐ~: я:tzPHL*C?#@FCJ&LIc-rÃ'W*+Ѿ6h˫sFB aZ&m(\nԆ -axm-ˈKK?< /χ@fssrTT' T'"MaM.^? %( g,9(M -v&boe$hi{oZ;4ޚ[6bft4>w[p8p-K>d:nb!<9Emnwy;ÑfTyJFD1?ӻy%&j{y9Os<+es);7!I͡9}7&mlY5XR(yy I@v{{YEO?pYCx% 8>W >Xsg;k϶Ezp pi=qAzzu,?7fe^e tm5Pkl|T?"g?b zLStL*@K:BR& !%P; ӓ&cZE񺗲mSKv ZF6ϔmť_Z[ڦPR};K___k,8.i-&);*@6gKwقX&kk(ݷ\7K+^y/:^n -ebulk%[w@6bK -uAwmg?Q>G㒜\SM(+qyN&rI] [o}OF}Y3ͥ%6]Ќjkh"JOBVIBڮDL{H#ëR JKJi<`*XhMyb˴KMJuV$}IW潕L˨'Xnw;Gѫc@d@f^oo݂k.9Cfl5m.w殼 -#GQ5~dᩂCN _E'#èe͋Y %5 ZlxcM6BiCnѢ -:)+ -(bE1X'0UnNQ?kyd<hڹ {g^|V)˥=BDir:;tΊ,80sρ.]{ vܫ"hy4~eiJeݳJLg-9 dbXv]9f<^{wT*TWW(TU{*NF9Hݑv=;ȍQҎt޼#]?wHGzDPf;w(xjX'-x.Uq[qUZ%\V;;<kcb%BJ$bhUIhV~8 <2.#Y1F?%"MM?5\UMۧ8 U";%]pWvO[E -S>9J?*-00D T*h&KO9@JĞ9CQNŶbMV]3z=E] {pOcxSQnoSvzo]6@<Ɂm} XT׹k~~D2""( U$H" $cդ&5c󤩥wwַo׸IL;\9ZSKoO ⤄͈IKs&m.Ѿ$₰0f Aұ_m~V'~Vd/O$F2] -a(S3HHӔH?A,> M?@>)tM={tD_L_tV>;[(\CёKmQ%MR4)jFGGc~Ky[ʒ3 -fŘ5?1.M]85&;K.;rܷ 35=f~K$=5(aYl@t+=BxFt)ʯ@laƎR񯃏3)pDcį Ûŵ Y"9rԼ#c,M'WdtoV,lOo\ܸ^tLċ4rOR6+l4vH!earr"{lWn|zu6ƕOy@;Wv5:ќ@Hi73U Pa3T-%3p>t/,%[(3Çz ftow&ؓOLzF+'} `㈨l/Bv|D`MՇIWoQ_[ 'k,WG?"!IDžcw~8>-PPfÇ+V_L2Y<쬩mh}tF~+k_QqXn(6æ)q5ԔTd{8XP}$%hG7j FsHaO KHOX6G 0^O%jA.%h -P0cjB„#& 6EK5P S<61;:]޵[Xo]Oҳe-Wwu#yq~`@b٬It Qa6RȬLƺthfzH|lu#H1J13fK>䄅%%lfyon۱K|*V֘f)4-I&h$JgP֤~x:֥|6/1|:~_ֹ1To#s ^dfw4kh&B ?Ԇ%/0 Ok4}!kcCj -#'M, M+9,tه.NbL?bfsC5/$"NeebGb`R3uBx}/] -Y]3&-N](mdIUAIsf1#3rl@DDՆZ}^>\/ׯ hx)b 3+B4!D\ ;iz2.bq)#'6E/-LU>r̽co3WE»^O&N<=~9I}L.I71nδ2gg-Ι:-'svqy3B35+`5-[UdPKE/͙79/OSw{ݽ^wu{ݽ^wUrw_$%niK˙%C8\ -(g,wi> ܁k|.* -)<0# CNa"IZ:!̥0| -,*EHBIRGa>{Pr34|4c(L0JQb -K(,EėP -VQ4eaI.9Gd.a"dBXD9%>J.Ks!<=# '>6Ƀd&b S -K"KWRX 4"$3,O2|a$CK"n9JK*zZYB=_B,E~ P~ d -^NSEVSl<[ -! GXEx5jкa=@~b&ΰLfJ ΙAPTeT\Rz!9`ʵ,)x[Vʵ,5`/@ -Wp -Wp -Wp -Wp -WpU.tdkYAI蛡J!x(MGUeV&Sr!G)?BpH尡aHY?G"?2Фr-6\"%Rv|"wch=*cS*Ocx]@n}TOrT9AioO/^~KY&<` -+gրx>1+ 3SνHMT" wfZ/BJԗR Pa=J~YN*eC^$qWܩdjeĽvւ<kwsɼ; -CeƳ2 v Mlp_MƓv3q 7Mjq>JުY+":! -Kh!/F=!9.NdY!59T^|3+% -K[gnx_ƜH^ -9NK12uIL#&vҽ we\bl9Օ1'R)EwNvG++HbYZ*iQvuTֆqG@X^mIBh/||6Ƽ cl&\>eE7Ұqn'ߑ+|+گ~6(]Ih&^Su_jM DNz1乊Q%̜1%\ni0ϷYm`nM6kyvkyQJ0/jp4w4ԧ758e E:a3u mu-f[̻YF>݁RiS7h9lrp~f&UD=`dQq~Pc"(jl4ش<ټX6Ч&͚jhZ!ͥu V<%7+sinslN6ܩs mMPo^%qv[sln;-M+,~u7YW:QUV4PgG&XRh>llfmuR mEaYҷ:78vh{5CfPЊ& ::F: fkCS):qQjI;>DJbSi9XJSi6iYsD5}#JqށNv -5 -϶ap@P -(CkoVb ZObW h,~i]EHhbX,cQLx;walܩ@&܇Of2"|q/*j5\_CldjNYGU uN#ޡ72cE[ųs>>Ę^E3v"ͣ;v\\.Mu>FVg tS+u}Wi9ע /]}W]_jD9JK~3!\7HByPpTp~ {+\Vյ H:u=v`z7nj[VepH>ux|k)‡d $p–(כ - \g@1% > ua|4~/R<8ʘػ>AJv(Vvp,dM2#!+ona |O7{saW尙p cWP1Im n՟ -||_wе8 \A/7Vb(s`eכ -\Q)pFɗ~uVy@ -&{Jуb=8qthկUFA' Af ٛ!{3dl& ')$fFu>$<!#~Gͣf3jEQu~6݌e?$)G!( j% H&2-ĝq@20GG/~/ E ϋAlF:5-~wۖtXc;~[˞`}VN||/F<q)e9 ^ -#o܂q+ʶV_3<3$^ːvBڿ5QnAУPHX'OYWj XX !m,A; ʋQ4<)ШW||9x/7"^ Xp=jw"к$u>Vױ,l9UjW G Z>[D;J#Z{L_4?{PRh,l7h#gP|[hׂXPr6:;QSG|J]F (G9O\,v;џH|wy}h:y-jDcF1<9$LxH9XeFq$ upl>“"t?sH(*\)-@KׇׇմiZE.` -c'yb4 ,8|P㛁ތ㵐^r`#V|ZލC*ѻJnzV@;o TX)o%b ȢZ?eooo\mL>@[`yXfb/s|{a~c׆Q> Br4e欥~!~`) #t#J~<sHuE*;{!CVKROo3vY #߅9Bb5+U#|ՂYxIX:7+u=B͝VZoTZX+bc9$ "?bU Pgy*+j;hihC-+͖}NhP2s/7A힃"5'ԕe9&K'|"'SķX:.-- Sq4\,aq7kl `Ua<]د0߱#,B$MfR΢,)HIXs*`Je1\uxxK<{(6s3K<$y -Oa|Ħ42y6*%X"^̾K0 _fż -^*>l o䍬[`x3JC|#Ȗc`R 13U_aƚ)iyx#jNi%- -Z!yrE߾|I%WS?ϫ}}cUX+eNA*GP}+ =^No3*? =P_ e_|B@'nߩWԶѼBw9OGx!{[Xz ocr[&oqw2 .G;u,(]np驀zQ=Q~ggɞb{u&c,RXOu^4bXlsycG{N=SaGg™y[hy_h97S,+|I?sɻƹs{YIFp22b<+9gK}5^uvUyj VON,%#8bgsОΧWGr!;lvp>+YǼ>ϋ|A/9< N]OPyXUP\ h$++z^r\^:xsuEӫ γgV /r^B_u0̔byC(+}E 14mBۀ%F~Pa ~ X4!!ĦEQTk\چ㺌1p\CXðxap<x< }_Qbk23{{}Qt[3MQ냛>(w&:]ƊYfw&5%΅j}C:Lm+|Lost4e[gWMª1Uy:N][?ڙV=֚oWk[]cW7n ,!NyA[z=Gy -4I}u̽) 0RGiNdg<~`GfX)E{C>!UG- u/boWZ\;0SRĠY +I2mA$ ޶#FgY[))sm΃mz硶jVsjS͛P67;4nw7Ͷ{m_<6<ٶQtoymoshG'_lw{6k<[ΫN7:<;N >hӁq-nGw=UcΙ6x;W0?|i{q:= ͼᠧw\˚5x1PKwKr{+^WB;۵.tmi9}ҕ]i9ޡr#Kr#rcSnqnرec?G:E~-L\-mY]ZzlJ+V\0e w!2>Ur#e#ecGei 㢝]IWtt'Jh[qzt6?qmnVo,Ksmi_sezEWWt]zoRM v{7\%ތk7+0ysw]U x fz`Wp;ḋ^"ץAA wK *h՘yTu^] w0%`K" <S45ʏ${x2! |ͦoo=R~0CR_+nI=V+05|o^t?5̻Nx}=-<3n+&aZg[t/Qw%{!x Z#lxο ga8 NxvO0nyByKq^xp!߰ yo -ގ*9 ގ؝/vjGcÝDhu }h858u]:85!qt+ۊw;V^REgUiw nK;.jC~q뎻cԿ4nn8(_q%b]s4|kmHs绋4q\1k1.kwEANkNMגqvV:c}};Q|:Xۊ"}Ǻ>5HDOs/;OyG)ܗ}ݩ_bw/{{ܗڭ߆1oxmJcX$l3 =XƩie4^_zƼce17AO{~>=LgX*Kaլ`Pzػ4l?; P.fg?e=6~ždfY3{̞6|[sGw?p3wz7ٿU?bOU#sO8jN[nqdjdz7Շ#W?l__r>F}T?ꍨv]#מ_P{'O/iA_ow&ΘWxLbk|0n?GbCxbm\J\ -I-T[qoaإ96na)!Svz,J}MjzQp -rQpB8-.,[拌~ɖgY|>x=gd[׭He]N)=kwR%r߭aɺc;_wL~/}؏S){=]1uSk>869=vmPgL^cy愍_}H["W䅧:u [-ݾ|JZrk% -:PaM%ۺHӋQ Ze?TZo*<_Yf?B6fBc2[-~ߖl#m}ɦd䋲OBj˫T -*cmDlŕɈՕuW484M -# H!~*#^Gzs|Ln$~Ew$sjPy##M(<}*<%FGweGQňC( !YaqHGV"=Ok[Ye^@V[VWe }S,SoÕvsez*㕵C3eчUH`#ݶòlyخV84>&+ϐNWmw+/dT*e{P9l{Tyr̶\yTNWWޭHHH|PQ(T4ܿvBP -+M'RI咿WOއ0+ -RZ̷b-?A%r_9#|džGRl֤W^)4>/n'ʖ0-eQ^U0rc"Z(KF:>)G5w\mG?{gފ3wŬiyYQX:;7KX |P Mҳbq$4_=qj%U^{5'b 3o܌?GQw3eF[4=?\ȯoHD ->"os>wӃ]X .ue&vug]sZܵgz>VO֧[:}@ޢ/՗ZA!K=3sA~LC?>0#H'ㄘ' -dؽf]E]tgdp';`wUOWAKXxuٖ;SwܺS3,ޝev<ӵWzvVc }࿿dp/E,aX$rϴScY1+LH`%^>>gcRy>n?as\<{˳:aİ` 5z]4|n]aapE7]o%1\7L w7L@9Cݬϰ%uy'%c6j8_0*nJ7e5&&D0&ۘjdca@(I vnt h7+-B1c-ʕ{!2ƃ@+zEB! 㖡171=oz`|7 meXҤ1śL)#̡)͔Qx)L‹ÅW -oN  - -n-Qc٢ꍱQ)JBᲅh,u yÖ4jپcnv||z||VO`cH3_2Mw`zMG[ V>c7j>b)͋ ~ҶB+T&&AW^]+3.,(o,K%e` CBObzzSa6zP -SmB4 yژg:׫T%SLM˦m"Ήt4niDmg5CBZۦӊYeTs87&-;Ls/20fnsyn5DsWi7\X8$3wa.AcdXs ͆K>Dw -r,FcN7kLh[YKf02oqX-`oKd6̙z-n"p別|g9e!l;c9o\/9K1weru")3oX[n^TkgolqIfvggo+`Vy/޶o;qۉߪhtv-[z׼9@gK e8WXtfv*C\iDu\c8#k#b~S<ݓT09a2oKuE6Sz%%\PͰzḰsή)tSa%"&S7T_qJ^4_R]͈ɱ(tvFӤ:6eBg\SnuLE>;4{O_ν&׃bxff,[Րff\|@xM"H*~i˱nv:$>b``[J ^>S)In?0˟̜55u5k,FdtݬYg-M_z*a3nVw|;&w yކ|zo.zcO%rfیe3IVyJT -"?8k*H2Q&a޳/"E}7C|G$};GoHylx|FoBȠrdһ8ޢpl&cg@2S2[V xs+}3Og?MƓ?O?soY*?YY̾ѓ4*3zH2`~7BUb fJ6&=3.ivo0gFEs,1|`ʣI璆&% $ir4#G_?a<"4M$iih4ѠXL߀~ ⺹qzvmaLyn̬IlU5P3g0TTXF<@innUkd OYY%iig@?iO$x(-k聧ϫnV=4wNy I 4V&F6vW}O{5jδohb~ji?dqZ>q'4N8Dcj=v"!n<eb -~Jy&Nn,(%m,pC*0z7q2QXS7&$.cuΧm0yR -b-&N'nt@qciIb.CeI71ut,8N."Xz#u2qu H^N-_OMz]b4}LVh+Uk6xfTI1{-c%ۧ>{8`)`E-;}@|[q݊zc6Th_yG?J[5<]E&O"OגGǀ;YI10C$75~ttk x4WXC4{Xכc%{_'}U)[YoXһQ{k|%#P$F8ē!gu^bH~q6C7'$k(y5d/3ֳG :~2Kh^Wi*.{1N9!n .Rl"9~3pW5k%;W3X{*< ~M5s}k\E3n*N1n¼p]%,kS2ު1B{ -O j%Z`!~Em~4(XH?g^io = 91s~WT7x3)1Ec)c8;x%>|O^'OWY!pg /˅5t 6sx.8r+y*.j<=C-%Ş!قby3'@~(vsyI"xTLh럙^?SZR>XQcEۏ2?V%8- Q'GZF'"4aߜ)q.5rU].U6MI톼WB7*GS~TCy2A\5@ PM*I PҪe(DЧa籗M4Bn,N$DJyI%=)FF#@!|CdRdݑ^H? R(<OPW<J WU,*5J" #헽z~E‰%*udZ<\1bOBKHLklĬ t**UPҪFL̪c!X戀%#Y iU5ND +x%ε)T'kjIElVCt8UxK~HSSs0:oh pq*ӆxZu TsOJG7cR:p׈Cx,QD JgK~c&J2ILJf&4"T/!'/&:G5Tv|4RDkI-#v U !ZB NSNaOI2M{:C-RF~YH#xSDGn =Gm$:GOR% eKQs%qI#Q/y"R"Q^'8bY=yFyO$! -W ;$su؊PW!$a@[fE>Z29@F]Qp=ؖQEu:!$ռ&dD]d1qlm[IZ2ldu+R,勰"zF1NbGp(YQe )׊l"ʯHUO 2d;D|shĘ&:@-+hV3x@ѩ(֩"~tUQDSU*ET1| 8qHQNYyBYhgE4ddLV]"]#{.s :x -!ցR1g_М3#gNR5T@ ڙD2V /g#ZCu)}5apw>ûFkX'VUшZդ=H#wU'U,RU>$"VA{EyrpEaE$Jia%e(r1# * A"" *v}g|}=7TWWWWwUw2sc!HhS|?)>1;m>W%Tr{.*lLf#p|L He1wg!B|ozZThCշ- MVL 9R1 Y^{"ZN23zk_`K1I~HAxσ<=)]tA3 -]Q8Z‚nz(oZ=Xϋ6UioXo 13, -tA3W$͋B {ݽpZR_yۺѹkdwև̣S1]cS-A'=b z̐󮬳+9 -f;YUUsGyڮ5n/;%;wڸ'#y,3a7^Gǩ -R,A{Qe[) -P5+2QCz~9srsרus=vF -C?Т -ʁel//S\2!֣-_Ydgh#vwSZ/DXSvDpk:`;nSS}!ɪW,gy--\ NE p؟ەFV@^f?o۫n\z]H{fՁwG-ɥJZizkYq8giN -4+=q"pp Ϲc,|NXޗ B$iנ=ڼp^͡bS3z-d_7 MuVdbi&k岰.zX$ik*k4.i_ ߁ m<%SevRgP4xw%tF%hQ6فxWC5Ja24m7Y*}YJEYh- Ojx$#ݪXFН7N=zĚnɞͅU^xVķTd>`Ɏs @isdxDs$r?%8^NV4 a\\pzn*u[B81"b8x{>x ߏ<ϟiʆJ+Xν),ć"{Mp=Ne4Ow$ m+"0ҿa1 W _Y!v~/+Cx'v]I t|E8A-N<9*Dzp|_ cxOD3AR:!DDi1íDӢa)tcJFR04w"|Z *4|nk -fdorvsX -ʿ^p^Nakg9qv3B䋂+,& ߩ\$VC_ v( s tf[ uĆF_c\'h< c˅^__  -eǠYwGcjs5.`WN] sh9Z |o; -8%U#؇lJK˼!3eY\)IM9!wH>^DPc3' -h8bytN΁^8d) eBmhkOc4*L.tj}t9#4 U:\V.p,m O@l΂YH.Fg8"xץk~Wp+XXbzISz` - d qZQۂ|^>>k%{@$5@z$>$5̂SHsuXT2y+wLA/Oo"Qp4w1m C,0s9LM`::kRwh4S 8I=P&l LBilӖɅO4.$F= ->C3zAg*pA0%г A mY0 %opz v~ -nˢKLpL#fb?$53>a{>y쑚_*p47!CÔnөU9У 1p z:L mMBi=XӖɅ}t9#4 U:U.p,m O@l΂YH.Fg8"xץk~W,ڰ$6F6ȸ'1Qۂ^>s6 kI f|;CW\Z۝*v؉]`7XIٙG5-=zvn>dA'gOϞ0=a>{| 'gO(tpu=-A (l>^@%\2X˞e/HD=TJZJNCX -G o']򺋆B4,%}{fJd>(*# 'Щۑه,ڲ;pg$cQiH[MV]]Vؠ3[i$/Xegmmbg,'QLGx)\* i" +.noo#pJwshݗ́pr4̺vn_4QfW}ϥD_Wp0m-I4DO%k7{Ar/ #Ci<#Now0n^ޗ*ͷݺp|A+{gD67v;d . ǹ!G`{QzTpgzA}{c)| Ec(=уLIYO8lAqiQ -m_QnsRi!;K+IA?E0 -adG<+g^kOKU#x 8LfQ<=.DfSBV]׍ف.nA+zORzvtgC"9>s,q4SpʓWr;Hlcu.8ZykUK|+JpFėiI\0^?;fe}|, 8LZs8}SrF%4B[S+WE=b3N~u+GRNN-=&>Ԇ2?:B?@/ öt4pJEi7ЕH_FB%%4ѥ I}z2zS| wR:vdcv\+XZǶp5] I|PTwZG#*Q-;STp* =OlC2l<ƛ DR/BwыpM)ŔDOQ8G(S2i*xP}#=J >h S p%C簤4f (Rw=o#ԊF "wGv(^`8r.`H̀fY!>Q#[*rF_ҢȨ;>ƸUa~}\=KxRϛxFc -^!'W@=CYaΌb_pu;-^ocmh&@@}Q6zwܶ2ٓp`3wk7O]'beM4X kĄaUOPrM#+M*(R%ULP~ -TU\To)Q ʑ/E|Eo^B{QQEU!CnpМj11ٓVcsԧ>+8H};$GO6lh:^`~'}0_ -I`/X/C= b2Us:^r$u7櫗/ת*{^er{WQA;9C^b6 EK^Q%WcU_fe2m U7__U3dF9LRUSVuT=j&;TYiP-R+AmW}:NswI bk-{\"^_:s]{+bkeVz3cq]uyl+mVzYzvp}=\>"^eq}=1eO.Y@+bYGw)G/<'3"|aY2/"UCGG9y#Gȱ#yGG9y#⑓G<y#"\@/=r:ș#g#y#?sG~f3"\<+3R"/#ĝ#q7H\G^葸 =CcG##[.G}w~R09z$z$ -=/z$^D</z$^,Hxx#G#ҡGW gLlx3+eSCGb䗫/"TrU*_mJxjjGGy$=HMo KUV^mw6/-L^6Ys|w`ulT;VcG寑lY:$T 2Q?QgjC$K&qr/C^\9hMu臕rǯWzjiktC=U?zճl=W X/ -Rkޮ?>}@7V)}Z?ꦖiaZ6\g7L7hn13Œ6cDsg7i70O9)yVkuYm2kzl5;.1_9iN朹h~q?~_ʿگk~=o7[mv ?1eeʪ5ArP8(Aՠz -2̠qj }B]ߩ{?>j*΁ꪦT-4WMKR1MkU״5mU2YioګkLA7MGiazͪo& 7U33ʞ]1fja& l&VNsjm56fښfjg4,3LSךfjof:yLu0&W]ofYy<:fl暹|mGu5<7 fYf!_Q="H2KR[UfѬ1kT_;wשFQb-av[͇C|b>Qg356 ;PAsP 1G5<5|kU{5œ1gHYe e~3Ѧ_Z)j_/bj_/&WW~Y˫j_ůn/;~uw?OWwZ._Ggug~c5o7U-jomՃ~?zTP?z$͔7ՌRRvU&0jf$ܠPPH= YAGP6(ՓA\\ՂjjnP# -j5Aݠz&WFA#ϠYLZԳAZ\\ : [M= zՋ--`@0@ WjdE`zF7juc "JMzީwOJ!SC35LMb&sdlsofn1/Wܼi15n>0=017O漹d.~a}tK~7ԕDہă ( AZP%\4 -Ac5 n˱d6Efsi.9MlYx儡8+8?ϋjoJل-O*Zֿ;rrޕp\ u"A}'.I<|-u{V_Fz9'R{- Wۘ1:?)}Zi -91wrK-k8R2|Sv1O;3x {ftϨN M VҒI_F(Jjk'TGٟek©fLdLKjqtLҕ*cc:u;fޞ_ݳ^b#^"AGf1izE3 - 3V"cƎZBFpK=d؉cOJk7v¸Mʶ5*eTr]̿{e6vInvC6(TAF̨(^go_PFtGjW?+i=n iY=Mgצ g6ݾQz3[îθ*Q٣&L2,cSvS"ݩ}^^nX>՝N:߽_+1'oygኋ-&ũ~t[>zf_i[tߴ''~ۉcߍi~kpKۥw֝m_P27v܉Gg}3oף:MoqlUo6;z> e4Ⱦfwf7JdgIw aP1ٲMEH'IQ 3[=>~9y~_x;}iRs݁^40˅k*IX  US6n`he> \FRh]nŴ k ɶ51oIcԨ }T$wAsعD*F>Ait -|V:=g︓C|´\oHŝI$g `A@^`0=> h/ 8MϾ}Ei.i~X4,([yU:q佀B 0񠺉l7 ab0-ܾ9J /OCS,ڙ%*1 M3{N:d|*0z?jJb>2e -[ظr?78E3b#X!DWLxpy [Y˙r-.潌-tꆕ f%6胙՘ԯhV-hQ %GpȀ>l\]7nVHaY$3@f;cTiABMm,/gw)r!Y,ZV<-B/_@{s?i0}׎H h#in:ɬk=~z.:S'L4/]A,ۼYh>ٶ-!8m;&@AS$%z,l Ooey7Dґ7cg;FSt@z0;Dl}Mfo+$HLO<2b#-dahG)?qN$bo6 /-5s>rǗ\*څMv42!7 }b٭~dfGcXd#7<(n|qA &8D99: 9ûv0E -F)adпhJw:WRmԮz7|;籕 g}9*dzaEV)4"wq[@ݲk^4w:M~XƙKE>G֯[k -Hnی }útrTJ'!phU Nzv4.x;~6!:k6Zo ė$@r+Õ+MDcNGY_8h?|Mh|)=9 W-Z/6=z(M~ xKZ(d*sZ}=ګ6\RjUm J#fHGO{pWyނ,P 1%l8`F%=\X7}}%#Fⱀ-T>#p+XBXavtW vwZKC#gnn`-;zެ&Д/^BoC<=xnD=Lѝ<֬ɗiʏ,!Pb[-Ϟe_}+3>:q"w*6`ʣTo&Bm˦{G oMD? i|B y}MJD{ç2{'븰1|buR :go}rE=z R9gjVƚ v1˃՜+[0_wI-/ pp@sWq@ g#g3Xzm-T>w}eeIH @n y  @79r!ۑsBDtq.x;oW -- -Υvqz䳵\GwBˋxaT-a=E]с'.Uq{ٚzehVhSM*X7#MU&zo -ICA b Ih܍XYv:9ci6jN9 V`9%UQNA-nW&#R13OCW;?vMͲEuX0uaR[t8B`Ǻ|G@=vfvƇM5ՙGZѡ{El;Y~FbWNv$7+TXvQh4Fh/hW Kl~VdkJ`+مf* -D}F45-09`y5 EcB & _/ 4r5.Orvh,}ay:Ұw^k0 #X'9nl x?2^l9xn]کXWʘ njW(줻UӘ`P5H*EM~dC-[`Vݎ;_?`| E]fXd91".}ah+FQ #C O 3 -endstream endobj 223 0 obj [232 0 R] endobj 224 0 obj <>stream -x}TɎ0>ZMXfѤ4'4C~\UNwBF"֫zUlj; 7<]L^nqS;{-]ϋ>mm6i\KO{^a<_exYz}ejk>oY3nyn;mM`mdUU [Zv..o ҂aA Zj -Hָ(R'*6bnED#zDD*cj(&D HWU> endobj 233 0 obj <> endobj 234 0 obj <> endobj 235 0 obj [0[778]3[250]5[408 500 500 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444]36[722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541]108[444]124[500]129[500 500 400]134[500 350]137[500 760]140[980 333]147[549 549 549]151[576]158[310]165[549]177[500]179[444 444 333 333]238[564]240[300]302[524]313[500]315[500]386[750 750]397[219]533[509]541[536]548[444]651[954]] endobj 236 0 obj <>stream -x] `}&Xr `s(JDЊPVz`V#VVVKPԯ_&.p{j9[EN]jmgX@ꜿ~} /}jO=BkVO?({s |^0пz5~yw̍pt\ `{؞O|q 0ayumjlE4kV?lR_ lS1kםs^-+q_ի_>Lx-*n -ף`H)`]k|z 4?a a5o zRw]>rǼ[&;xšM -& - -[`8H$`4)rX:8 k (P!دsYZujpnS5FpNӰ7 -Fݦ[}y, -L<7G -Zn:SKk^86eZ03{sBkGWi/0?ѿN3XL2tЭDׁn -IJ1tVH:jXC(  =nS_  `^>>SrIXl؈31nDg_ ^etVL`;cF. X`\q8fa| @'az* 1<ƌa] T%j̷a\~%jYlx[nتm!i/:/HSʴ[5†D8wC>ig5\#[l|q5,187MñmGᴑZߩifN=s? ɰܜS Wt돤,< slyh]?"рN:W`?:c8RJAAA1` (Nj7)((((((((((((((((((((((((>uc= - - -/\0̚|fΓ)^3fVΞݽ.N(rS+|Ymsn?wO9ʂ嫞6U/ ;yJ_Pt5@$aRQ}{2:6C0< d>6}tZ1L_ZpT!E٤KQ&X`:e4x ҽoQAU,6,# -fP`Av ىwp Nda/⟂9Ј<A3a6 ->,9ȋ \a^ppG^ - {%aɰh +DN8 D~VAjX _B>mXˑȧ>V߂/C'Ѕ2&U`5W,85~Ά5*E>NC|9~#|>_pf " -ȯF8 8p~&|| r8[ -8J:r^"_ !51.Aå77w2r[X{pLp Fv6fZ;:wB~w ?AnB|܌~)?[$ې= w o;!O ]+(Gȏ= ?~Fp@e¿ -bȿF~ ~[mOCO~;gBs=<""<"</ϐ_&@~vğ =D~~~O557{DO!O#;79 w; ]x=O2&|v# C^?#Lx o7$/Ca?? rތ nHlMMMwMwMwMwMwMwMMMMM7M7MĦ$6 M?@lb~7M7M׉M׉MĦ'6}?MGl>b}Ħ%6}/{Ц/ao=Ħ!6}{MClbĦ&6}7黉MWMWM-/2/2///"/"//"//黈MEl.bw<<, ;MIlNbwĦ$6bwĦ$6ibӟ&6ibӟ&6)bӟ"6)bӟ"6 d'QNm7Ȧ>J6Ajs`A?G4:`YAreY.zNk!iպZ - `qVPkhc@q šHZ j$EٴJj n7Ym(YG.=e/7|*8LsщȋlE:c@AAAAA -?+ D_+^^:A/ -^9^C}g@_1*, w8} -8U_qBR_akϨ4}m#W -_ }5Jz87}B#)((((/$AW(WzU_i90}ŧ+𒪯TMVGMU}50ctҴtW^ z+mZT%TtcQa0׭sr0уF((((((bdEju:^/NY`0dD(+C#}eE'Ø<6A((((((+Q=}e4Z^o=))p:Q L$2ˢEEdĘ$zNo0r+A3ph0yh `` iw  -80__akۄ3* }5DdQURTp+c?Jz8r08G/d`푱EVh+/W87ͪy^Lӣ2YQ̲d6Y&"ʼn!^uyd9ZP']^pEd(ȃhWf$%:H92*a_vґWbDiGexIr\t2)`j@AAAAAT;Q#$]+)eYb5V+o*.UZdju[D2 oS $Z%ItRU`ABD*@2~}}&I93*"˼2Dd#\떶ŝ4Z7lm_OL~daLbN!PPPPPPd}' ("I,ZAV2+"j[`=vb*k^0U_IM+#6b3IIgRzb}%P_9'L^&tTZ(Dp*DZ47jHNjJh/ cGoڼEVP}E1DFIQn([x/()b1nw,NQrX}NiXKvKÑ.F}񢯒z619z, TyGo\EVw^R"W$)6;RěndLLC(,{ P~Ya0VMf[qnv[  V׺n_u ->_mmm56͘/i;vi[[m[S팶mm@Y5~x^i,TMm )A -A>Eր; -AG x]zTaEѢxԽv\ߐvV?UCg|O,_/}g={[7/эOԦmP.\ 71;lã''vPmd:N (dl`KJ#+*&WL9fuϘ9+:9s -n?%K}iɧJl&t7.Ń\r ߅Km8Y¶~$_ ߦ4 -gR謙3ꏭ^;m1Sj'WUVM C??]Nj1+Is:-a%uƴEr5„XZ3X dK:dd4UQP_^h b6}̲94 Oג`+Z\k13k=wmOKg36hh -5u`A#bІs&CgKV * 5ܡfu16ҵ:`aGK7\Z^cVV '"DqM1=&pz4pU`kَM} -$Zc}'a1t DqKSǷslO봀V yaGznPK&ӊo)8}i.[c.qtݡ5@L5މ_'ztZP0E,t0G`_RCR{KJ_kbc¾^mlLEʫ5ؽ: %TTj0a/a?@  -9 ?>Iz%s56S}}86fiہ ~tia=#5Dُ|5ǹȕ֣^L=Pu77|qտ#>j-1@{ &L#UWIsf|ҐtUX ݀pnP/ѐR V_t] mNwf q/ęgBb2)g/2` 8+U,.y?]M!@Zt5RՕ%~1 cڥ G -@ǒT!Y**߉#Hd^T,U2KkKhhbYZ^Qbv}h}x}-%hgfgڢ U+K*h!_ߢfރ~>yϻx; m_V{ݞirñpV ߁n:ȕf[NyٯyS`>tXռ yj$O |޺ s@w:۾'C~>?Q~3I#'h3 ~/6a2tӲ]y?kgˢd^34(_Ix¨igsHДi~T akNGeNe揄O \OGA/A鶠4#oWUfn$Y 城ɵ}qO.S|y|Ty]f2LY23I&dܬ -A"! )M@]*O -$a+HݵE[ZE-ڦQ~sr{ϙ{y;g9=Pn(;MD+\rEFpE"OQ)ReҨ+JR*O^"Y&,岑S8PRn3IН#ɵeX\=,VijMxM7#<f)Pqk6hjXY$2 F-kĶQRe*o/IPH4pZSw+$Ӛb#zӶSt ˚մa"~hF|t 6#,cz5#>蕛{|Faks^n4wY>k<˰M'2i:k00O%`faQO MrIOY#?Vi"4&k jP6[jCgb-[0to[9p`!:kgzOYz!&O%Rl4?@G]g}m:ׁ+: M=JRۄRmT14OpҠv0Vɪh^ix|ʈMZ&?-[l9+V1]![FndleweCRL+>uS% rgʣŠMx;:|;}|G}">TO 㧡^s.X>;Xqpl3F?b0 -䷘_0/F܉/1>zcS+D19g04m0o;W90?V]1 rW1~Ka"H~AmZFOb9KC {p%Ms'l@`VڇU  wcM20I~"ɫBO,H^?xr(X#+($9DHuƓr%z -^#x"qA t|F.#A ->,Ao<19y -[IyE0`y$ŕsNKW"AfĄ켃܃nj*aB+9k V-d_oM.$mai Y%z=Qùɿgq/l#h>W't X2k  -9)J&Ļɿi)pa2 ;#>"9M-FVդG~9PH)0܀u;~쿗1hs_$5d䐩8}92D |:\(X3M&o7q|9>)ǓX di#+m(y/aU^\ ű֓q ,MY 0N qxާ"V%ͽ}ȗ -Bdc YV:Hҍow%.w' }DiO -EF -ۄk,HE9M%H•);\pGqpp5yNޕo ;ڐRH5F S` -0t@';a '4cSTbʡ6hriAщ6 KR%tSmgr܃Sy-[|_/o B0O+bx@#/Wb<5Ie%?{U ^e~v\1NqwsW>|naQ~õ, C$&/ N6=:%d -;;!^XK$"5Ѫ7QVt>F%d>!v\*r3O݈Lz3-#N,gGN8wFS-J i8/ũI#ӯ 3\ݞ7j 2U$bh1PDˉgb PrD!5R.RDNn&Ivl1F -@hiDZu~a>B{o_Eԏ?mA:GxVo@djA݆a6iƫɽ8{{Q?$7E*q|#|.ڃ܎x81H"%kqUh pq{+d~R3H>㈿+H)$40_ -<џ`HQK O3d+.bgur{mb -.Gn%uɝ#ʼn'-c2!y0j2/_! tta?6~x -taaNV*jb*;CC }MA#Z -Oq*E,SA6QB8+c+ Tj,bR񚼦&ʓUI ߣF%EdZԓyga$9IU:HRM#Zҽ%j7Dʉ$'qqnIIf 5ol%jiߔR^OF]*D3P=Sc^Yi4^3]i|]2UgOS9 Xnkow}PafzV?F/7{9]|LCI7f>՘L|<ē3ä#D2^J8>qh`:a -lAYą\=eq_j2/ -6۷l%%srWW:W䮌nv=)>8j9j}wQ 2xs:xZAfuhCpR'1=#!u#3aƒ} K;`{8lEvBL*k)XƗ=舷Ży4XΧ8|)i3Yz  D!:5YF+cτߏ^5,vag="{x8_RJW (KFVI9YijMEi%iy$=#?/[[!0u h9Cڛ9l.즠leb͎`0d1RXQ(Z-6siYii$Z}'ait۶]i_BSe +^=m[O~Olgq.xS;w쨎tTrnddeq;h=$2 -=9%О2 -=ޫlh +JݍFuNOX\993аJcO#IWuY;y,1+협jQh(P&r76Wq5%H0Âʀ1 mƉ@Z4dVAyKód6YӈOHK*,E Ҡ:IY^E. !% <"&6;+1!?8PZGP {mGbb/P(w[qS(E+ת%W3ްW0nq6S5#+*pFsx-m"WX]{zvLvmSJvLiO93O-mmQǞĒߣ.; -e$1jW5qֈ#rmYmm"_1zb+aO)ɖCX]UђڒRtuK_GՅbUQMvVGsD1%_U*s" -(NsUp{P܄*N;$qͨ)d"!(!URlꌘNBp]Kge,ɠqȓ3mN>QY:N1^)cxATƁ >w we`h@,-q^VMה -00X^(R E]Zf!RƔlp_6 - ~ A mtD2{q -@['ֵ'ޱ;ݖX掦)Mms^(ΛqWӂ7t^u6^wdZ㎹ f|vgG޼pՀ;\"5O@yɭw-0je(yY撆2VtRpw%ZVS7Yސ5&chHR2ɺ#L&1 5L*$nAKD{T&gU}E;-of6TDFd"<Ө1!S[v= EW;~m-0z=-('vѭǐcQC(G -vnA-Sq/9:HC~>h6GRF$ܲą7댭fܛī Xh,|ѯ/ 7ҟu6xƏ\o5*˄a -`xҒf+-5ZK];:u ccfg4r,K]Vjf]붌؝zݞRj2τQu|Reٍ|ZGBE:gTUO)FA֒C{J߮0荓 %}{`b}hE!3kEYfH!#'l*2۹h@x!֥e =̌X[_nS\[KOU}fF܁tkV;*JE-UKcw{_[[SQ#q@EjC9 -u+YeiȦPd͘,KZtNer:|-ѐ}pG 4mM#f Ds DDK*n  oV`ʅNBgD ]B vwC#TKT0ά:h12k&77Zk4 )zMԞÿvDW01cY8{N&I&dƩ-7 - r"Ej -5iqȑ4jp:~l 43/U-!&AX<]Ph)ŠXiܝ#:EUQ\ظl6IIR;Ւ -iK;@F- q*ytlrA?2ڛq&Qa{j=yMXJ%$TUI*ا:A3hGcs+~ՒIvfi~Ğ%h=G&%5rJqظWj3$p-ȉxǡc/Egȣa'Z wwpy'/q'yH2c382rR%&v[x|Iz:!G6/1Cpn4d3}TTw;͉! :v'dVdb) -eK%-%J.|VQuW3ʣyx{~&*9WBKNJfjv3d >eK!AA}^7j> XjBV勑VХ1<_;`6#-1dڤ#}4>?C&Yż N=sɽmUuL9s2»zy[_0n}{ OѽPZR5{ K˪IW߼a܎ =hPj#JY6HN2pr`U D:^ЪRҢP(JxD$J)Jj30 -E s$Je`w\P-Z.8()@Ć+e Uas#;./<0,4dٔ\.č,E6Ҿ~9 cܩ'2݉9#3~F/KuҔ>?C;Ҷ;Q]RXnumM}{\7?j+-rlL/nrr -/}|%\SO^deaӝ.c?H?|{HeTeF}!X_3¼}?xB#3٤ \] [ -KRzXO{DD43uӧJ|[%’4 I«e>-c )/c6N0a٪m~W 6fEm>0':CeRFoIOoW)iTEjdR -Jm_Dj~mTfwf9E3,b A"0rk.d$h\$GʡRNKNW>9XEF1K].\E7Qd@@Um_FtT^BďԀ*%-5=.P!Vc)SlO+i1!?) AX3b*I,-_[qn.u϶y}g7 ^OX?rqAwȥ)8ED?=28MYw~)[IVKe/( uj:N@gpk!~@dL wu6Q.UȦ>NF!N* Fb0*k^,tnpAh^&2wMN~ЩT7OiiVgڝ@Гq ͗/_(VT -RÊz%ѺB2,$*EmvE/FrdeΒ!`dP<ЙPɋ>WZ^t\ -V;-2-U}HI-wgNOk`9G_?ˋtE7ۥstF K'qȆ7=tޅiڪ˦hW2 -Z=edĠ h NIRw}y*ar6U<۔w*l:\)ސC?HhQzS F+ǝ4i@jy%DuI2y=$3$d7ɰIvYYPwU޲ -"U,+"H)[_+Ebn+j_Ϣ׶R[;wL6dϹ{s Y.cCܪIDQ'IvjtGW U4Di٭'^κ,Ynw/> *x&lΝsM05=6<~__}/oYGX7f͛`&DZk7cg:o1.no#P~T,>8A QT,,а:,V^6LڰM>3&T 0LfQ o9[MML&ք d0M&aZ`B mdLn* M175fܼΌ,41ug:?Zphh(,08Ƈg'sH;O-"+yY/ _r;1[zg s)i`Ҥ}یX/@xf !£Ѐ!cK*ɵJ%TKѝٖO:iI%;K`nԕ47;MA32MY -MCLUVUh:BU5 lio M,a;Dz#|!aߚ__<: 2 %u]tld9iTTIu5PH,vW,dLx|uht;X rV"Tz>_G$ks8]`LB嵑GD/ywoŠ`4QcǬ,{G!ѾpCd>o82buz{ -9A[8ISg?>iQ{g5lJ F8EgXÖ(tmQE*#^7L4V+yO*Ѝx|(|2겖dg-nɩ^vUlWw۽zWڲHrUSjS.}t,10 EQtUaĩz|?}ھ^1J sSVC5yv%)"F*بi>H=ﭩ܎*rv'~[tvMT~0EnWuRy6}Bg| |?$(|H~c»?OuV~b!,G.d DRC} 1ADnrCp zp#هDw` '?8+Vpk<>4\1Ÿ~P{'1LSLB -Gu־0#< k_hJ,mRРίH-`%I1>xKvIVh9hɵ'%Rh[@-*ŧ ^f7&-=Poa/+.ڼ+CkM{w7-' 1,ZɃ7/yXZo杁˥GV35ߛxI V9I1lȏx=vNeWl|gbŢ%ƔwR$ߴI̴L~wvmFCN`FgEB ?ᆊՍa/@kKLHC-^Dlg}Ӎi7ݧ:OlW_%âST@3Kz -* zTT4DQOMk2}o]9?[,)TCݻ#v/@w. x%x$܎1%{N>JaOxRW'=X/|2Y(SMՐq( ii -="Cϔ%#c ؕ L&55ISCh7arӼ-bCtܳ' U9k1HXK|d& u+3 ?Iya.\h1,f50VbHf&bZ{Mo.l(GsoF72 g~Y~_}1' d`}KVtmȃ._J?Qf]u:kײh&)5Eʪ TKJR%w,*BYD ?#)O_bWQ jGTz7r~3v ?A?ke.[c89.1USU@"PU q-IU7TUm`DMTWfHSCX]-Gǧ2u*1 |AZ/qJ,NbJjZ;]`*vNĖ Y\.ϕ3ʯ 1'o\ot]Ƃti!s ȭ(gErt0ܯc59}}'UFɎzX'1Z[hey7_fc߳fO۬].:^Sy#1gYkEu8`pr%HA5nJ%wjLE}H)58&XXzHAi-N@Kg3ƨak6͊[4%դ*E5Q(nѝ|4KM+Ÿ:*,CTjohUHѺ1!$*J̡D]iN,K#ïG>ݩi0=;mȌ:OONg"<>\jg^<,˯ϟ!{coSt;)Bp BFqA*K -$n -w>;#6]w?`O4NFE8!ZKG܇#iEE1n1L - e3w;<<{uaa6<@~at RR6 cRy=5xCUWTUTkotђ0⩪(Ye-e54cv@WcaLܖ8xb6C檯&h1il.,Kmđa-H]dnNT?"8nATqFaO_Ly{ǽnSڮDQߍ'֗o~e%{{yc^.n+nz~|侔ZҪREg~}K5OwN7W?O42-ҵ_**z/^r Twqj/w j0qpdu#x-cǁd27"6ZY K:j=2JJFw퓏N>1N1;gWqE"DEƑ"ԄW$5G()85%H&6D$##a,ǻG'aaG&3pD-^(.(I #f/Nm:Bw w1T`$*d@ :gtuyW=Tw.Nׇ֯J6ЗF =U -_ۗV!(->s9)/:3?fp\UUtT#S - ݋9EBj\T$)TVEr 5'Y5!K[^ sP:3;% I^<)Q,u uQ(r -{XM2jF#@>':,T*R<%3ߦs qc %{؉8;߇w8h&uP*JE#B }u}m(F#ßѿON=IA&Jd[:gp'8ӳqnK Ub -P8?Ш}&v' J:qX`gwkK?; -a;"c&Ccc-H'LhUP= Bj]&<)M8-|eTHqtfY1^26ָqe75.gm z؉9 t EMhpEuc 렯a]5pv@ M*;kVknb "o:,1|0^G#_b(t|۹ᾢV|\n'^~t@H"WcӈO@r7UD~E2Nd&^V)[I-&L<"b4w9}@SO׋:m:h+N]-WYr,Ŗc3暚TZ fS{Y^2Ac8 g:n'tO=YUgOmZvħa M-FR #zHM̿=`#XBy, \`Քa tt\4۰ m s:(a`\Md#^Wwҫ#{rud>ݔ2ROLZ1_!8rυH+bxjg i.xK:j2g΃ |"n598Ob^vA4+n,./.9euV I4еf!%+v(MZ8͓zFFKqq" j"Lj[@b8lvzZmt]]*mswNM}dY',ݶ Ԏ?Uu#5Ofj~Ja, -.7[ʛ1jX}*T"_Tt./B3nspxC~x?ܚY|S|~ :"$i"bJg̢I,WcAsI,JzkC{Rp X)7p ].SsuUş诋J2Ha5($NMT*Eb0$>y.y݃P(3~5 B\<SUOfu "&QIc]2†{|+jܕ\6Lr)ựF))/2MnOĦkncLvyU"^̤S֡3dv·ao~V2:CGY؛ά\jZ1ìŏ/l8u~3KA>gL"AO4>adDqDq5#zMx Ξtc#adf[KF %A5^qx$)2f YDgT-]U0mn*V~I9c<54yT|0׳\ =/Ϡ5`n}yn޹O"2h)2"Mdz@ Ǩdz=M ~|09ބ?h&dG0lꙬ*EU L|~єqdcd-%*" i츱ѱKXR9̏.'&yQ.c]]{3\mwY؋8g0*'" ي`0&fJ7ZE([SIQebJ%i˄'(7rzYgYC_/װcJtnt - BVAmy7{_ƤwyWK7a =Sv.?.X "]RyRRW9\nWH+"_tXV3oIoELCi!I5iM=77tW7gp&2-[ig,Fc我f88T$@W fZ HX@8 a!pWA9PHhA !u:H]ڪ+]s}*IQ]GU2RIU4)R$hU[7y*䊓5eR5T&#xHj PrScj cIerl,V ̓ls ,h$uYq)}/~魟i+]]z%O/t5z(+ed6m-uM}4/rjl~CFD8rd.8 ϖN lXY 3cgQ#2~# i`dśs&̈e ʄ[g̉xD)eAoZX'VݰbZ$ew,jɄ@fQk_>U\ hH{-gSm3(4L;,`y Eߙ?y揚}sc$IOCjepH$ˇN1Շ9ŦdN!̀2DT!Nj=0aynt c'݌{T@v_Pgs cfL. b9;<64$h@ 3ۍٸ3ӔVb귪X*<$OgPBkcRx3){jxԼxV(.]59.o&k>{E-] ٗ8eIb +5vobu4<i U{+lHFHy\t[zWv{|}ڟ[T~E-onN?XzL0pDuW/L[o_*k|ks?^q{~Y -)yh7b4υs\zx=>zV]}tdA0*[ z&,b(H9u1VFu'61œ✕B5 (Y࣋Ȃ<_.a ;Aſ}ŝNx2X{|^;_ξ-T rD31I4<^< -tV2J<K>̧^5w<8H>|´K5o;tL;jEv%٘3f<%tC!=111#mI7Q¾ߚ~6UI+R4a%IO!-b'$%ptB$XC`r3pHC $7$K߮O謮Ĩ2cT1XY˽K}E^5o(ې=<f;%s~j ӮXg4M7flny-%]z SzhV2v -X ~hĶe)k.HSz 5xБ_1N걉ŧ8=^q {Hz?9CkZ)3+CںX^~H yfUmO,8?t)(`q@ԾZG.JQ+شɓ'TkDA. ՠ*H0:}~n&"\DBztF,Ĉ{[I9y#sn^sGn=ͼy\hJB}rW4Rr!w8 QJ0p0&$%.XoN(e"*IMPVwQAI$m.W} 7 ?* i!'J֙ 4v( -zVa@M@`:ax -{ŽQ>9x[f>SݡO?Y:Y{}\JIOO<|ʼђ7+Y)Vۈ>$:(vN NO  PKLKECͨ^@p;t'CwD!jUWMsz7 q0(E7on? ~D}KP.R} $8^MJ: a_۝S馾RLte3Uf&T XНJ-3 -X穥K9ųgzjq3u0=0;jyQkZZh4OhrF0ӻ@da$eX,,I{hx 'v:P ^ Xz}lѾa!ږZ9 bn_^:fb+ÿ%/¦]GcrzufZ3Jj``?tc څۭ ټw?vP zE/Go=_`P-ZW7Al -^SZTWq7Sݽ,aJZZ;,ZVAx!혙raGJg\U^vw Tr -oB&nJqan\u!N8G i˦YVe?*0"@I&snG+BQ deOK~c#R0-Qw7 -J Ǣ1 ~ - -q 4} /11H=`cfǴLwW/l}mt0 aJqVc 3#>t(&fUe7WXCcANtT77N;2Y#3# Cع<[~j4ܪ|H~&1FQ-FŘuxzW8p7F~0?Y~-aulKTL[JZ\|3P <[ ʲk }Q 1,;.uLlHe0}!p4i1Mw Ӫrg _]N$|7X?. j"y_í]˩25  k˹ ȹu(gJ<~Nk߉q(>O3C @8 燍L}Gt9$ZV42Y:>1Af-h -)m,`y+j$kVFmBpM-䢊N>RLA>:GTDjPq>GtaGF2,7d&33sf!$51nc[ڱC&M# v|OE;1¾K]zCn{ -+dަ53f8?BmE)ĿKyX75&R)NOK1)RL! -nњ{_GZ[k/N*s"=+{>d8 sP-%C?, u,Ts_ Y4p(`N`mey(;;UF%g!{B-j xb9_ TplvɦS -!GBR iDb G uT^!ʖZɝ@DVisZЬ f&Rfy;0LQvd5DZH b) W.Oz4܆aZY>ivlL1*9t!kSwխ-{W7A޼=yx>]۷;DKW{pen?>K%O *˼KA>nS +pWq=erˍ)dD_&s3i DE,9΁s#30(锝3Лm|߬QV ߢׅDZ kؽ]~Vĝ+cvF\>1|ᗴFB!'ySToLZ 9baJ;c9e-XFR]y#v~x\IQ#X؈&_}f%$(Ӱ el}ʏi X]I힋_/?|6jbg탵/}iwe&:;٧ZP[ GtVP1xOr%'eEX#;M şrmQ­,!|'(B僧4|%y-;x&m[Ł@HOTvJ;;Zݷ-+1 v|9i=<8__N: Lc=D\Bk `0\"p11(4&1\y.f]~͆m/yRUF:j&ͱEY90JQ#hM#0'n `P;  `Hyօ|cr%g 3m _1PFZUZ ]>D;- `na*eԶlU,%d}Wx KkݜHܽүrSG_ګzpcvF)BY'*l4?IQ ,Yn8'4z4}[7|l>8C =T!)1&>.[mNJR(WqC8M -@՘,YN  3ᨙ\4"ld'`jЛ B@l nrqzxx9xưvm(*W(?}(>Y)zqȠٝou"֊/p6.3s9FӐ{@p]fmvV:=!>+lNKΌ8{ጧ; FifMg-ڂ[Z91ELxQϤ/-}fmE)iq{ - "-Rԋd2qR&4&+4̷hB4\-7QO r2'*v+h0RDg- ,؞1<[fT}#`Og]aq~-DĴPͣjQZ,EED)etxKssgrP@Ĭ,Ķטov[NLj8"; G|vN$Nɰ2@]^ì7G2[+q寛#2gL.锈xJdƠ# ƹP㆟tܷ_ssnwAU?Qs`bx"$O6Xy힃5SJI*tF'nb[tG -5rXdU=gV%2KkO!`-cB4G|Zn@*7n'{DSa6N %Z)a&SH͜)zf!oXVhz84g=g2d[[fh(9νGJt -ދ˔0xܩXڈ%޽{Q:c꿪}}W:k&D@Cbo?rTl'O`VK&,c -VE}#YxMR2"dkMQfԙ:g0O/ \\FAT=$$ɕ&L g)6qK*_[Et6gghiUA&ItHe -NjޕcBu*"}6"4+DP'S^'oa$ѤƗ;HiGqsn%ۄ6Y 'Xii&[i{BﲎZg+b#0ʍs+u5?U'mHe\tʝNy!q%Cb9 0J,ѨQ$D4?w?J2)c t#޶h4]C`7?2oI&W2:zH%AWVP+ְ%h YW{0Y(ݣqC{:nJA;wV^y|>g)ﯟ:5tfP0Ԋ=:?*׃ö〒]HN,M#!C)RV7;C'S/4JC'c/i9%ȱoA > _,=]";aUzp4۪+>Sя~-H ȵuL_bmD]lkh#[ңj ),*%ג(Q -VBt~0hWH!5bxsv4;=V82!@07iC!}0s~N kjYӪy3 !itF4-@[Kl?T0˴%WeAL3pu=o&z QeDY57fd9猒TcYZbNk0ׁEU( -YU8LOb'ߚI"#> bPqѹ:Y >̧SZZ˭Нޜ.S[C8<B+5 -5P~c]۪^ߚޖw;rO*:բWr]!ximiTC=!bjc˛i_@~:FYn*F+lMr4bWcRiJ7B"С )PۨdAWjJ2=_z;FrP=pږh=?w7+r}{\ݶvԹ[Sh+?kOyALnt+]s5cy2zUݱKF;{oU|ջoH+o_Wx8$\;sUW5M|IUXy'|` -@K@:Vd8) --Fypx(8F:m)1ºM:;EYΠ2sUҎ2p VbtAZK^>HVċ9cd('edn7fpI{Dٯ\e˦5l_jsڐΟy,v46eڍ,]. ̀X՛+m)[z:YTglNՑ( UI}x)鋛"j_"IOVd -HkvDUvj 1aitg"ʣXGyn"?g1ɟsGn7Jb .- -2j_ -C?E) =7,e0 ao7*+4r ^M'hrBQ1{>ѽi4贚JJF{Kkk:W$\>[4.Z~7wh p; h24U+ <3]d#|18<i wKZ2b4'2 ːzJ6?>G"'L5"46 !ͱ= !8 rQIjp!.84 -!ᆅ 43 `(3~}mttGMSa/EHE'_)Ʉ⃅P|;3OðMx,EW%! .,:cYxi p~ai$M˗77w-{H biyBl^^#چw_%Gs5 @m>Ѡ欓*A(<@N<,竺ӀOM0l!=t@O!DN")du0e<87 V;Xr{. -`s0%w?=ן=f},|8'hdg"ǪdT Hٌ֝d{pK6g@n&ELcnQRDͶC5zWzPKMpdF'5l0tNc5Zh`<ڜQȎЀ\?v#gHP, -#sО)DqC733s!/ aFФgmhq*&&͓mڿx0zvdk]. \?n}};w9R^գU^[c7dLtVUUteVK;_Tw5FW3lnsZJF-6n ?nou -~[8na#J> -XeM -*X ( -tCafJI(/jՋr k@% Ï}jÌth /Q%71rJ&ў)vW"̄$KÌ%a 3.(ub.L3u 7&@3KʄœS)Œ*3z/mPXDp&;!>|h uT6.DD"N/kG534hd5$84STi[W[qQBw}ߌ} xՙ43̌3Ⱥ$K%Y8vb Nb@p+Nh@Ҹt!Iv$! @^>mJKtqt3sf4s4s|_$?ڦBL,-Rv}cۈ߄o7/شeeBda(d1smf wrgiFl`6io3xw-;TȌg\Mq\uuGXRR"M}ܽ=q?gg< ~bY71G - ~_@?( -5ƅ *Rm\۸NjCWvu1tcBroj7Ԙ_ 2vC e|{}Љ -YAQxf%`!]Z!8<]Em 9me 5mGJKUYH^+R֌(X=zQjtEgeYّG38V _cB[D\T뤎)sB`)aQi/֭eZ'bUl@U3XsJ7>GC=aR]_Ajtbpi~PcGӡ#.x@w>Յ2Y/%V-¹wQ$Y»7%ɱ?y)HcHU-$%jhXѭMCZoe|P>hQ~(ڭzaE8:^aʰ^R a]~xY-fdm)H>n OAE -*TgQIP 0Yt;;64&IbX&4<~(yvJG1$]i9SF6a<5<ĉE!7l=MlpMR} ZؾFp%XnӖ%F6:7nε]T[8ڟ\[e$=ɮn+_, :Zs΍2m -Ut:Ih_ -q˜ 6Cp޹EtєB1ŹmFpo4J!pS".8 3 -<='cv.&kv -:Av[4v WM&D(CpִV@KS!؀m 7n\8 ҄ *RUP(!WO&uB - Crjz-b}/;8qz~ ˷hH@7tǶJ)]qz .%2M2gGpj~:3TvevuqCnDߥ 4%DVC\yUu N`C/ Q)崘ۭ{cF-ރ*KDf̈-ª -a1f (&aIؑ셢L|lPP8E-8z]3 5c}3L7=iPʐ5Ǿ}"D4>@R*@$C\5OeVmBP- -Wq!Wc[s(l(ؓGC:4++լD{$+]Sus Ei^})-w7w<CVW\=Q]1 sOr <,MVV<.`r OdaWw0BY,uuf8-~\8!̍7|U7 $|\|\~l = -Xm[m``d2K))Q^$+@;Y\A̢`F`h]䜲s:G\.r -f]+ ;Htw^P:@OԐ ?^ F"aa3E56K9RNw7t|ÛJ?6Xzd3x5S=8nS#mCeU#yH*R#K(N3΢-MIi9Q̟>ݕ3BNEX?òMxՍnY4 * W['Ngs+eJI -MhSvn%6qQu$UVu8Qe%3p+r5q)_4}-7_`as#s1_HrJ+3,h>f%\fZ2e_Q&F(R@oNl[IvŽMlSJRx䗊e7G%SgD$wEYVUI F4XD d.'MYQ 7^L֏X}̳[A%X֝бAkGle=ťBj2z^üAU2 eAz"("/"w7Ģ4mn LF g8k#dcVR8̹ -a -X]Ԉ*rᮢF+@R cm*L ԎigJ=OBLۃ=GԖXNђNGK"d):y3"|ވQPP%ك#X{ c/%XHƷeAqHYֳH$\Kx]ᎃ{ tI(`ې̽/Q ]pU׽"-(aT\"&Qߓ''5^U!0l`b԰2%LߝڭM*<.?z1jԛ7S'saD[-I6eʾrqtetǺW-Dww'r]] ΎD kQ!ĐF#!в!!>,BP r)K&^E>b8q/ m# _|mȝy%JG9\0X: #|"vأwfMכ,ʜf+J(埜(KrܹכXk GB %{ *sjMKG`o(dKwq7,mbyɸlm'$,e>aKsg(Y9G7P( |v/G*UPY72NX>FEn -N W"|*|U[VdX+x‰B}<6SMU n"E1oUEyhC7̿F\fC E8_,EMk%>+s`Z݃M kqjM6,in"O\q+/2Oj6mN![Z %OZX:(bw0h!D04̨wC]Y2+KEnc8dSO-GQb 2ύ<$̒&g17/Ỳ$ -0"R=͑O)ʵ/sRTS\/];GdW4 &WZi)'kC.E]g?ul/!sQ`32RBy'CK =cq|>J[f|joi!#O.j2m$oSe -P>/œm5ӄ4l|y/ѵ$YCAZ+Lv|ESV᳣oGLT@r1bAzZ;(u+y_or2ARaL!(U:3~J8hx_(1'a? -(a8wRg! -pX(E簷Jܨ*=D*-yPXq!q>zRH5Jă×UgIN^fOUA`r1*-G[Wg_f!~ȹLA|>t75"8o6:7>4nY9&HlSVn;IHXlz`Sn1r3LzL@[hc>>'e/Yf3!U8ʕWcXAO+ -gujɟr˶ϟz[#O?|[X/ 79R//_RNHߨgpuaYmL$yo)optN4'R(A7/J-cd%2.1*GG->]%=< ƒk+דSw[IV`a'aGn.UW׻ݞ ~0/odΣXFlt/ \FntK7凧f%`t?3t/ב&|ħ Gx;2eC]|ĢnǦ>@H@XQ0}uP`/?2T_g~ Q:L?x}淾;Κw_m_f^GĹsFQSL=2N -D 0ƣj]DnTӻ?1!W7onwDԕ|O8+r|T"ViĥǠ 1,-$mq:)7;z~`.ɥ3\wuWV>UHkBv%8>v%mU3) W.BɧzR6Sy7G]}v(,n&JmJ8H% 3xQAgfzGfμ[S״}Yb́ 2S,^.fT&]]g`NNMn/+q!ٔU>9ҝ|}겹MS\EA'd?sRND --S-{UՄWusOW=w~訓>mgKѥpicvG'-:.X_%%rȮK<;?S&4_r yaxXBynr\^)* 啅Z:0B%.( Lmd|Q&\l}C1[+[** =R.R$!QTpݝ2ܓ9IX,L GVXb_ӝ->!P4^X&TeA2Czoiiyofmqrn++tP{W^8wKJrkũVfgC[+s=.6>1޺~x 5X긌@X]?| 6>j|Z\֋((8Ny9QaU$R|A_MQHJ}Nnj#s slKM>.ל#1>iHfnVNT_RӅS]yyskt$}"S@^z A|$ԣLW#bUA ܕ_)y'4szrqns:Mӟջaq sRMZWϖBBC$NjR5{$=6W`MM=0z'i^ BQ 3GEB h&-M&ajp4=%v'2qM2lЙ 'NZm*@%jT?Ȝ^[FwdĢDED|L#b.Py4U粥le 8ʺ%p*#TPS-L~x=S߶gu?H1 G߮SNR)ҝ;vuM^aթS G9 ?*?}7~z斺g?f IE_OMIMYVksD7{s{έXѻ}ojx9H>- r`wf83A}˞ҹa:V~sn<*3إs't@"pR{gxRsg͕쎼)a+8^w^wFF!TEEB4Mjp.W&ML'`]gѠC9 -z|OVjNC! 5>;l^κVBMF g8-R6F/2?_h!hl]?ց y>eq:-nĄ Z:nn Rm1QyɆTK;:3soY̪^t._ XmncFM4R6}tE,4WgLVc.qy\UŬWGq!76TGsg.fOGS&Y].s4, &GqX0=A9bv~/Ɔ`_HM\0nj/2q E&ׄs1PdFޤ -U8]xY퍋!RO(j‟:s܊p8"J¹17- _հ38I-K:QRJ"ա__TkaπC=JD0V)$NR(:5𼆴96W5RM@3Bkx.H"'ǝK(\*^S)KXN !o3zg -/6k#EA^_6b9bT?s.~tsT7/d.<X _)P&u'SS52T !aAqA! -Z55NBM -j$0äةRDQ%T-/3$G*Tbex՝ԯRV )$EXA9p .N+OI :f<^/`c*(-C w'8FGPN&f)f AlQq:j1^~eyt]t0}wkQA'xǝ6&I7EGy=BC 8e(K ' rp}dEHGM1S>9ҏnLVLI9fMt72U܅?0ׄ-^L>j1-hqCt9ގw~^`koqѯCT]G -u#'\$zamV*Irsu.W7ֻ58?MքuTD!;Ġ>Mf555?a6KC|iޜbhŘޯ%4v#QrTVc=;2BL2E\>v흤Zcً@?db['a6EMVNy1zڵDe)V̝".j}03)i3fNɽ flF:DsRϢM}S7{'or߻n}EPMkw21q0W#z0U>da[c`DΕj0~1Ҁ|}y ";HZ߁aWX3b; dl f[а ddMOIފ޿YԸaoݸ2+JfNOy/{dQڙcGzDYjJ8ty 20J+yp -8c8=w!$ "8#b #Z!쾐Kb}CIeL~>64SIFoUj2o⡟H44A7qQ:f@4kYO%+H̼((܉ά4Ѡ -F31_gXH6Cc{gXWpZ~~;Q YMe*`fP锪P?)#Ҹ7߁~:;r!UftR6\ -:6Duckr\vf8c,rZ3XV?XNPkҩN_y0#蔳Xq#"Լ9Ҁ.(!a|)6Ưb펤Ly]1QW$ź\gP.eq&|/Y! ry+"-H0.bxŪ%qjmjUچiVeaUϖ쒖rt͈,>,K׊dO^1 0bi|S0j5[JAbbb: 'jV춫I"cWzYұvt8: - - v"ع0Vn;o鑴Hcz$]nGBƥtKv9RUZ:Ŕ-9Hli悆8Q[LCGM0cZ/$U I-/QySU@R>T~Ĝ - J"< -u">u5@*3ЧV+TSqfC=GUyxÐtE1a %+lN5Fj DGϱ7`A[0yA7M,ѿ;p %5a\ FRZG ܆[KwkItR,吙U$^ -|*~D w XmL26 CnaYpv~?/;w {Lx@ %_'p .&0WRi܄Ȥ (o5OFrڽ (;cCl,ޒ-&} ]m3[tI*]WKdTEy׹ % :Wnɛ K$oo ʖ Ψ]l{|:9}qAQجMx0RmJ(*iin3iTȋZĮb.f!GQtxaRpveS=- p֠Y9OJ:^^%c)i1&b~rE:n1q` _W|ş{ro4+)7Z}'ѕx9- K()yK8Y4n1*6mH;]@h59i_gDos0\:JԚanq`x!%} [ +Ƿ Ǵ`'GcB SFi+#ӐnP(jOgҵ-/.h?}kM^ ]UpBqpsY| ѭ/6畴ڸgT ZUSH! - d_|Hi lg @Ziૅ.Zgx[SAoݒΞWwו?bIH%A-'홨[( 7RI=S sD$gAP"7xT;S\߂6? 6~}gQ{`( -|!&c ػ*ڼ}!´ H~=,+>s'otGݑނM/M-Se͟w|z?$?/EG饍ֶ ;z4,fr -!6 -=*L(J\9VvK2lujM9f$Sp'2$ƊQ}lo3b^^ 1 6`kL3K:LU ϺQrW{2> w]$E~t6fFDB QPt|H(?3W1Gø1W}j5m-?\o4&&SLu*vVkqeiw@Yr&e9mFF`o)!ǟUgj@U!iYRaZ)7(ţK=oq1^vl8;'0'5۝a9lF'}򸚫Ӥ> /n~n[dh,O>:N]zV= -My!<@}֗yL̳sn`0ZC?&¦[E<ѥ$'[V6pZp2 9%}[ ok묋g>& IL)ONR'cm91-ɉu~#8yb5[UL4n f<~YG 6t B{yZ<#zNzzb+ %-3zRJ0n@6<%[&I@BEw=T]gf?beeE7TZҵ1zxqcp#wzidgWjybcx~\םԕۘ>r^LrkLKH0>6>[ lٯsTt!*87u*&36h 0iWhDTzΔ#JbBG&>5*7U n}h*lj+@O41#MlnheQcA~EHt69l&J~&a t6ٸ7GL]887׿aYFexssr$w[kCCF;'{jװu7yb#GwbE -@1 W\Z_c=1( jtǹ{VM,'ӦM!-*;155QUSQ(p ͘Q\g =G/sCŸX@d6H93ŗ¥xssIYlagu{:د&Ny2ȖNC7R!SgxXvI}LL}yfa)3x* pFsi s5 /v4-k"Ӣ޿[;ne7s7tR׼moiօ[wmF=܏'/q{:'wrw֭hwZMv%Rip7]wݪ/K]Ϸ7__N?q?A~i_ͱwW!4B -rZ4sz"RFCcǑ0. $ ұf*ƺ.fѓrAI @ƨeFKhRUB!dF]{-8p.!F"@ugC"@"h Y5v#jFg0Z76 t^pËnZ*A:F KNK -J]̧ -_SZ/A|m,RP=Oq2pBVA)J!NJ쥐g3h3b | d!IWSAA!ibtנm :nD!χ~ -Gpu>\CM@ @3f>NNBn)]1D !P8R@ +%V_s(cz' adbXFDyP V3#䟎at1!ahUBR H#̏a2m1DeÈ.VB$^81c@Z%ǰX42`i +a b A3+6f!pe -'yDW'|wB@; d#\_|%4 ױP}1Ip^i Kk -}1d -D.E X)b1JЯ{[ nW: * -_JrWҜ k2bZqB$4R[RWszgCGUk,`} -r/IP -OK,o459ҧ{FYiī 8%;{^Ӡ׭"pqRig1v3civoʻ'岗]gch%coJǸ=nx.u|M8q9GXd9o\]z9WВed鍷\YJZK*s*v'rd~3*ܮ\sxh?>') nE"m}^iJO4{E4s3ؽs@չN׷WڤH[G*o7Y8uX)]RЛ/ewGN_P[ٝs/'HIUm]w -iR0ӹr͑tEHGg_/XԷFZݶAZ3) vA3{pCZtJM?ױ}PuuwM{{t}RG@$wuCv{%i<ޞ RV$s2zוzC_3K,x-ss`0VMHnWAV72ع>H7ѷmb69 I]3ؿfP\K a:{P"Xl -JZ~$gɷ y&OO]wUiu^Oth nB۠<*t# ўa -@eqȲ'K#JY(p/BP%6ϚLZo@l TDf {#>)#9H5d&:r Md#r (? ?x#Mw}}* , -~8 )VLS@Z:E=YM)nܬFZ:[تvv;!<>Yw>ePq7տ{D!࿨?cU'O'AA{I -j C_!khE$'Re\5J(&J$.A>v~k @77M@oof_&nCn҇1p 5y+9/k^墥jPN߼}PTٙ0AAc0aBL˺04"2 MM㺮1,X>%x<ײ,1!cXƨg N {o2cfvkk{w|ܯAO"#dqlܶVjq+6ۘu+; Ն…l.ߠFBBAKD*p*5-diJ o:O65ڙ)5)=iQR]ҖdSr8`'bgZ;?kh֣U))));R):IILR\2jH?( SSC!2bxWxb8%E))FI$E'R"w#)HF6R"g(#)˜"sr,R\S")HD$RQiVC")zHq>Rܐ3! )Z8[%B#[ţ )*H1A<"H8h Kxi)nx/G(#}7Rr2 Wvh(|J?N~O +%`},Jqׄ&I؃t1HZ &NL ML2NWP^M%|cFxse-<^=%,`LS&`!}a_íi$jǨaGmo A!7v< ėy`1:fU~?ggk:chEua={NC!r؅M-Txk|9 0|cWqx ِ{bO I)B=$g*m?;["tv -:;>||ǨC-PӇ6契l%V^aaQ 0x؆dBC0 >Ðw%8\0㰗˨yY\,k_g =.ŸӑgL|WPȆ$~&U[$;$ y5/G~5{|ls< VQNOSw/ʧ?ک;&䭨O 95VM {#p{nw8Z|haDuS'E ҤC àҲ6ߢUoՆgr>V<сW #co[G":ׂC/&t#&+ڶ@6Нȝ 826O|FPߛÒ}Rob`x !gF}m&3QyM<w<>/f܀ - o؅qM3GƇ\r% ց*@Xz(XmxJj\wBgO1h]v).tO +hRC Npхnȑ{|wPo#\H㛀Vv IfO'o` ?W8hd /sWk@6$6{a-OODl WY9vw <]؛iא&Q~FiBnY -![bh`\!AYSy(m6蝸1b{aaf嶏י3.m>m{qB"J7ՏZ0DOGQ߄kC/+c[Fnel(RQ&gQSzNeY*4ssHq\Ysz|,_t̍u1[swhS`VM(kkޝw!5B&ź?1gkG-wx&X?r;hճi+ .K 5&x+k=B_'8]+TN+7hA"j?)=6⩛[r; 9_Gk&juoࣾ5_g1:q@~Zёמ((> ̎Wp OӀb43#3Ӯ̎F:#C~&+<G~᧊- } ס@B3iڃc<sӽQykMA9&27qMCC }]doHo`bkb7pb™4[oa; 8eWJfX-梎e?Y*. -~^Ig.Q#{Y'6_r'ƱVb[",gq[*fY q-soo;MPԳoEXbXBP2X  bc3hJl;Qt.^"na&q@$`8/6#[Ag2zZv}0pP? Y`D_U0R@=F>܏1N7 PMM!OR6!lWiO)y2r6p5/&46f -=q֧X[5;84͢59k9rhP/99 -Fƫi9Un.54@Q -ry4& _Ajs!GVЭ&Ao`7Sx)}5nPtؼ]q?\s;gҴ7޲޷}`Ns57(cl(ay-}ѽZL?3o6gm&X6pr^7d80Icf 3׎Ͱy695>@c \ QqsGP1C*AɸOU3Ne85%<RVĭd/j5U,CSy-O/?]F1\,?941o91 67nIR5.?2AGq RRXY7:FGfMc&M_c؅I I 4$פ-]. C1og 'Z̲z)cAϘ S(0N %J~[} -OLk  *R7"m8-C8–TVֲzʜLbnAvc:{&xcjZvXBgep} \n}uK%n je4*2߲vT%Ւn J[RLh/5Zy9$dav'Mb{js ƬoruMm-|I{6_[R[.55*mC.V im5è>ۆC5w/I> 9-vߗQAzcmT:c;CzO!{>ܦ0O=\{gopĥ=aй{"x^ُ1#:=?w/ -ڇ<уT'sig\R9&IJjQaMzH/t/ 6g~{4`֝ѭݫeUՄ .9fwWowTim&ki[C!Y1v9D#fVM9϶&G -$Nu72#k'h"+&k1ёAp,nuwЈӣ[&q,u,r>M\|~+vG|wHtt!KH3 - `hiTLtԑVZ}rpXɓIG;iധ{w!u-^v]^oTv}Waid#_#.N?S|.8&M5DZ#(o<]S4vي`X3ܢ -X)Oͬw>+mq\g -?g8t nk _ўx3ݎ>M\8M Cv_ vLv5R/(:qZۮ v% wu߃'ǃiW -= N/VP0f~O;e{YiB6ܳ]Y;۵3gWrϡ/Wt)s -Um\{[V=RV4XיȨ{%Ude -"Y;=﮴iӵxZJHUMv.G;ڙMG2ofT -:W{czoNe7OvzP*BM<8n1vNb ަJym҃+ -yN7ln w;C[{BY)ݹû/Z|`(<=G!.PkR[u u^wv=y{)xPm)5oY퐥s{?$^9}jU@V0יHaײ@N+7tՁ)>P>* G\1%G@Iͻ=@gv'o:Ž1ҮD+=ҨU]#p/sjj`gok,7̥M V!,Z=*N_aHu=z5uybfoĐ iOYh߳9_Գ&O,/in -9g= ~}O󒿴yoqsz =VCKO󱿣A{Dc]~"oҕgN=ݡ$tUYҽp:OJy:{ϕz׉)=w>jǾ(ڒ-I>XÀ55B&x T%*ñDA?]۹2,rz:!Ӕ=n0ֵ|^>Ë8˺OI{gc]8=L4%sNzVu]g?I9谞+.~?"9MDw:O~N#46pzk.?!NaYx4u'N$MTu -}oFWvzgspG{OjVagt ?mLv=>[aK_Ü~`d 9g3\'X᭴;8j >Wb 5ؕH3\sSz/^pg;{P*=wy!cj׭Pou/p758ݛg3&z z)'kErg$p(*[o[n?ֺ^WO8S%1ԝ.65{W^oo61J%$6F$uE{H|ޑ{O#߯eDk9줽w%r/LO|\wһS5P#ݧD'x|)6&"[@Z.G9&GsI*=Frz˥mMnu]+p[UCXԯD,k>W/^@߰'_N # k>Ix,Ĺb3}"$$II/[n$Vܞ~=2feg͟H2YZ:k8襅GJ373e -Z[eZ:ʜe޲Pֲe.;R6XvTٲѲece [21$V-U\*.eL\!`uLRK#e;CL,cZZf;b-K͢X -Mlc/b'xv"KwKB 6cnVR4ꋞbMqrqjqzqfqVqvqNq^q~qAqJˋŵŖb[_.V4RxOG(>]|BXk7o/UqӢ{%bH5\Wk,rݒ񒔢%K,/YURXRR^RQRS4VR%VAi9=uju /v}1V V:~M*3h:־}h.chs9l6Oj:kYv]cfIkb7[a%.ԧsd Y~>M?_HDLWRAVoByEߡwWoEwGS~LKO??Yh$I]&sM֚5Ek -P[&oM>,~s|'_3re7opaabpVh+طj6hJ&`h² UuLXmZcWVTT *j! uU+꫖FYG-\}^"BSjUxMJ8TzKUE -U4܎LԯzO_IθWm2qe׫U[wK3ϓ)^]_j9岙3mVm̭^̼~Anrϟ7S_"z?_qq?7/ʣd=}QgٛTxTjeu ~Z?lJel@L:V9jL }WU_u&*U\RurYՕPAꪻ|FO_-zsWiVn\[5i8Fjo q8Aϣ>Q݃>o.g΍ })~#3ϳͽ3vVk {UI}թѺP?D4c }My18ØV4ΏO+EQleȸdVոυ -c.wu}ՕzsPyXJL-;b4DְVV7}Z)cYcsecX9jtFx^5zU9f U2ngQ9n]9a|b<``!8hH57O=wk/:W~yL~==o/'!_ϫzQk+;̷ _4?k)߯5\]7%3O=Pl9Hg/+ ~#9R Ƴ,㈡:p:3#%ИPuvd S!<9ONWE=Χp "LkT]^Z_QIE3|+W9|~ -8(?9փj6ձ_Kx/ #lUheUh)4=ޜ H)لwQU?IH"!"cH"/df2jIҀEH)""E*FK-UL5Rk)W#"\J "r1&Zs&DPj.goگg}9"iy2kK2KyKKnGg =Ò{ކm} (56ŧ -#ˈȑm8͈"0[鷍+#tݘ*Y]r3a!G-mfg׶j+ki]VY_rsecʝ{;@c7q"#+u/m7tpҚM+"MQtFnÑ}X̮ܮVVb|E~j%yHc[\:"Zʱ3bP;7+*gV6FI KwTn P:X|{."7KA#C*% Z_ŷ )MHu%i٥v`1 }r+V%_Bg9Ry@w}J#WY DvE35χhw;#ER2dK-|\8m})A{=ISÉx墇GSo-C^P?nG{WGXj1zY4^Y3:6:!:-4z{.$Di%ZѕUޒatm 7$[Rsv??x)4.ޔר_s^KjmS_%[`"[{G"YX@-D߈]N -Ε۫EU T )\uEdPUM9FGQVկjj妪(_CWTͬ]5jAbU=Q:Ꙫ5U^㕪׫DFWmQj_H,:Rx$W@<3όwNjEU[&U+}/ǪƇU\15 }WmoƬX0}FP{ V+u%+]ŵ}å5;'vurņF&R&bSbb3bŖFsd56غ=Uf ^D׾۬礬sA1=37v vX5SdXTe訬SYZS]UnU^UaU GTYm8Q(K'.MT2e꜈'.O\&1\jF|f㙑Qqb6R73?#1'1?Hإ:M͉A퉝8ιwścfDٛ-2d. Z8 -jQ˞]pÔ*)l9ʱ@r, 9cxQWʎ.9ʱC]rGʎ_ ^_S4RUFBCeu0$|}g] 3<0Xrl?ۿ"$=B)qSzMq)+P)qҪW/iRAeBG_(tO!V?ZGueeM *6wj;- [;/Ц/9yZM~'(C|0\¨?;D~Nvƿ/8}]_:p$LN'-u"ny/5}wmp.9S\TCx@[|=|YJ>c_ 86I7LBux_7kf10JXbEKP\+R* k% a$7ϋ^pLOmI%p+&N2$gymK8/nts.[<r +Fc'O..*x^swx=x9g:W*wMq)kxxcʱJ|]C.p87݆[;ƷJJC?П3 aP7?i[/ƹ5qF!am¹t Ν. -v6pAޢgoEI9Eㄇ~7 }M ^G_7: -G!_(|g7X chaQxAF| /pH2>BG-[&wP2]2g9J]eoeZzȷ^n f|SgOӯ;m4*rH7 979nMHz' FϘ :b{LQ*cKS44rnZֵ '-^轮VW+fhOhP(G6/jdXOZOJ޿~)ֳ̳exƕ2m2&C<ѩK_gqM]a.WFA_4 ]l PvR:l~w9T*߾Şz -M MyQ߭iSIOPYיSMQ_RVcA =4]_m`eSҧ6[//g@΀n1@9t2Jwi+YZ2G[X֣֣FFwҿ#=`D7(=`|D#;}R$ _ -uG>эKq5.0Ycr 2\||՘I+3RZL~*=ڒ-AzAOwzz==AO$=}%-A\p.ys/sv6V2y^F羊g_Vm [7{c -ٯT|k}N?gt;i X2db’ 6+} N6\hOiC{XꑹMN(;/+ښDjI˒~C RtOp&c -?촉04"+uyՂóFec)UdM˚!4'kN| -_c8z7M~W<;㐇B S'.kQSj 3;Mh)3[Bܵ_]M%SaovTRYl'/NZjSicf8sof%E9(qÒVf)o_^7̰Q/c{}fc" ؐݘ!nf۱0w2rm#s-1?yT<"~"?9S>bᔼ}uOs1<={Kyi{cGҮwvU:j*Tװץ(/##pd)|5xXtC;TӉ?xR2ٳLzgtF.3@Z uSˇ<ղTKw43^1u1r ?›U5/g3',i/e~h;KЧ=YKڞG*%њ-lSm}l9??l9J (2 >ξL/0j]< Я0"y3rzJI[vPƮ ЦڂvI@!0Oэ,QM;S k߰3-Q^ƗʛނӾRV-:6݂OimkXFNqNyum۔碹R^A-#kvNg Mk7ɜgZ̅:M-r; "%G-Gi:uf6W<5gCZ=;Kݪ9W.w|nhU*,a2,*KGz rO3d6~ɶ\i*cE: .WM\Y<ڷ1 u _2 -\O>ÕTvG/p3TrGsy&"tPٝi\qJݺݫEg؏X.žRZN+L:)mY-퟊|C0Ɏ(Φmﵵϲ -)q~L۶ܳ:4{#wE8 -eZe~n!L-ȾPќj?jqg49~It:tVtv97}Z-2֑l;7묣~.^K\G\sesZZd<-"wKngOX[GbmojXI=Iplk-]ƒbǜe\`QF,OoEVZ3i fmzb-~ߖ:f`M+UO[3rWv,Cy:sѿ y 3jΐJ~藶~/':O4K6gzu`f>q:+]=7s7ZDR-u@/&T0-^g5־~2Nʘ N (}** Pbc:>Yjq(r8mÔZ':*elr:QΚsmtrҫ %Z+iy*k K0y+\zfz  #k^շFV65(+:_mfʳ=5K|M(b \r4\3Eqr/8Ge6wl$6߇?c^ߟT^YV:X|!p<G?.0O@j؉!@3^Wa~(4VEn3G1JV :iyL(IK:>r_ l!`iǀ@?Kaq[vikyEoUX{Vw*Hv_jEg7xUhPLA1)W ҷ'Ы'П'з'KH;To!XCv,:|\BȋD0XNf6>%d"ʻ0a.H u`ìE~\F &7.0O@Z!u@3^Wa~(4En֪ ȝ|2f3̠ҫUiyؙ ǫ%ɠ= -nr-F>_ l!`i vR xU}Ka5jW+:[:Eb€;\1%߈| #;oego8)ZÐ{sv -V+X΄_=o+z!wm~Au-w;8 -E*u7jٶv28݀WGV,_m/]wɫy/5` Or+ќ@mw;'ñOc"w 2?D{D}-~ -{ez_i>} w ;=;)y;C߉= 4 r:Ct4ݱ5<nG$t?rF Z09ȹ`&[C,ם SUrsແ%AE; V>-ft!D>O|P1b| ;i {'h&g3}\{Wn@>L˺g/w$fM/ Pʦ&Pc?$i7,_"k/[ zoo:z<k;.y3%Zׁ9G_{MMWO O&rZQd2coܱ;=swW.BYUI^w26;{fԨʤQbQk2((٭\zZ=f\*7[ﱈ吤:(#N bz<َ?~0 QUAk}PB' )Fx@-@oЇ˴D^v*#W;豚[Sk-^^k!Qp3Z*vF2etW 4qysiÐ'gSw4jR -1k;6+YrEkEQz{&r #?~ZR -՟zub~tPzGU^-K4p=7+⚗M!^ksDjzff4oE-== &1_ (rk؉F+t YTb`vcDOV a~.N\-iV}ܧϾ%9]Gh?դAW|ScT}U~U_3BG򪶩;˛՚cgF+&ӣv7+uI:Ϊo A $wV-Gkx3[S-h{!yވyvƂ,w cg7אv~GsAWD} jy,:ޝy>k~5kq4]{J\Ý$vjy^9/B7g`sEu6܅6b/Ay!jې+Uo8X{;  SCl^A^_^o)&WƦr*VxVyfgY/R Nr E+=oG!|7f X :y%;QJt4uT߯Wk;Ao#˵`-cFz wS=&%U.:AdUlR<匂Fra,2r=5khvU3buG( V&$۳&-o$`|^gp<-> z|FA7 4<< J;)]FPLȷ -%Xx/"Gz-)/fG^7&2O3_foe_`bRpo|(;&O0o<cĸ1&'0eqo(7_{ηlfi"R) ut 64 vQQTPP{Dłb P츇݅ -o@ݙ|} &~+<3BO0 z ƳH0 #T8 \C  -˄$$.!W -[GH\.8sȸ!ӏCƕC vNdZG$!@Gm`;XD+#`wVѷAUbr*_K` q ` Vt0,ɯt_~+˯P~G+=_ɯ+ZE֢y[LޢQޢ&y^[Zޢ6y-z#o>ϒg'0|!ߐxɆq /*Ap'G:Ogʳy&37i'{$g_2ܺ*ɭZbCOq!/U'n Pj[ %9|Iʨ6\ÿ#ܺ'˭r^n=[cb!j MZx|<._|y } Kq2 W+@g~% -(~a\?$Q5\\K߉܋C11p ҁ(]J=7 lP@sh =̄`\p9̅k`̇Ep`~xo"[| \W+| [d̑ #7䁼C( E#Q8BqhJAd4 Bs\4-@h1A - -FkzmBQ!*FQ9BtE'YTj5tաz&Ԋ{ }%DM)Q*AiR)C'eL( ʊR6DQ)7jAP$%{%i>MbZViM;m@&9ж#L7=Cat=4KP٩.}` A3JvPpp. Dp>a6s e\{OAgJpa!,*Unjp' rX. tU -h}pC@ǀ<Omx:2Ѕ&Їw]`a=0Os/l- lm|S& {90GX/DXh`;rR<5F"_`PC``BQ(p@#F EHŢX+gv/P&IW4=I2wZO-^&-EKZ_~(傁h ZM@Cy mDAG`*@`0 F2TJT B^ E~0 {0@'Hta<:FK բZ0@7@ GAzh=15XԂZ@jCm C@>+ -ơ'H A% PBu:TJR)UJQ]`Ս)JL (0A)#LL(AR`*eNi%e S ŀ5e fR-E9R`6՛ P} r\\j5̣¨00CYT4 PiTX(TlHr@r, -ЈF VR ,ieBw+nt7֡u*ZtO'XM` mFm6 XO; C~t?v&ڋ6Ӂt (`PH"z$=lp@1GǁmtJq8cwqa/hm;kn%p<m%xހ}>,P/Bp1PQ"JEh -6Uأ"St BtMtգ'9z^7S< -Q -T'؈R]>EQFST,z"ه!-;ӪtWZ֥ i ZJN ݟ}hz=N#: kQ6@G4O4 MBD(WBW"W -DD$DhK.)]LtI2%KDԈ.u!Nt+% K݈.i]"MI(RwHDm1 jcHԦQDm1!jӋ)Q36Dm,X":&:`CtD&:Ї3}#:Jt?сD܈ :It7D $:Ot @ с >>>>"LLLB8p0pp(0ᄃ#G"M8N88p0p0p0p0p0p0p0p0p0pp,8D$dn0E 'EP&|#?Ț╓=pf8?p!åBG.?5nQ句O/olRCaal b͒[)ʭyrk/IzG,jǣcwWxƋ&a3Yk@V<|#vH>Ⱥ&ا:ܔt(; M['`u@\"+gކz.^ls㑷m4yC-A ^Jy|OyR0؉'djR>'0 -2S|MJlFL>OP b;hu _ &e >o>淋3*=/ K&)8dUmp mӲ4xIZZdL8D@KUe6!R,UbLppLtRJr;U'DLHMsKIKMIHOg3q񐄤T LvRq:Jm8HIfΞub$q?0hԘ)KvOvKHIs=@:Zړ1ݑ_QpLڤ&ga0|1?Ν'ZE>'=מqv ֹ~/׫?=q˹<ӻZ.Ŭ=[1,{gEqcTrmݛI^"_󐫋|s0=)sɭu[ׯ=!X1znc#ٔlwBs&3fܾ{b ~Fybj^3g;]v}>a,x}ۓ7oxPae]W$P+>szU؋&6zwb!LF1:RE@E*"ZaG|HPV3twgI_Uә a -?Ƨ#->==UTZeү~JIJZDOJ`%FI'bEa!!'2޿ ?˙ɓ1itFmoO͈U E"$dW7Zfv%Szh* .XP>||z?5ݳJLP4[)Saޏ*jF0dѕJ-^WԏIVRijRkTW[$ƯH|q0 u%%/^>*fWN;5MzޢU5 |tS)Q~'7?ޞ'3K6kWo~g2eyhftui.uTql_ut,$[eX2gTΘ670dex<:F/8!.1֎2{Id280b i}IE* -i~pg5OkEyjOgnb2Qw[ez'1$5e.XaQѼn/tLyH-3.C`qbz|JZBz3qZ[KlY5fMW -;mxX7&N=''պRsMkՕ?>WUuχL톊/Vo/)>7~6M\xuYw av<6_YR6!Mgr -nM ->c|GkFqsw'X&2W$z5f9/]2V}\Mdbp!eBGj~X@h)>w;0E2ݳ0v঩;|z^upv;9k~%eΧ_ -6#2**SJŠNg{`B)pK.<"zǂ&/ L7oL,sk=U>l+$2Ƌ(p+24ڬ b *LX¸j{pm?k¥z_$AgC/[<~4S,}|pзl|,][烡yMfjjmbjjVOڠI=V\0EKΈ -u/t-B7=ܭ߫˴Nu곖Eǫ͔c苊BcGj6]F#삝zx*mݵ_+uF_Yw^|%I.{yoL}xTkꖡ+)#>^'N/eaյE*σwبtW\T0}Ϻ]_f2WUcglyD8+fk@րW{&e*$iϖ6(?/Kw=-:Kjx`fW핅j|QL9euτ kJ:nqa2)!_oK[ߌ[`ŶaX &{ޛ ^i:}e'[?0JF@ίkKj3z-›!j XY.15M;֚-QQ=FM޾66qNscSsx\U6z׵W6y\uqYV3huLwÙM_fZIOU߉' |7U6[ joy%^j -2/O'H4(1<4NU>nͻb3:sZOKwbDJzBo[zY'9˙99-Q[#3S)\з|a1ϨtX+]t& ׿[>A*#h՝WO[vвNhIRKzA맺6 =kX^Vّ)o_k{p|Ux7wܹYc؛O}KY͇/W0HgS[v(lH=i8qꃅN, Rl 맾n^$Y9|∥vm X<뜝-'Zΐ VxdJLH^W{j>8ªAMRs˜qb^mEzR5#/tOl7?rmϭ3=Znw0xCIKƏtS;gO\?gg6 PYo#kXhd#|Dsh۶7]rlq:z CWu.7Puۉ^*)Y'hP 6,PX3*/F[VOٹ`Dͻ+N4.%\DAۼZ^{#/&%[2:Ers+^?ύ UxU~?!.n.` - J<ߛ/c?"9N8URj܀?R"hv2DRa(ͼ#);[͸46,Zʄ6 D4BrǂtB@Hũ8xQh4?$kHFjJ\ZDj|՟A&̼>C{lsѨ->#6Rk%nF -].h|O$Ei^yGE?>ڳC.޸*$*^hc$=E.O@o/uY\wnR߂|V3̩Yc3j?_t6dmR$9e˶pf},cˇ7<`GehMy=L$`VlWe{gx˿8oFѡO[0od{G4g)\_>9蒒?ެG3y{`-qvw97mA66]V9mWk āI2'Ŝ!{[gHգY$7a[]bϬl smdK}vDAzovQ;ԇh.MJawѻ#dzFU\}j٦-&>dw.Xw5ȡF,_)FFF掇"]od:wg4pưʮ3;G^\¹YXֵ'_L8w\>~ͩ!6u$}}Tdymwf| -endstream endobj 221 0 obj <> endobj 222 0 obj [250 0 408 500 500 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541] endobj 219 0 obj <> endobj 220 0 obj [250 0 0 500 0 1000 833 0 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 0 0 570 0 0 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 0 333 0 500 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444] endobj 213 0 obj <> endobj 10 0 obj <> endobj 132 0 obj <> endobj 142 0 obj <> endobj 152 0 obj <> endobj 162 0 obj <> endobj 172 0 obj <> endobj 182 0 obj <> endobj 192 0 obj <> endobj 202 0 obj <> endobj 193 0 obj <> endobj 194 0 obj <> endobj 195 0 obj <> endobj 196 0 obj <> endobj 197 0 obj <> endobj 198 0 obj <> endobj 199 0 obj <> endobj 200 0 obj <> endobj 201 0 obj <> endobj 183 0 obj <> endobj 184 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 187 0 obj <> endobj 188 0 obj <> endobj 189 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 173 0 obj <> endobj 174 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 177 0 obj <> endobj 178 0 obj <> endobj 179 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <> endobj 166 0 obj <> endobj 167 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 171 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 155 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 160 0 obj <> endobj 161 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <> endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 141 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 203 0 obj <> endobj 204 0 obj <> endobj 205 0 obj <> endobj 206 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> endobj 209 0 obj <> endobj 210 0 obj <> endobj 211 0 obj <> endobj 4 0 obj <> endobj xref -0 237 -0000000000 65535 f -0000000016 00000 n -0000000122 00000 n -0000003665 00000 n -0000187943 00000 n -0000003748 00000 n -0000011208 00000 n -0000003847 00000 n -0000003895 00000 n -0000005060 00000 n -0000182225 00000 n -0000005310 00000 n -0000005358 00000 n -0000005406 00000 n -0000005454 00000 n -0000005502 00000 n -0000005550 00000 n -0000005598 00000 n -0000005646 00000 n -0000005694 00000 n -0000005742 00000 n -0000005790 00000 n -0000005842 00000 n -0000005891 00000 n -0000005940 00000 n -0000005989 00000 n -0000006038 00000 n -0000006087 00000 n -0000006136 00000 n -0000006185 00000 n -0000006234 00000 n -0000006283 00000 n -0000006332 00000 n -0000006384 00000 n -0000006433 00000 n -0000006482 00000 n -0000006531 00000 n -0000006580 00000 n -0000006629 00000 n -0000006678 00000 n -0000006727 00000 n -0000006776 00000 n -0000006825 00000 n -0000006874 00000 n -0000006926 00000 n -0000006978 00000 n -0000007034 00000 n -0000007086 00000 n -0000007142 00000 n -0000007194 00000 n -0000007250 00000 n -0000007302 00000 n -0000007376 00000 n -0000007438 00000 n -0000007497 00000 n -0000007553 00000 n -0000007609 00000 n -0000007665 00000 n -0000007717 00000 n -0000007773 00000 n -0000007825 00000 n -0000007881 00000 n -0000007933 00000 n -0000008007 00000 n -0000008059 00000 n -0000008118 00000 n -0000008170 00000 n -0000008238 00000 n -0000008291 00000 n -0000008341 00000 n -0000008391 00000 n -0000008441 00000 n -0000008491 00000 n -0000008541 00000 n -0000008591 00000 n -0000008641 00000 n -0000008691 00000 n -0000008741 00000 n -0000008791 00000 n -0000008844 00000 n -0000008894 00000 n -0000008944 00000 n -0000008994 00000 n -0000009044 00000 n -0000009094 00000 n -0000009144 00000 n -0000009194 00000 n -0000009244 00000 n -0000009294 00000 n -0000009344 00000 n -0000009397 00000 n -0000009447 00000 n -0000009497 00000 n -0000009547 00000 n -0000009597 00000 n -0000009647 00000 n -0000009697 00000 n -0000009747 00000 n -0000009797 00000 n -0000009847 00000 n -0000009897 00000 n -0000009951 00000 n -0000010002 00000 n -0000010053 00000 n -0000010104 00000 n -0000010155 00000 n -0000010206 00000 n -0000010257 00000 n -0000010308 00000 n -0000010359 00000 n -0000010410 00000 n -0000010461 00000 n -0000010515 00000 n -0000010566 00000 n -0000010617 00000 n -0000010668 00000 n -0000010719 00000 n -0000010770 00000 n -0000010821 00000 n -0000010872 00000 n -0000010923 00000 n -0000010974 00000 n -0000011025 00000 n -0000186927 00000 n -0000186982 00000 n -0000187037 00000 n -0000187092 00000 n -0000187155 00000 n -0000187210 00000 n -0000187265 00000 n -0000187320 00000 n -0000187375 00000 n -0000182271 00000 n -0000186424 00000 n -0000186479 00000 n -0000186534 00000 n -0000186589 00000 n -0000186652 00000 n -0000186707 00000 n -0000186762 00000 n -0000186817 00000 n -0000186872 00000 n -0000182399 00000 n -0000185921 00000 n -0000185976 00000 n -0000186031 00000 n -0000186086 00000 n -0000186149 00000 n -0000186204 00000 n -0000186259 00000 n -0000186314 00000 n -0000186369 00000 n -0000182527 00000 n -0000185319 00000 n -0000185382 00000 n -0000185445 00000 n -0000185508 00000 n -0000185606 00000 n -0000185669 00000 n -0000185732 00000 n -0000185795 00000 n -0000185858 00000 n -0000182655 00000 n -0000184816 00000 n -0000184871 00000 n -0000184926 00000 n -0000184981 00000 n -0000185044 00000 n -0000185099 00000 n -0000185154 00000 n -0000185209 00000 n -0000185264 00000 n -0000182783 00000 n -0000184313 00000 n -0000184368 00000 n -0000184423 00000 n -0000184478 00000 n -0000184541 00000 n -0000184596 00000 n -0000184651 00000 n -0000184706 00000 n -0000184761 00000 n -0000182911 00000 n -0000183810 00000 n -0000183865 00000 n -0000183920 00000 n -0000183975 00000 n -0000184038 00000 n -0000184093 00000 n -0000184148 00000 n -0000184203 00000 n -0000184258 00000 n -0000183039 00000 n -0000183297 00000 n -0000183353 00000 n -0000183409 00000 n -0000183465 00000 n -0000183530 00000 n -0000183586 00000 n -0000183642 00000 n -0000183698 00000 n -0000183754 00000 n -0000183168 00000 n -0000187430 00000 n -0000187486 00000 n -0000187542 00000 n -0000187598 00000 n -0000187663 00000 n -0000187719 00000 n -0000187775 00000 n -0000187831 00000 n -0000187887 00000 n -0000011079 00000 n -0000182102 00000 n -0000011475 00000 n -0000020397 00000 n -0000020577 00000 n -0000020752 00000 n -0000020889 00000 n -0000181499 00000 n -0000181739 00000 n -0000180869 00000 n -0000181104 00000 n -0000093439 00000 n -0000093466 00000 n -0000021031 00000 n -0000021058 00000 n -0000021584 00000 n -0000021755 00000 n -0000021825 00000 n -0000022083 00000 n -0000022535 00000 n -0000094042 00000 n -0000094208 00000 n -0000094278 00000 n -0000094531 00000 n -0000095164 00000 n -trailer -<]>> -startxref -188146 -%%EOF diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/A20622A izRMS (CZ) fRR Part B9_Page185.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/A20622A izRMS (CZ) fRR Part B9_Page185.pdf deleted file mode 100644 index 57ee3212..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/A20622A izRMS (CZ) fRR Part B9_Page185.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/A20622A izZRMS (CZ) fRR Part B7_Page123.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/A20622A izZRMS (CZ) fRR Part B7_Page123.pdf deleted file mode 100644 index 5fc640b4..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/A20622A izZRMS (CZ) fRR Part B7_Page123.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/Thiabendazole DAR Addendum for ED_April_2020_Page18.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/Thiabendazole DAR Addendum for ED_April_2020_Page18.pdf deleted file mode 100644 index 893d358a..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/SinglePages/Thiabendazole DAR Addendum for ED_April_2020_Page18.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Trinexapac/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Trinexapac/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23.pdf deleted file mode 100644 index 6373e776..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Trinexapac/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/image_response.json b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/image_response.json deleted file mode 100644 index dd6f37f5..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/image_response.json +++ /dev/null @@ -1,686 +0,0 @@ -{ - "dossierId": "f889853e-4bf8-49a9-aae5-c38605c6ef40", - "fileId": "22ef63e29bb2a27db8497272336f6b32", - "data": [ - { - "classification": { - "probabilities": { - "logo": 1.0, - "signature": 0.0, - "other": 0.0, - "formula": 0.0 - }, - "label": "logo" - }, - "position": { - "x1": 89.88, - "x2": 274.20000000000005, - "y1": 716.24, - "y2": 770.0, - "pageNumber": 1 - }, - "geometry": { - "width": 184.32000000000005, - "height": 53.75999999999999 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.14298074612038092, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 3.42857142857143, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "signature": 0.999968, - "logo": 1.6e-05, - "other": 1.6e-05, - "formula": 0.0 - }, - "label": "signature" - }, - "position": { - "x1": -0.10000600000000001, - "x2": 595.099994, - "y1": -0.07998660000000002, - "y2": 842.0800134, - "pageNumber": 3 - }, - "geometry": { - "width": 595.2, - "height": 842.16 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 1.0000782051152328, - "tooLarge": true, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.706754060986036, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": false - } - }, - { - "classification": { - "probabilities": { - "signature": 0.999872, - "other": 7.9e-05, - "logo": 4.8e-05, - "formula": 0.0 - }, - "label": "signature" - }, - "position": { - "x1": -0.10000600000000001, - "x2": 595.099994, - "y1": -0.07998660000000002, - "y2": 842.0800134, - "pageNumber": 7 - }, - "geometry": { - "width": 595.2, - "height": 842.16 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 1.0000782051152328, - "tooLarge": true, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.706754060986036, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": false - } - }, - { - "classification": { - "probabilities": { - "signature": 0.996366, - "other": 0.00, - "logo": 2.3e-05, - "formula": 4e-06 - }, - "label": "signature" - }, - "position": { - "x1": -0.10000600000000001, - "x2": 595.099994, - "y1": -0.07998660000000002, - "y2": 842.0800134, - "pageNumber": 8 - }, - "geometry": { - "width": 595.2, - "height": 842.16 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 1.0002630764355351, - "tooLarge": true, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.706754060986036, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": false - } - }, - { - "classification": { - "probabilities": { - "signature": 0.999772, - "logo": 0.000131, - "other": 9.7e-05, - "formula": 0.0 - }, - "label": "signature" - }, - "position": { - "x1": 82.59443842482001, - "x2": 512.6365568843402, - "y1": 116.943736387567, - "y2": 725.0718450317352, - "pageNumber": 73 - }, - "geometry": { - "width": 430.04211845952017, - "height": 608.1281086441682 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.72236755521117, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.7071571143427432, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "signature": 1.0, - "logo": 0.0, - "other": 0.0, - "formula": 0.0 - }, - "label": "signature" - }, - "position": { - "x1": 328.20483600000006, - "x2": 393.94460940000005, - "y1": 175.1643178, - "y2": 203.92865619999998, - "pageNumber": 81 - }, - "geometry": { - "width": 65.73977339999999, - "height": 28.764338399999986 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.06142518774572455, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 2.2854609929078022, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "signature": 1.0, - "logo": 0.0, - "other": 0.0, - "formula": 0.0 - }, - "label": "signature" - }, - "position": { - "x1": 136.5955818, - "x2": 224.72461859999999, - "y1": 175.1133172, - "y2": 203.97965680000001, - "pageNumber": 81 - }, - "geometry": { - "width": 88.1290368, - "height": 28.866339600000003 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.07124601312700823, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 3.053003533568904, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "logo": 1.0, - "signature": 0.0, - "other": 0.0, - "formula": 0.0 - }, - "label": "logo" - }, - "position": { - "x1": 194.99126880000003, - "x2": 399.80967840000005, - "y1": 554.6597824, - "y2": 686.2413304, - "pageNumber": 81 - }, - "geometry": { - "width": 204.81840960000002, - "height": 131.581548 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.23189275858788796, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 1.5565891472868219, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "other": 1.0, - "signature": 0.0, - "formula": 0.0, - "logo": 0.0 - }, - "label": "other" - }, - "position": { - "x1": 133.9945512, - "x2": 242.52382799999998, - "y1": 411.24609519999996, - "y2": 523.2434128, - "pageNumber": 90 - }, - "geometry": { - "width": 108.52927679999999, - "height": 111.99731760000003 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.15573364968831904, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.9690346083788703, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "other": 1.0, - "signature": 0.0, - "formula": 0.0, - "logo": 0.0 - }, - "label": "other" - }, - "position": { - "x1": 133.5865464, - "x2": 242.3198256, - "y1": 274.972492, - "y2": 387.7858192, - "pageNumber": 90 - }, - "geometry": { - "width": 108.7332792, - "height": 112.8133272 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.15644678522591335, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.9638336347197106, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "other": 1.0, - "signature": 0.0, - "formula": 0.0, - "logo": 0.0 - }, - "label": "other" - }, - "position": { - "x1": 246.19587120000003, - "x2": 356.5611696, - "y1": 400.84197279999995, - "y2": 519.3673672, - "pageNumber": 90 - }, - "geometry": { - "width": 110.3652984, - "height": 118.52539440000004 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.1615575178049721, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.9311531841652321, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "other": 1.0, - "signature": 0.0, - "formula": 0.0, - "logo": 0.0 - }, - "label": "other" - }, - "position": { - "x1": 244.9718568, - "x2": 358.3971912, - "y1": 274.972492, - "y2": 387.7858192, - "pageNumber": 90 - }, - "geometry": { - "width": 113.4253344, - "height": 112.8133272 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.15978662903260646, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 1.0054249547920433, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "other": 1.0, - "signature": 0.0, - "formula": 0.0, - "logo": 0.0 - }, - "label": "other" - }, - "position": { - "x1": 254.9679744, - "x2": 371.6573472, - "y1": 439.6024288, - "y2": 564.0438928, - "pageNumber": 91 - }, - "geometry": { - "width": 116.6893728, - "height": 124.441464 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.17021718544102565, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.9377049180327869, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "other": 1.0, - "signature": 0.0, - "formula": 0.0, - "logo": 0.0 - }, - "label": "other" - }, - "position": { - "x1": 133.9945512, - "x2": 249.663912, - "y1": 443.07046959999997, - "y2": 687.2613424, - "pageNumber": 91 - }, - "geometry": { - "width": 115.66936080000002, - "height": 244.19087280000002 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.23739910530627284, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.4736842105263158, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "other": 1.0, - "signature": 0.0, - "formula": 0.0, - "logo": 0.0 - }, - "label": "other" - }, - "position": { - "x1": 105.84222, - "x2": 374.870385, - "y1": 526.40545, - "y2": 687.05734, - "pageNumber": 92 - }, - "geometry": { - "width": 269.028165, - "height": 160.65188999999998 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.2936614851112628, - "tooLarge": false, - "tooSmall": false - }, - "imageFormat": { - "quotient": 1.6746031746031749, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": true - } - }, - { - "classification": { - "probabilities": { - "logo": 0.788068, - "other": 0.152259, - "formula": 0.036883, - "signature": 0.02279 - }, - "label": "logo" - }, - "position": { - "x1": 44.64999049990001, - "x2": 550.5759424999001, - "y1": 63.286004150029996, - "y2": 778.72242095003, - "pageNumber": 94 - }, - "geometry": { - "width": 505.92595200000005, - "height": 715.4364168000001 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.8498341845521462, - "tooLarge": true, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.7071571143427431, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": false - } - }, - { - "classification": { - "probabilities": { - "signature": 0.998335, - "logo": 0.000955, - "other": 0.000703, - "formula": 7e-06 - }, - "label": "signature" - }, - "position": { - "x1": 58.954005540029996, - "x2": 536.45979618003, - "y1": 83.94401504006001, - "y2": 758.05854296006, - "pageNumber": 95 - }, - "geometry": { - "width": 477.50579064000004, - "height": 674.11452792 - }, - "filters": { - "geometry": { - "imageSize": { - "quotient": 0.8014221863697041, - "tooLarge": true, - "tooSmall": false - }, - "imageFormat": { - "quotient": 0.7083452007974936, - "tooTall": false, - "tooWide": false - } - }, - "probability": { - "unconfident": false - }, - "allPassed": false - } - } - ] -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl index 862af6b7..58c30a48 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,21 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -34,14 +34,17 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility; +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..032804b9 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,5 @@ +rootProject.name = "redaction-service" +include(":redaction-service-api-v1") +include(":redaction-service-server-v1") +project(":redaction-service-api-v1").projectDir = file("redaction-service-v1/redaction-service-api-v1") +project(":redaction-service-server-v1").projectDir = file("redaction-service-v1/redaction-service-server-v1")